ComboBox 独立于选择方法获取选定值

ComboBox get selected value independently of selection method

目标无论用户是通过单击、按回车键、按 Tab 键自动完成等方式选择值,都从 ComboBox 中获取选定值。 ..

我有一个 dictionary<string, string[]> 键:ID 和值:版本

我有 2 个组合框,例如 CB1(包含 keys\ID)和 CB2:

当用户在 CB1 中选择一个 ID(键)时,相应的值将填充到 CB2。

为此,我使用了 CB1_SelectionChangeCommitedCB1_LeaveCB1_KeyPressed 方法。后者无法正常工作,因为它无法检测到任何按键。其代码如下

private void ComboBox3_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == 13)
        {
            if (comboBox3.Items.Contains($"{comboBox3.Text}"))
            {
                comboBox4.Items.Clear();
                comboBox4.Text = string.Empty;


                foreach (string version in dependenciesData.dependencyDic[Convert.ToString(comboBox3.Text)])
                {
                    comboBox4.Items.Add(version);
                }
                comboBox4.SelectedIndex = 0;
            }
        }
    }

问题:

- 如何修复 CB_Keypress 方法

- 是否有其他方法可以满足我的要求?

如果我将 AutocompleteMode 设置为 AppendSuggestAppend 并将 AutoCompleteSource 设置为 ListItems

private void ComboBox3_SelectedIndexChanged(object sender, EventArgs e)
{
    if (dependenciesData.dependencyDic
           .TryGetValue((string)comboBox3.SelectedItem, out string[] values)) {

        comboBox4.DataSource = values;
        comboBox4.SelectedIndex = 0;
    }
}

AutocompleteMode 设置为 Suggest 无效。

如果确保字典包含所有组合框条目作为键。那么这可以简单化一点:

if (comboBox3.SelectedIndex >= 0) {
    comboBox4.DataSource =
        dependenciesData.dependencyDic[(string)comboBox3.SelectedItem];
    comboBox4.SelectedIndex = 0;
}

我这样设置comboBox3的数据源:

comboBox3.DataSource =dependenciesData.dependencyDic.Keys
    .OrderBy(x => x)
    .ToList();

允许用户仅输入允许值的最简单方法是将组合框的 DropDownStyle 设置为 DropDownList。使用此设置,他无法再编辑组合框文本,但他仍会收到自动完成建议。


关于您的编码风格的一些注意事项:

  • 嵌套if-statements if (condition1) { if (condition2) { ... } }可以写成if (condition1 && condition2) { ... }.
  • 您可以将 ComboBox.DataSource Property 设置为列表或数组,而不是使用 Items.Add(...) 将单个项目添加到组合框。
  • 如果组合框包含字符串,您只需将 SelectedItem 属性 转换为 string,而不是将其转换为 string。 (不需要进行任何转换,因为它已经是静态类型为 objectstring)。
  • 您正在测试组合框项目是否包含属于 O(n) 操作的文本。您可以通过对包含与键相同的文本的字典执行测试来更有效地执行此操作,即 O(1) operation.
  • 你使用冗余字符串插值$"{comboBox3.Text}"。简单地使用 comboBox3.Text 会产生相同的结果。