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

我遇到的问题与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”
  • 点击该项目
  • 等等
  • 有任何想法吗?


    我从微软找到了这个链接

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

    基本上这是一个微软称他们不会修复的已知问题。 但是,该链接的解决方法部分下有两种解决方法。


    该值在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
    
    链接地址: http://www.djcxy.com/p/68587.html

    上一篇: Winforms combobox loses autocomplete value on lostfocus

    下一篇: How to display length of filtered ng