Winforms组合框在lostfocus上丢失自动完成值

时间:2012-11-08 15:21:02

标签: 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
  4. 现在您将看到文本框具有焦点,并且组合选择已更改为' bbb1'。 另请注意,在文本框中,它会显示所选值仍然是“bbb3”'当离开事件被解雇时,但那时它是' bbb1'失焦的事件被解雇了。

    如果您单击组合框使其在步骤3中失去焦点,则会出现相同的行为。

    如果您在步骤3中执行任何其他操作,则不会遇到此问题。即如果你:

    • 按'输入'
    • 按' up'然后' down'回到" bbb3"
    • 点击商品

    有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我从microsoft

找到了这个链接

http://connect.microsoft.com/VisualStudio/feedback/details/711945/tab-on-a-winforms-combobox-with-properties-autocompletemode-append-autocompletesource-listitems-doesnt-work-correctly

基本上这是一个已知的问题,微软表示他们无法修复。但是,该链接的变通方法部分有两种解决方法。

答案 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