Фильтрация DataGridView, который не имеет привязки данных

Даже если необходимо использовать 4 байта для хранения перечисления (я не настолько знаком с C++ - я знаю, что можно указать базовый тип в C#), это все еще стоит того - используют перечисления.

В этот день и возраст серверов с ГБ памяти, вещи как 4 байта по сравнению с 1 байтом памяти на прикладном уровне в целом не имеют значения. Конечно, если в Вашей конкретной ситуации, использование памяти настолько важно (и Вы не можете заставить C++ использовать байт для поддержки перечисления), затем можно считать 'статическую константу' маршрутом.

В конце дня, необходимо ли спросить себя, действительно ли это стоит хита обслуживания использования 'статической константы' для 3 байтов сбережений памяти для Вашей структуры данных?

Что-то еще для учета - IIRC, на x86, структуры данных составляют выровненные 4 байта, поэтому если у Вас нет многих элементов ширины байта в Вашей 'рекордной' структуре, он не мог бы на самом деле иметь значения. Протестируйте и удостоверьтесь, что это делает перед созданием компромисса в пригодности для обслуживания для производительности/пространства.

6
задан Dan Neely 10 August 2009 в 15:36
поделиться

2 ответа

У меня была эта проблема несколько лет назад (до того, как я узнал о привязках данных), и я нашел сообщение об ошибке в Microsoft, в котором говорилось, что это подтверждено, но проблема, вероятно, не будет исправлена.

Однако есть несколько возможностей решить эту проблему.

  1. Вместо добавления строк в 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 = "Имя как '...'";
    
  2. Создайте класс, который наследуется от BindingList и реализует IBindingList. Затем привяжите его к вашему DataGridView.

  3. Установите для DataGridView VirtualMode значение true.

Второй метод более сложен, потому что вам нужно добавить свою собственную логику для реализации метода FindCore.

И вы должны посмотреть здесь: http://social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/thread/68c8b93e-d273-4289-b2b0-0e9ea644623a

8
ответ дан 8 December 2019 в 17:25
поделиться

общая производительность должна значительно повыситься, если вы временно удалите строки из dataGridView во время фильтрации.

  1. Создайте приложение для Windows Forms
  2. Перетащите DataGridView и четыре кнопки в форму
  3. Скопируйте и вставьте этот код (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 rows = new List (); foreach (строка DataGridViewRow в dataGridView1.Rows) { rows.Add (строка); } dataGridView1.Rows.Clear (); foreach (строка DataGridViewRow в строках) row.Visible = true; dataGridView1.Rows.AddRange (rows.ToArray ()); watch.Stop (); MessageBox.Show (смотреть.ElapsedMilliseconds.ToString ()); } // добавляем фильтр (улучшено) private void button4_Click (отправитель объекта, EventArgs e) { watch.Reset (); watch.Start (); List rows = new List (); foreach (строка DataGridViewRow в dataGridView1.Rows) { rows.Add (строка); } dataGridView1.Rows.Clear (); foreach (строка DataGridViewRow в строках) { if (Convert.ToInt32 (row.Cells [1] .Value)% 2! = 0) { row.Visible = false; } } dataGridView1.Rows.AddRange (rows.ToArray ()); watch.Stop (); MessageBox.Show (смотреть.ElapsedMilliseconds.ToString ()); } }

6
ответ дан 8 December 2019 в 17:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: