Ecco un esempio di codice breve, solo per testare i requisiti di memoria e le prestazioni dei controlli. Non vedo che cosa dovresti fare per evitare le bitmap, penso che la maggior parte dei controlli di terze parti funzioni in modo simile. Sono sicuro che il mio codice può essere ottimizzato in diversi modi, ma ne hai alcuni per cominciare. Non sono sicuro quando uno vorrebbe avere 20000 righe in una griglia, nessun utente può vedere tutto ciò comunque. Forse uno può capire un modo per mostrare sottoinsiemi alla volta ..?
Probabilmente la creazione dell'immagine non dovrebbe essere eseguita nell'oggetto di prova (come nel modello di dati) ma piuttosto nel livello di presentazione (ho aggiunto l'evento DataBindingComplete in quanto può essere utilizzato per cose simili), l'ho fatto che qui perché era più facile. Nessuna immagine è salvata su file o qualcosa del genere.
Ho creato un modulo con un DataGridView chiamato dataGridView1.
Questo è il codice per la forma:
List<TestObject> _list = new List<TestObject>();
public Form1()
{
InitializeComponent();
dataGridView1.DataBindingComplete += new DataGridViewBindingCompleteEventHandler(dataGridView1_DataBindingComplete);
}
void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
}
private void Form1_Load(object sender, EventArgs e)
{
// Populate the grid, here you should add as many rows as you want to display
_list.Add(new TestObject("Obj1", 20, Brushes.Red, new int[]{3,4,5,3,5,6}));
_list.Add(new TestObject("Obj2", 10, Brushes.Green, new int[] { 1, 2, 3, 4, 5, 6 }));
_list.Add(new TestObject("Obj3", 30, Brushes.Blue, new int[] { 3, 2, 1, 1, 2, 3 }));
dataGridView1.DataSource = _list;
}
ho anche creato un test-oggetto per popolare la griglia:
public class TestObject
{
private const int BitmapWidth = 100;
private const int BitmapHeight = 20;
private System.Drawing.Brush _color;
private string _name;
private int[] _numbers;
private int _value;
public TestObject(string name, int value, System.Drawing.Brush color, int[] series)
{
_name = name;
_numbers = series;
_color = color;
_value = value;
}
public string Name
{
get { return _name; }
}
public string Value { get { return _value.ToString(); } }
public Image Series
{
get
{
int width = BitmapWidth/_numbers.Length - _numbers.Length;
System.Drawing.Bitmap b = new Bitmap(BitmapWidth, BitmapHeight);
Graphics g = Graphics.FromImage(b);
g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
int current = 0;
for (int i = 0;i < _numbers.Length;i++)
{
g.FillRectangle(_color, current, BitmapHeight - (BitmapHeight/10) * _numbers[i], width, (BitmapHeight/10) * _numbers[i]);
current+=width + 2;
}
return b;
}
}
}
WinForms, WPF o ... –
sto facendo un'applicazione desktop cioè WinForms –
WPF, Silverlight e Console sono anche applicazioni desktop. –