【问题标题】:ComboBox get selected value independently of selection methodComboBox 独立于选择方法获取选择的值
【发布时间】:2022-01-31 22:58:34
【问题描述】:

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

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

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

当用户在 CB1 中选择一个 ID(key) 时,对应的 value(s) 会填充到 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 方法

- 有没有其他方法可以做我想做的事?

【问题讨论】:

  • 请勿将代码发布为图片。请仅将其作为文本包含。

标签: c# visual-studio combobox


【解决方案1】:

如果我将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 语句 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 即可产生相同的结果。

【讨论】:

  • 哇!感谢您的解决方案以及您对我的代码的评论。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2022-01-13
  • 2018-09-19
  • 1970-01-01
相关资源
最近更新 更多