【问题标题】:How to execute advance Listview Search如何执行高级 Listview 搜索
【发布时间】:2016-09-07 18:33:07
【问题描述】:

使用 Windows 窗体,我的“列表视图”有多个列,如图所示。

我一直试图让这个 txtbox_search 变得更高级。当插入任何字符、单词或数字时,我希望遍历列表视图的某些列以查找字符、单词、数字并显示与输入相关的数据。


就像我输入时一样:txtbox_search.Text = "a"

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

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

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

以“A...”开头的整行以此类推


当我输入时:txtbox_search.Text = "1"

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

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

ID 以“1”开头的整行,例如“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)。指南和示例代码帮助将不胜感激。谢谢。

【问题讨论】:

  • 你基本上有两个条件:如果是在名称中搜索字母,如果是在 ID 中搜索数字,我是否正确?
  • 我建议使用数据绑定的DataGridView 并使用List<T>DataTable(即DataSourceDataGridView)执行过滤。无论如何,如果您想继续使用 ListView,请查看 Find ListView Items based on text of items and sub itemsFilter a ListView in vb.net
  • 是的,你没看错,@MongZhu
  • 阅读您提供的链接,@RezaAghaei。谢谢关心^_^

标签: c# winforms listview search


【解决方案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 或名称!

因为 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 行并且它仍然只遍历列表视图的“ID”列。
  • @ARr0w 问题是listView_DEC_CustomerList.Items.Clear(); 如果你找到一个你删除其余的,所以如果你找到第二个结果你删除第一个
  • @ARr0w 我进行了新的编辑并考虑清除搜索结果。请查看并发表评论
  • 此行出错:listView_DEC_CustomerList.Items.AddRange(matchlist); 无法从 'System.Collections.Generic.List' 转换为 'System.Windows.Forms.ListViewItem[]跨度>
  • 谢谢@MongZhu,我想通了。我尝试了它的所有属性,其中一个有效。这是matchlist.ToArray();
【解决方案2】:

不要使用 == 来寻找完全匹配,而是尝试以下方法之一(我假设“文本”是列表中包含名称的列名称 - 如果不将其更改为 Items.Name(例如)

  1. 如果您想搜索“开始于”,请尝试

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

    if (Items.Text.Contains(textBox_DEC_Search.Text.Trim())
    
  3. 您可以对您想要搜索的任何其他列进行类似的操作。如果您想让搜索不区分大小写,请在字符串和列名上使用 .ToLower() 。

【讨论】:

  • 仍然只遍历列表视图的第一列,如果找到它返回“一个”随机行。并非所有都与插入的字符串有关。
  • 你的答案原来对我有用。感谢您与我分享搜索不区分大小写的知识:) @anil
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 2014-04-30
  • 2021-04-08
  • 2012-03-11
  • 2018-07-13
  • 2015-04-17
  • 2012-04-09
相关资源
最近更新 更多