Вот пример короткого кода, чтобы вы могли проверить требования к памяти и производительность ваших элементов управления. Я не понимаю, что вы должны делать, чтобы избежать растровых изображений, я думаю, что большинство сторонних элементов управления работают аналогичным образом. Я уверен, что мой код можно оптимизировать несколькими способами, но у вас есть с чего начать. Не уверенный, когда кто-то захочет иметь 20000 строк в сетке, ни один пользователь не сможет увидеть все это в любом случае. Возможно, можно найти способ показывать подмножества одновременно??
Создание изображения, вероятно, следует выполнять не в тестовом объекте (так как это модель данных), а в уровне представления (я добавил событие DataBindingComplete, так как его можно использовать для похожих вещей), я сделал это здесь, потому что это было проще. Изображения не сохраняются в файл или что-либо подобное.
Я создал форму с DataGridView под названием dataGridView1.
Это код для формы:
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;
}
Я также создал тест-объект для заполнения сетки:
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;
}
}
}