I was surprised, that SelectedIndexChanged on a ComboBox with ComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList can be bypassed by changing the shown value to another one.
Here are steps to reproduce the case:
- Create a
Formwith aComboBoxwithComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownListand some other control, which can get the focus (e.g.TextBox) - Attach an event handler for
ComboBox.SelectedIndexChangedand let say do reset the selected index ofComboBoxthere always to 0 for only first entry could be selected. - Fill
ComboBox.Itemswith e.g. integers from 1 to 5. - Start the application and open drop down list
- Click any entry except the first and hold left mouse button down(no LMBUp must be triggered)
- Press
TABkey holding the left mouse button down - Clicked value is shown in the
ComboBoxand noComboBox.SelectedIndexChangedbeing triggered.
What would be your offer to prevent this undesirable behavior. Tab key must not be suppressed and ComboBox.SelectedIndexChanged must be triggered on change.
Some code for copy-paste:
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;
}
I have solved it with derived control: