c# - Winforms 组合框在失去焦点时失去自动完成值(value)

标签 c# winforms combobox lost-focus

当用户切换到下一个控件时,我遇到了 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);
}

为了重现错误,请执行以下步骤:

  1. 运行测试 表单将弹出,组合框聚焦...
  2. 现在键入“bbb3”以选择具有自动完成功能的相应项目。 您现在会看到文本框已更新为“bbb3”作为您选择的项目。
  3. 现在按 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/

相关文章:

c# - 如何停止 Designer 为用户控件上的公共(public)属性生成代码?

c# - 在 DataGridViewComboBoxColumn 中设置 selectedValue

c# - 更改 ComboBox 的验证样式 WPF

c# - 在使用 CaSTLe Windsor IoC 容器注册组件期间设置 Name 属性

c# - 忽略 Json.net 中的空字段

c# - wpf如何根据类型设置数据模板

c# - DataGridView:查看空数据网格

c# - 控制查看包含大量文本的文件

mysql - 如何从 ComboBox 返回对象

C# + COM,修改参数中的数组