在控件集合中查找文本匹配控件的最快方法

时间:2016-12-21 06:42:14

标签: c# winforms controls

我们有一个基于C#Windows Forms的应用程序,其中有一个面板(用于联系人),它包含多个控件(如名称,ID,电话等)。我们添加了一个文本搜索(带有名称,ID,电话等),通过循环(for循环)通过每个控件显示任何匹配的联系人控件。

这很好用,但是如果我们有更多的联系人(比如超过100个,即总共100个面板),则需要更多时间。在这种情况下,是否有其他方法可以加快搜索速度?

修改

以下是代码

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();
        } 
    } 
}

1 个答案:

答案 0 :(得分:0)

首先让我描述一下我对你情况的理解。我认为

  1. 您有联系人存储关系数据库表,比如TContacts
  2. 对于在TContacts中找到的每个匹配联系人,您要显示一个 表格中的每个匹配行的面板TContacts
  3. 每个面板(比如P1,P2,...)都有一组控件来显示匹配的列值 行
  4. 如果我的理解是正确的,那么解决方案如下:

    1. 使用DataTable变量(比如说VContacts)来存储TContacts表的所有行。
    2. 将一个string类型(比如PanelName)添加到DataTable VContacts上面。
    3. 在PanelName列中为每个联系人存储相应面板控件的名称。
    4. 使用DataTable.Select()方法查找匹配的联系人
    5. 然后使用PanelName值并找出面板控件,使用Show()方法显示面板控件并隐藏面板控件的其余部分
    6. 注: 如果您没有使用任何数据库,则需要通过代码填充DataTable VContacts。