コントロールのメモリ要件とパフォーマンスをテストできるように、短いコード例を次に示します。ビットマップを回避するために何をすべきかわかりませんが、ほとんどのサードパーティのコントロールは同様の方法で機能すると思います。私のコードはいくつかの方法で最適化できると確信していますが、最初にいくつかの方法があります。いつグリッドに 20000 行が必要になるかはわかりませんが、ユーザーはそれをすべて見ることはできません。おそらく、一度にサブセットを表示する方法を見つけることができます..?
イメージの作成は、おそらくテスト オブジェクト (データ モデルであるため) ではなく、プレゼンテーション レイヤーで行う必要があります (これは同様の目的で使用できるため、DataBindingComplete イベントを追加しました)。簡単でした。画像はファイルなどに保存されません。
dataGridView1 という DataGridView を使用してフォームを作成しました。
これはフォームのコードです:
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;
}
}
}