C# 设置ComboBox.DroppedDown=false将重置选定项
我有一个自定义组合框,它继承Forms.ComboBox类。其数据源已绑定。 其属性初始化如下:C# 设置ComboBox.DroppedDown=false将重置选定项,c#,winforms,C#,Winforms,我有一个自定义组合框,它继承Forms.ComboBox类。其数据源已绑定。 其属性初始化如下: this.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest; this.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; this.DropDownStyle = ComboBoxStyle.DropDown; OnDropD
this.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest;
this.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
this.DropDownStyle = ComboBoxStyle.DropDown;
OnDropDown将其自动完成模式设置为无,然后在OnDropDownClosed中,将其设置为再次建议(以避免此处描述的问题)
我实现了一个逻辑来验证组合框,并在键入某些文本时选择第一个匹配项
当显示下拉列表且用户键入内容并按Enter键时,将选择第一个匹配项。然后我想关闭下拉列表。我通过将ComboBox.DroppedDown属性设置为false来实现。问题是,当下拉列表以这种方式关闭时,所选项目将重置为以前选择的项目。不会调用OnSelectedIndexChanged、OnSelectionChangeCommitted和OnSelectedValueChanged
我通过记住在OnSelectedIndexChanged中选择的索引,并在OnDropDownClosed中再次设置它(在下拉菜单手动关闭的情况下)
问题:
当ComboBox的下拉属性设置为false时,为什么所选项目、索引、文本和值会重置?有没有其他方法可以手动关闭组合框而不会产生这种副作用
编辑:用于说明问题的代码:
List<string> list = new List<string>();
list.Add("item0");
list.Add("item1");
list.Add("item2");
list.Add("item3");
list.Add("item4");
customComboBox1.DataSource = list;
控制台输出如下所示(所选项目:0,按Enter键时尝试更改为2,关闭后下拉索引仍为0):
OnSelectedIndex已更改0项0
OnSelectedIndex已更改2项2
输入-before DroppedDown=false 2项2
OnDropDown0已关闭项2
输入-after DroppedDown=false 0项2
我发现设置SelectedItem比设置SelectedIndex更可靠 //这也将更改SelectedIndex并触发SelectedItemChanged事件
this.SelectedItem=this.Items[idx] 我发现设置SelectedItem比设置SelectedIndex更可靠 //这也将更改SelectedIndex并触发SelectedItemChanged事件
this.SelectedItem=this.Items[idx] 实际上,在问这个问题之前,我已经在做了。我想知道为什么会出现这种情况,以及是否有其他办法来解决它。但是因为没有人回答,而且这是我最后做的事情,我把这个标记为答案。实际上在问这个问题之前,我已经在做了。我想知道为什么会出现这种情况,以及是否有其他办法来解决它。但既然没有其他人回答,而且这是我最终要做的事情,我就把这个标记为答案。
public class CustomComboBox : ComboBox
{
public CustomComboBox(){ }
#region OnKeyDown
protected override void OnKeyDown(KeyEventArgs e)
{
if (!this.Enabled) e.Handled = true;
else
{
base.OnKeyDown(e);
if (e.KeyCode == Keys.Enter)
{
this.SelectedIndex = 2; // index changes here
Console.WriteLine("ENTER - before DroppedDown=false " +
this.SelectedIndex + " " + this.Text);
if (this.DroppedDown)
{
// here index = 2, text = Item2
this.DroppedDown = false;
// here index = previous index, text is still Item2
// different thing is displayed than is actually chosen
// OnSelectedIndexChanged wasn't raised
}
Console.WriteLine("ENTER - after DroppedDown=false " +
this.SelectedIndex + " " + this.Text);
e.Handled = true;
}
}
}
#endregion
#region OnSelectedIndexChanged
protected override void OnSelectedIndexChanged(EventArgs e)
{
Console.WriteLine("OnSelectedIndexChanged " +
this.SelectedIndex + " " + this.Text);
base.OnSelectedIndexChanged(e);
}
#endregion
#region OnDropDownClosed
protected override void OnDropDownClosed(EventArgs e)
{
Console.WriteLine("OnDropDownClosed " +
this.SelectedIndex + " " + this.Text);
base.OnDropDownClosed(e);
}
#endregion
}
protected override void OnDropDownClosed(EventArgs e)
{
Console.WriteLine("OnDropDownClosed " +
this.SelectedIndex + " " + this.Text);
int idx = this.SelectedIndex;
base.OnDropDownClosed(e);
this.SelectedIndex = idx;
}