使用Windows表单,我的'listview'有多个列,如图所示。
我一直在尝试将此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)。我们非常感谢指南和示例代码帮助。感谢。
答案 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.StartsWith的String.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>
如果您想搜索“以...开头”,请尝试
if (Items.Text.StartsWith(textBox_DEC_Search.Text.Trim())
如果您想根据查找字符串的一部分进行搜索,请尝试
if (Items.Text.Contains(textBox_DEC_Search.Text.Trim())
您可以类似地执行您要搜索的任何其他列。如果要使搜索大小写不敏感,则在字符串和列名称上使用.ToLower()。