如何执行提前Listview搜索

时间:2016-09-07 08:35:12

标签: c# winforms listview search

使用Windows表单,我的'listview'有多个列,如图所示。

enter image description here

我一直在尝试将此txtbox_search推进。当插入任何字符,单词或数字时,我希望遍历listview的某些列以查找字符,单词,数字并显示与输入相关的数据。

当我输入时:txtbox_search.Text =“a”

它应该遍历列“名称”并用数据填充Listview:

整个行的名称以“a”开头,例如“Anwar”

整个行的名称以“a”开头,例如“Anas”

以整个行的名称以“A ...”开头

当我输入:txtbox_search.Text =“1”

它应该遍历列“ID”并用数据填充Listview:

具有以“1”开头的ID的整行,例如“1002”

具有以“1”开头的ID的整行,例如“1112”

以整个行的ID为“1 ...”

到目前为止,我已经尝试了2天并最终得到了这么多:

private void textBox_DEC_Search_TextChanged(object sender, EventArgs e)
{
    foreach(ListViewItem Items in listView_DEC_CustomerList.Items)
    {
        if(Items.Text == textBox_DEC_Search.Text)
        {
            listView_DEC_CustomerList.Items.Clear();
            listView_DEC_CustomerList.Items.Add(Items);
        }
    }
    if(textBox_DEC_Search.Text == "" || textBox_DEC_Search.Text == string.Empty)
    {
        CusList Cus = new CusList();
        Cus.CustomersList(listView_DEC_CustomerList);
    }
}

此代码仅遍历第一列并显示与插入的ID匹配的数据,仅当完整ID与txtbox_search.Text匹配时,如何才能实现此目的? (我希望它在客户端,而不是从sql / database)。我们非常感谢指南和示例代码帮助。感谢。

2 个答案:

答案 0 :(得分:1)

要区分您的2个标准,您可以使用以下内容:

if (textBox_DEC_Search.Text.All(x => Char.IsNumber(x)))
{
    Debug.WriteLine("Number");
    // search through ID
}
else
{
    Debug.WriteLine("Name");
    // search through Name
}

它基本上检查您的输入是否仅为数字。

编辑:

为了检查相似性,您可以使用String.StartsWithString.Contains来使搜索更加灵活

查找您需要访问子项的ID或NAME!

因为ID是您的第一个列检查SubItems[0]

if(Items.SubItems[0].Text.StartsWith(textBox_DEC_Search.Text) || 
   Items.SubItems[0]Text.Contains(textBox_DEC_Search.Text))

因为NAME是您的第二列检查SubItems[1]

if(Items.SubItems[1].Text.StartsWith(textBox_DEC_Search.Text) || 
   Items.SubItems[1]Text.Contains(textBox_DEC_Search.Text))

一个问题是这一行:

listView_DEC_CustomerList.Items.Clear();

因为它会在找到第二个结果时删除第一个找到的结果。 因此,如果您找到10个匹配项,则之前的9个将被删除! 我建议首先进行整个搜索,然后添加结果,如果有的话:

private void textBox_DEC_Search_TextChanged(object sender, EventArgs e)
{
    // index is 0 if numeric for ID or 1 if not for NAME
    int ind = textBox_DEC_Search.Text.All(x => Char.IsNumber(x)) ? 0 : 1;


    List<ListViewItem> matchlist = new List<ListViewItem>();

    foreach(ListViewItem Items in listView_DEC_CustomerList.Items)
    {
        if(Items.SubItems[ind].Text.StartsWith(textBox_DEC_Search.Text) || 
          Items.SubItems[ind]Text.Contains(textBox_DEC_Search.Text))            
        {
            matchlist.Add(Items);
        }
    }

    // if you have found something add the all results
    if(matchlist.Any())            
    {
        listView_DEC_CustomerList.Items.Clear();
        listView_DEC_CustomerList.Items.AddRange(matchlist.ToArray());
    }
}

免责声明:虽然这个解决方案可行,但我会投票遵循@RezaAghaei的建议。与直接操纵ListView

相比,它不那么混乱和混乱

答案 1 :(得分:1)

不使用==查找完全匹配,而是尝试下列之一(我假设'Text'是包含名称的列表中的列名称 - 如果不将其更改为Items.Name(例如)< / p>

  1. 如果您想搜索“以...开头”,请尝试

    if (Items.Text.StartsWith(textBox_DEC_Search.Text.Trim())
    
  2. 如果您想根据查找字符串的一部分进行搜索,请尝试

    if (Items.Text.Contains(textBox_DEC_Search.Text.Trim())
    
  3. 您可以类似地执行您要搜索的任何其他列。如果要使搜索大小写不敏感,则在字符串和列名称上使用.ToLower()。