简述
当我在ComboBox中输入一个字符,然后按下Alt+Down键,再按Enter或Tab键时,SelectedIndexChanged事件不会触发,尽管SelectedIndex的值确实发生了变化!为什么事件不会触发呢?
更新 如果你在输入字符后按Alt+Down,然后再按Esc键,也会出现同样的错误。你本来期望Esc键可以取消选择,但是SelectedIndex却改变了,并且SelectedIndexChanged事件也没有触发。
如果你只是输入Alt+Down,使用箭头键浏览到某个条目,然后再输入Esc键,会发生什么情况?选定的索引会被设置回原始值吗?
详述
我有一个WinForm应用程序,其中包含一个ComboBox。ComboBox的SelectedIndexChanged事件已连接到一个事件处理程序,用于在一个Label控件中显示SelectedItem。ComboBox的Items集合有三个值:"One"、"Two"和"Three"。
- 当我使用鼠标选择一个项目时,事件会触发。
- 当我滚动鼠标时,事件会触发。
- 当我使用Alt+Down展开组合框并通过上下方向键浏览项目时,事件会触发。
- 但是... 当我输入值的第一个字符,然后按Alt+Down,接着按Enter或Tab键,值确实被选中并显示在ComboBox中,但事件却没有触发。
我还添加了一个按钮来显示SelectedIndex。它显示SelectedIndex已经改变。所以,即使SelectedIndex确实发生了变化,SelectedIndexChanged事件也不会触发!
如果我只是输入一个有效的值,比如 One
,事件也不会触发。但在这种情况下,单击按钮会显示SelectedIndex确实没有改变。因此,在这种情况下,行为是正常的。
要复制,请创建一个Form,添加一个ComboBox、一个Label和一个Button。将以下代码放置在Form1.cs中:
using System;
using System.Windows.Forms;
namespace ComboBoxSelectedIndexChanged
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
comboBox1.Items.AddRange(new object[] {
"One",
"Two",
"Three"
});
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
label1.Text = "Selected index: " + comboBox1.SelectedIndex;
}
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("Selected item: " + comboBox1.SelectedItem +
"\nSelected index: " + comboBox1.SelectedIndex);
}
}
}