4

当用户切换到下一个控件时,我遇到了 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”
  • 点击项目
  • 等等

有任何想法吗?

4

1 回答 1

1

该值在 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
于 2017-04-06T11:52:46.373 回答