【发布时间】:2021-08-25 17:50:37
【问题描述】:
我很惊讶,ComboBox 和 ComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList 上的 SelectedIndexChanged 可以通过将显示的值更改为另一个值来绕过。
以下是重现案例的步骤:
- 创建
Form和ComboBox和ComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList以及其他一些可以获得焦点的控件(例如TextBox) - 为
ComboBox.SelectedIndexChanged附加一个事件处理程序并让 说不要将ComboBox的选定索引重置为0 只能选择第一个条目。 - 填写
ComboBox.Items,例如从 1 到 5 的整数。 - 启动应用程序并打开下拉列表
- 单击除第一个以外的任何条目并按住鼠标左键(无 LMBUp 必须触发)
- 按住鼠标左键按下
TAB键 - 点击值显示在
ComboBox中,没有ComboBox.SelectedIndexChanged被触发。
您会提出什么建议来防止这种不良行为。 Tab 键不得被抑制,ComboBox.SelectedIndexChanged 必须在更改时触发。
复制粘贴的一些代码:
public Form1()
{
InitializeComponent();
comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
comboBox1.Items.Add(1);
comboBox1.Items.Add(2);
comboBox1.Items.Add(3);
comboBox1.Items.Add(4);
comboBox1.Items.Add(5);
comboBox1.SelectedIndexChanged += ComboBox1_SelectedIndexChanged;
}
private void ComboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
comboBox1.SelectedIndex = 0;
}
【问题讨论】:
-
确实该事件被忽略:选择被修改并且焦点传递到下一个控件。任何断点都会被忽略。
-
@OlivierRogier 选择更改或文本更改?我们可以验证当前选择的索引吗?我们可以测试
selectedItemchanged是否被解雇了吗? -
@T.S. Selected 索引已更改,而不仅仅是文本。
-
@OlivierRogier 谢谢你的链接,
ComboBoxStyle.DropDown可以讨论,但我得到了一个派生控制的解决方案。
标签: c# winforms combobox event-handling selectedindexchanged