だから、私は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 がヒットするはずです。さらに重要なことに、文字を削除しても機能するはずです(バックスペースのキーを削除)。誰か?
編集:詳細:
リストボックスは、ユーザーが検索する内容に基づいて、キーストロークごとに縮小および拡大する必要があります。リストボックスは、ユーザーが入力したキーワードに一致するすべての項目を保持し、一致しない項目を除外する必要があります。