我很惊讶,通过将显示的值更改为另一个值,可以绕过带有ComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList
的ComboBox
上的SelectedIndexChanged
。
以下是重现案例的步骤:
- 创建一个带有
ComboBox
的Form
,带有ComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList
和一些其他控件,这些控件可以获得焦点(例如TextBox
( - 为
ComboBox.SelectedIndexChanged
附加一个事件处理程序,并让例如,将ComboBox
的选定索引重置为0只能选择第一个条目 - 用例如从1到5的整数填充
ComboBox.Items
- 启动应用程序并打开下拉列表
- 单击除第一个条目外的任何条目并按住鼠标左键(无LMBUp必须触发(
- 按住鼠标左键按下
TAB
键 -
点击值显示在
ComboBox
中,没有CCD_ 13被触发
你会提供什么来防止这种不良行为。不能抑制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;
}
我已经用派生控件解决了这个问题:
class ModifiedComboBox : ComboBox
{
private object _lastSelectedItem = null;
protected override void OnDropDownClosed(EventArgs e)
{
if(SelectedItem != _lastSelectedItem)
{
OnSelectedIndexChanged(new EventArgs());
}
base.OnDropDownClosed(e);
}
protected override void OnSelectedIndexChanged(EventArgs e)
{
_lastSelectedItem = SelectedItem;
base.OnSelectedIndexChanged(e);
}
}
不清楚"为什么"您想要ComboBox
的这种奇怪行为;然而,您似乎没有仔细观察ComboBox
事件。
你所描述的是真的。。。当用户在组合框中的某个选择上按住鼠标键的同时按下Tab键时……则ComboBoxes
SelectedIndexChanged
事件不会触发,因为控件仍处于"选择"不同索引的过程中。
然而,在上述情况下,ComboBoxes
Validating
和Leave
事件DO触发。与其为此创建另一个控件,不如连接组合框Validating
或Leave
事件来修复您所描述的内容。类似…
正常情况下的当前SelectedIndexChanged
…
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) {
comboBox1.SelectedIndexChanged -= new System.EventHandler(comboBox1_SelectedIndexChanged);
comboBox1.SelectedIndex = 0;
comboBox1.SelectedIndexChanged += new System.EventHandler(comboBox1_SelectedIndexChanged);
}
然后,使用ComboBoxes
Leave
事件作为"特殊"情况,当用户从组合框中弹出时。
private void comboBox1_Leave(object sender, EventArgs e) {
comboBox1.SelectedIndexChanged -= new System.EventHandler(comboBox1_SelectedIndexChanged);
comboBox1.SelectedIndex = 0;
comboBox1.SelectedIndexChanged += new System.EventHandler(comboBox1_SelectedIndexChanged);
}