防止绕过组合框中的SelectedIndexChanged



我很惊讶,通过将显示的值更改为另一个值,可以绕过带有ComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownListComboBox上的SelectedIndexChanged

以下是重现案例的步骤:

  • 创建一个带有ComboBoxForm,带有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键时……则ComboBoxesSelectedIndexChanged事件不会触发,因为控件仍处于"选择"不同索引的过程中。

然而,在上述情况下,ComboBoxesValidatingLeave事件DO触发。与其为此创建另一个控件,不如连接组合框ValidatingLeave事件来修复您所描述的内容。类似…

正常情况下的当前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);
}

然后,使用ComboBoxesLeave事件作为"特殊"情况,当用户从组合框中弹出时。

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);
}

相关内容

  • 没有找到相关文章

最新更新