ComboBox 独立于选择方法获取选定值
ComboBox get selected value independently of selection method
目标:无论用户是通过单击、按回车键、按 Tab 键自动完成等方式选择值,都从 ComboBox 中获取选定值。 ..
我有一个 dictionary<string, string[]>
键:ID 和值:版本
我有 2 个组合框,例如 CB1(包含 keys\ID)和 CB2:
当用户在 CB1 中选择一个 ID(键)时,相应的值将填充到 CB2。
为此,我使用了 CB1_SelectionChangeCommited
、CB1_Leave
、CB1_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
设置为 Append
或 SuggestAppend
并将 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
。 (不需要进行任何转换,因为它已经是静态类型为 object
的 string
)。
- 您正在测试组合框项目是否包含属于
O(n)
操作的文本。您可以通过对包含与键相同的文本的字典执行测试来更有效地执行此操作,即 O(1) operation.
- 你使用冗余字符串插值
$"{comboBox3.Text}"
。简单地使用 comboBox3.Text
会产生相同的结果。
目标:无论用户是通过单击、按回车键、按 Tab 键自动完成等方式选择值,都从 ComboBox 中获取选定值。 ..
我有一个 dictionary<string, string[]>
键:ID 和值:版本
我有 2 个组合框,例如 CB1(包含 keys\ID)和 CB2:
当用户在 CB1 中选择一个 ID(键)时,相应的值将填充到 CB2。
为此,我使用了 CB1_SelectionChangeCommited
、CB1_Leave
、CB1_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
设置为 Append
或 SuggestAppend
并将 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
。 (不需要进行任何转换,因为它已经是静态类型为object
的string
)。 - 您正在测试组合框项目是否包含属于
O(n)
操作的文本。您可以通过对包含与键相同的文本的字典执行测试来更有效地执行此操作,即 O(1) operation. - 你使用冗余字符串插值
$"{comboBox3.Text}"
。简单地使用comboBox3.Text
会产生相同的结果。