如何在 c# winforms 的列表框中搜索时保持所选项目突出显示?

How to keep selected item highlighted while searching in listbox in c# winforms?

我有一个由一些项目填充的列表框,表单包含文本框和一个列表框。在文本框中,用户可以在列表框中搜索指定的条目。现在,如果用户在文本框中输入一些文本,则过滤后的列表框项目将显示在列表中。 现在,假设如果我之前在搜索之前选择了列表框中的任何项目,那么如果我搜索列表框,我最后选择的元素(如果它存在于过滤的项目中)不会突出显示。 如果筛选列表中存在我最后选择的项目,我该如何显示它。

示例 - 在列表框中搜索之前。

搜索列表后,我最后选择的项目(如果存在于过滤列表中)将失去显示选择。

我的搜索列表框的代码 -

 private void vmS_TextBox1_TextChanged(object sender, EventArgs e)
    {
        string keyword = this.iBoxEventlistSearchTextBox.Text;
        lBox_Event_list.Items.Clear();

        foreach (string item in sortedEventList)
        {
            if (item.IndexOf(keyword, StringComparison.OrdinalIgnoreCase) >= 0)
            {
                lBox_Event_list.Items.Add(item);
            }
        }
    }     

我还选择了应用于此列表框的索引更改事件处理程序,我不想再次触发它以用于过滤列表视图。我只想在筛选列表中突出显示它。

谢谢!

您可以保存在键入之前选择的项目并在剩余项目中搜索它,然后设置选择的项目(如果存在)。

private void vmS_TextBox1_TextChanged(object sender, EventArgs e)
    {
        string keyword = this.iBoxEventlistSearchTextBox.Text;
        // Save the selected item before
        var selectedItem = string.Empty;
        if(lBox_Event_list?.Items?.Count > 0)
           selectedItem = lBox_Event_list.SelectedItem;
        lBox_Event_list.Items.Clear();

        foreach (string item in sortedEventList)
        {
            if (item.IndexOf(keyword, StringComparison.OrdinalIgnoreCase) >= 0)
            {
                lBox_Event_list.Items.Add(item);
            }
        }
        // Search for it in the items and set the selected item to that
        if(string.IsNullOrEmpty(selectedItem)) 
        {
          var index = lBox_Event_list?.Items?.IndexOf(selectedItem);
          if(index != -1)
              lBox_Event_list.SelectedIndex = index;
        }
    }