Даже если необходимо использовать 4 байта для хранения перечисления (я не настолько знаком с C++ - я знаю, что можно указать базовый тип в C#), это все еще стоит того - используют перечисления.
В этот день и возраст серверов с ГБ памяти, вещи как 4 байта по сравнению с 1 байтом памяти на прикладном уровне в целом не имеют значения. Конечно, если в Вашей конкретной ситуации, использование памяти настолько важно (и Вы не можете заставить C++ использовать байт для поддержки перечисления), затем можно считать 'статическую константу' маршрутом.
В конце дня, необходимо ли спросить себя, действительно ли это стоит хита обслуживания использования 'статической константы' для 3 байтов сбережений памяти для Вашей структуры данных?
Что-то еще для учета - IIRC, на x86, структуры данных составляют выровненные 4 байта, поэтому если у Вас нет многих элементов ширины байта в Вашей 'рекордной' структуре, он не мог бы на самом деле иметь значения. Протестируйте и удостоверьтесь, что это делает перед созданием компромисса в пригодности для обслуживания для производительности/пространства.
У меня была эта проблема несколько лет назад (до того, как я узнал о привязках данных), и я нашел сообщение об ошибке в Microsoft, в котором говорилось, что это подтверждено, но проблема, вероятно, не будет исправлена.
Однако есть несколько возможностей решить эту проблему.
Вместо добавления строк в datagridview, добавьте строки в datatable и привяжите его к datagridview.
DataTable table = new DataTable ();
table.Columns.Add ("Имя", typeof (String));
table.Columns.Add ("...", typeof (String));
foreach (элемент var в списке)
table.Rows.Add (element.Name, element.Something);
dataGridView1.DataSource = table1;
table.DefaultView.RowFilter = "Имя как '...'";
Создайте класс, который наследуется от BindingList и реализует IBindingList. Затем привяжите его к вашему DataGridView.
Установите для DataGridView VirtualMode значение true.
Второй метод более сложен, потому что вам нужно добавить свою собственную логику для реализации метода FindCore.
И вы должны посмотреть здесь: http://social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/thread/68c8b93e-d273-4289-b2b0-0e9ea644623a
общая производительность должна значительно повыситься, если вы временно удалите строки из dataGridView во время фильтрации.
Скопируйте и вставьте этот код (don '
{
общедоступная форма Form1 ()
{
InitializeComponent ();
}
частный секундомер = новый секундомер ();
private void Form1_Load (отправитель объекта, EventArgs e)
{
// заполняем dataGridView
для (int я = 0; я <10000; я ++)
dataGridView1.Rows.Add ("Столбец", i + 1, 10000 - i);
для (int i = 0; i <10000; i = i + 2)
dataGridView1.Rows [i] .DefaultCellStyle.BackColor = Color.Red;
}
// удалить фильтр
private void button1_Click (отправитель объекта, EventArgs e)
{
watch.Reset ();
watch.Start ();
foreach (строка DataGridViewRow в dataGridView1.Rows)
row.Visible = true;
watch.Stop ();
MessageBox.Show (смотреть.ElapsedMilliseconds.ToString ());
}
// добавляем фильтр (скрываем все нечетные строки)
private void button2_Click (отправитель объекта, EventArgs e)
{
watch.Reset ();
watch.Start ();
foreach (строка DataGridViewRow в dataGridView1.Rows)
{
if (Convert.ToInt32 (row.Cells [1] .Value)% 2! = 0)
row.Visible = false;
}
watch.Stop ();
MessageBox.Show (смотреть.ElapsedMilliseconds.ToString ());
}
// удалить фильтр (улучшено)
private void button3_Click (отправитель объекта, EventArgs e)
{
watch.Reset ();
watch.Start ();
List