【发布时间】:2012-08-22 07:23:20
【问题描述】:
所以,我有一个包含 x 个项目的列表框。在列表框的顶部,我有一个 TextBox(这是搜索字段)。如果它不包含搜索词(代码中的变量关键字),我尝试开发一种从列表框中删除项目的算法。这应该发生在用户键入的每个键上(即时)。所以,代码:
private void _keywordTextBox_TextChanged(object sender, EventArgs e)
{
string keyword = _keywordTextBox.Text;
if (keyword == searchtext || isSpace) // do nothing if space is typed - searchtext is a templatetext in the textbox ("type here to search...")
return; // ignore
else if (keyword == "")
{
listBox.Items.Clear();
foreach (string s in originalList)
listBox.Items.Add(s);
}
else
{
List<string> selection = new List<string>();
foreach (string s in originalList) // originalList is the listbox at startup
selection.Add(s);
listBox.BeginUpdate();
string[] keywordSplit = keyword.Split(' ');
try
{
for (int i = originalList.Count - 1; i >= 0; i--)
{
string[] selectionSplit = selection[i].Split(' ');
int l = 0; // number of hits
for (int j = 0; j < selectionSplit.Length; j++)
{
for (int k = 0; k < keywordSplit.Length; k++)
{
if (selectionSplit[j].ToLower().Contains(keywordSplit[k].ToLower()))
{
l++;
break;
}
}
}
if (l < keywordSplit.Length) // Not hit on all keywords
selection.RemoveAt(i);
}
}
finally
{
listBox.Items.Clear();
foreach (string s in selection) // Add selection in listbox
listBox.Items.Add(s);
if (listBox.Items.Count > 0)
listBox.SetSelected(0, true); // Select first item in listbox
listBox.EndUpdate();
}
}
}
这个问题很难描述,除了它没有按预期工作。据我所知,这种行为是零星的。
如果我搜索“ck flow”,我应该会在 stackoverflow 上获得成功。更重要的是,如果我删除字符(退格键的删除键),它也应该起作用。有人吗?
编辑:更多细节:
列表框应根据用户搜索的内容在每次击键时缩小和扩大。列表框应保留与用户键入的关键字匹配的每个项目,并过滤掉不匹配的项目。
【问题讨论】:
-
我猜你想要实现的功能是由微软的
ComboBox和AutoComplete提供的功能看到这个stackoverflow.com/questions/6243611/… -
请更详细地解释代码的预期用途。应该显示或过滤哪些元素?也许再举一些例子。
-
@yogi No :) 它只搜索字符串的开头,而不是中间。