ComboBox - 自动完成 + 自由打字

ComboBox - AutoComplete + Free typing

如果用户输入的内容在项目列表中,我希望我的组合框启用自动完成功能,如果它不存在,我想将其包含在我的列表中。

例如:

包含以下项目的组合框:"Rock, Country, Jazz"。 如果用户开始输入 "Ro...",组合框会自动完成 'Rock'。但是如果用户键入 "Blues",我想将其添加到我的项目中。所以它会像:"Rock, Country, Jazz, Blues".

我该怎么做?

您可以使用 AutoCompleteModeAutoCompleteSource 进行自动完成。

comboBox1.AutoCompleteMode = AutoCompleteMode.Append;
comboBox1.AutoCompleteSource = AutoCompleteSource.ListItems;

或者您可以在选择 ComboBox 后通过 Visual Studio 中的属性面板执行此操作...

用于向您的 ComboBox 添加新项目;

  private void comboBox1_TextChanged(object sender, EventArgs e)
    {
        if (!comboBox1.Items.Contains(comboBox1.Text))
        {
            comboBox1.Items.Add(comboBox1.Text);
            comboBox1.Items.RemoveAt(comboBox1.Items.Count - 2);
        }
    }

如果我使用 MVVM 执行此操作,我会从 ComboBox 开始并修改它以适应。

如果您使用 DevExpress 中的内置 ComboBox,您几乎可以免费获得它。只需在下拉列表中填入您想要自动完成的项目,然后设置选项:

  • 自动下拉(所以当您开始输入时,它会自动下拉匹配列表)。
  • 按匹配过滤列表(即下拉列表中的唯一项目将是与您输入的内容匹配的项目)。
  • 部分匹配(即您输入的内容将过滤下拉列表,在任何地方匹配,甚至在中心)。

如果您想变得更高级,您可以编写一个服务来侦听用户当前在框中键入的内容,然后调整下拉项列表以适应。下拉列表中与用户类型匹配的任何项目将自动显示。我会使用 Reactive Extensions (RX) 和 Throttle 来做到这一点,请参阅:

  • How to throttle event stream using RX?
  • The difference between Rx Throttle(...).ObserveOn(scheduler) and Throttle(..., scheduler)