在我的c#窗口应用程序中,我需要在列表框中进行通配符搜索。 即如果我在文本框中写了一些文本,它应该在该列表框中自动选择。
列表框使用数据表绑定,例如lstVendor.datasource = l_dtTable
Findstring()函数仅查找起始字符串的匹配项。但我需要在特定文本的任何位置找到匹配,然后突出显示。
我正在使用下面的代码,但没有让索引/甚至lstVendor.selecteditem = "string"
无效。
Indexof()始终返回-1
string final = "";
foreach (Object lstItem in lstVendor.Items)
{
string s = ((DataRowView)(lstItem)).Row.ItemArray[0].ToString();
if (s.ToLower().Contains(txtVendor.Text.ToLower()))
{
int i = lstVendor.Items.IndexOf(s);
final += s + ",";
}
}
string[] l_strArrVendorList = final.TrimEnd(',').Split(',');
for (int Counter = 0; Counter < l_strArrVendorList.Length; Counter++)
{
lstVendor.SelectedItem = l_strArrVendorList[Counter];
}
帮助我!
答案 0 :(得分:0)
搜索可能会返回多个匹配的项目,此代码将找到第一个匹配的项目:
var firstMatched = listBox1.Items.Cast<DataRowView>()
.Where(v=>Convert.ToString(v.Row[0]).ToLower()
.Contains(txtVendor.Text.ToLower()))
.FirstOrDefault();
if(firstMatched != null) listBox1.SelectedItem = firstMatched;
您可以删除FirstOrDefault()
以获取匹配项目列表,并在匹配项目中实施一些导航。
对于VS 2000支持,您必须使用此扩展类:
public static class EnumerableExtension {
public static IEnumerable<T> Cast<T>(this System.Collections.IEnumerable source){
foreach(var item in source)
yield return (T)item;
}
}
我上面的代码应该可以正常使用,但看起来你只想修改代码,这里是你的固定代码:
//Note that you need to set SelectionMode for your listBox like this:
lstVendor.SelectionMode = SelectionMode.MultiSimple;
foreach (var lstItem in lstVendor.Items.Cast<DataRowView>()) {
string s = lstItem.Row.ItemArray[0].ToString();
if (s.ToLower().Contains(txtVendor.Text.ToLower())) {
lstVendor.SelectedItems.Add(lstItem);
}
}