当用户切换到下一个控件时,我遇到了 Winforms 组合框丢失自动完成期间找到的值的问题。
这是一个代码示例(作为将弹出表单的 Nunit 测试):
[Test]
[STAThread]
public void Testing_AsDropDownList()
{
var comboBox = new ComboBox();
comboBox.DropDownStyle = ComboBoxStyle.DropDownList;
comboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
comboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
comboBox.Items.Add(new ComboPair("aaa", "ItemAAA"));
comboBox.Items.Add(new ComboPair("bbb1", "ItemBBB1"));
comboBox.Items.Add(new ComboPair("bbb2", "ItemBBB2"));
comboBox.Items.Add(new ComboPair("bbb3", "ItemBBB3"));
comboBox.Items.Add(new ComboPair("ccc", "ItemCCC"));
var textBox = new TextBox{ Multiline = true };
comboBox.Leave += (sender, args) => textBox.Text = "On Leave: " + comboBox.SelectedItem;
comboBox.LostFocus += (sender, args) => textBox.Text += " ... On LostFocus: " + comboBox.SelectedItem;
var frm = new Form();
frm.Width = 300;
frm.Height = 100;
comboBox.Dock = System.Windows.Forms.DockStyle.Top;
textBox.Dock = System.Windows.Forms.DockStyle.Bottom;
frm.Controls.Add(comboBox);
frm.Controls.Add(textBox);
Application.EnableVisualStyles();
Application.Run(frm);
}
为了重现错误,请执行以下步骤:
- 运行测试 表单将弹出,组合框聚焦...
- 现在键入“bbb3”以选择具有自动完成功能的相应项目。 您现在会看到文本框已更新为“bbb3”作为您选择的项目。
- 现在按 TAB 键
您现在将看到文本框具有焦点并且组合选择已更改为“bbb1”。 另请注意,在文本框中,它显示在触发离开事件时所选值仍为“bbb3”,但在触发失去焦点事件时为“bbb1”。
如果您在组合框以外的地方单击以使其在步骤 3 中失去焦点,则会看到相同的行为。
如果您在第 3 步执行任何其他操作,则不会出现此问题。即如果你:
- 按“输入”
- 按“向上”然后按“向下”返回“bbb3”
- 点击项目
- 等等
有什么想法吗?
最佳答案
该值在 WM_KILLFOCUS 消息中丢失。在 ComboBox 的子类中重写 WndProc 为我解决了这个问题(除了单击以松开焦点......但我想这可以解释为像在网站对话框中一样解散)。不幸的是,我手头只有 VB.NET 代码:
Protected Overrides Sub WndProc(ByRef m As Message)
If m.Msg = &H8 Then 'WM_KILLFOCUS
Dim sText As String = Me.Text
MyBase.WndProc(m)
Me.Text = sText
Exit Sub
End If
MyBase.WndProc(m)
End Sub
关于c# - Winforms 组合框在失去焦点时失去自动完成值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13291945/