C#中列表框中的通配符搜索

时间:2013-11-27 07:14:59

标签: c# winforms listbox

在我的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];
}

帮助我!

1 个答案:

答案 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);
  }
}