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

时间:2018-11-30 06:02:05

标签: c# winforms listbox

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

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

enter image description here

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

enter image description here

我用于搜索列表框的代码-

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

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

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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;
        }
    }