Aquí hay un ejemplo de código corto, solo para que pueda probar los requisitos de memoria y el rendimiento de sus controles. No veo lo que debes hacer para evitar bitmaps, creo que la mayoría de los controles de terceros funcionan de manera similar. Estoy seguro de que mi código puede optimizarse de varias maneras, pero tiene algunas para empezar. No estoy seguro de cuándo desearía tener 20000 filas en una grilla, ningún usuario puede ver todo eso de todos modos. Tal vez uno puede encontrar una manera de mostrar subconjuntos a la vez ..?
La creación de la imagen probablemente no debería hacerse en el objeto de prueba (como es el modelo de datos) sino en la capa de presentación (agregué el evento DataBindingComplete ya que puede usarse para cosas similares), lo hice eso aquí porque era más fácil. No se guardan imágenes en el archivo ni nada de eso.
Creé un formulario con un DataGridView llamado dataGridView1.
Este es el código para el formulario:
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;
}
También creé un objeto de prueba para rellenar la cuadrícula:
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;
}
}
}
Windows Forms, WPF o ... –
estoy haciendo una aplicación de escritorio de Windows Forms es decir –
WPF, Silverlight y la consola son también las aplicaciones de escritorio. –