Oto krótki przykład kodu, aby przetestować wymagania dotyczące pamięci i wydajności kontrolek. Nie widzę, co powinieneś zrobić, aby uniknąć map bitowych, myślę, że większość kontrolerów zewnętrznych działa w podobny sposób. Jestem pewien, że mój kod można zoptymalizować na kilka sposobów, ale na początek masz kilka. Nie wiem, kiedy chciałoby się mieć 20000 wierszy w siatce, ale i tak żaden użytkownik nie może tego zobaczyć. Być może można wymyślić sposób, aby pokazać podzestawy na raz ..?
Najprawdopodobniej nie należy tworzyć obrazu w obiekcie testowym (ponieważ jest to model danych), ale raczej w warstwie prezentacji (dodałem zdarzenie DataBindingComplete, ponieważ można to wykorzystać do podobnych czynności). to tutaj, ponieważ było łatwiej. Żadne obrazy nie są zapisywane do pliku lub coś w tym stylu.
Utworzono formularz z DataGridView o nazwie dataGridView1.
Jest to kod dla formularza:
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;
}
I stworzył także test-Object zapełnić siatkę:
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 lub ... –
Robię aplikacją tj WinForms –
WPF, Silverlight i konsola są również aplikacje desktopowe. –