2016-12-21 2 views
0

У нас есть приложение на основе C# Windows Forms, где есть панель (для контактов), которая содержит несколько элементов управления (таких как имя, идентификатор, телефон и т. Д.) Под ним. Мы добавили текстовый поиск (с именем, идентификатором, телефоном и т. Д.), Чтобы отобразить любое подходящее управление контактами путем циклического (для цикла) через каждый элемент управления.Самый быстрый способ найти контроль соответствия текста в коллекции управления

Это хорошо работает, но если у нас больше контактов (скажем, более 100 и более 100 панелей), это занимает больше времени. Есть ли альтернативный подход для ускорения поиска в этом случае?

EDIT:

Вот код ниже

Filter(Control Pls, string search) 
{ 
    foreach (Control ctrl in Pls.Controls) 
    { 
     var Name = ctrl.Controls.Find("name", true); 
     if ((Name != null) && (Name.Length != 0)) 
     { 
      Label n = (Label)Name[0]; 
      contactName = n.Text; 
     } 

     var Extn = ctrl.Controls.Find("extn", true); 
     if ((Extn != null) && (Extn.Length != 0)) 
     { 
      Label e = (Label)Extn[0]; 
      contactExtn = e.Text; 
     } if (contactName != null && contactExtn != null) 
     { 
       if (contactName.Contains(search) || contactExtn.Contains(search)) 
       { 
        ctrl.Show(); 
       } 
       else 
       { 
        ctrl.Hide(); 
       } 
     } 
     else 
     { 
      ctrl.Hide(); 
     } 
    } 
} 
+0

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

+0

Я не могу вырваться из цикла, так как мне пришлось отображать все соответствующие контакты. – rajkumaradass

+0

Вы пробовали linq? –

ответ

0

Прежде всего позвольте мне описать мое понимание ситуации. Я предполагаю, что

  1. контактов хранятся таблицы реляционной базы данных, скажем, TContacts
  2. Для каждого согласующего контакта найден в TContacts, вы хотите, чтобы отобразить панели за согласованную строку в таблице TContacts
  3. Каждой панель, (скажем, Р1, Р2, ...) имеет множество элементов управления для отображения столбцов-значения согласованного ряда

Если мое понимание правильно, то решение, как в:

  1. Используйте переменную DataTable (например, VContacts) для хранения всех строк таблицы TContacts.
  2. Добавьте один столбец (например, PanelName) строки типа выше в DataTable VContacts.
  3. Хранить имя соответствующего элемента управления панели для каждого контакта в столбце Имя панели.
  4. Использование DataTable.Select() метод, чтобы выяснить, совпадающая контакты
  5. Затем используйте значение PanelName и выяснить, панели управления, используйте Show() метод для отображения панели управления и скрыть остальные панели управления

ПРИМЕЧАНИЕ: Если вы не используете какую-либо базу данных, вам необходимо заполнить DataTable VContacts через код.

+0

Я не использую базу данных здесь. – rajkumaradass

Смежные вопросы