在Windows 7中DropDownStyle = DropDownList时,ComboBox.SelectedValue与显示的文本不匹配

Ecy*_*yrb 12 .net data-binding combobox windows-7 winforms

假设我们在Windows应用程序中有以下代码:

ComboBox comboBox = new ComboBox()
{
    AutoCompleteMode = AutoCompleteMode.SuggestAppend,
    AutoCompleteSource = AutoCompleteSource.ListItems,
    DataSource = new string[] { "", "Ark", "Boat", "Bucket" },
    DropDownStyle = ComboBoxStyle.DropDownList
};
this.Controls.Add(comboBox);

TextBox textBox = new TextBox()
{
    Left = comboBox.Right,
    Top = comboBox.Top,
    ReadOnly = true
};
textBox.DataBindings.Add("Text", comboBox, "SelectedValue");
this.Controls.Add(textBox);
Run Code Online (Sandbox Code Playgroud)

这里没有魔法,只是ComboBox绑定到一个字符串列表.该TextBox显示SelectedValueComboBox.

当我在" ComboBox标签"中输入"Bucket"时,我会遇到意外行为.由于某种原因,ComboBox显示"船"但TextBox显示"桶".我希望他们都能显示"Bucket".

如果我更改DropDownStyleDropDown,它的行为与预期一致,但我不希望用户能够键入他们想要的任何内容.他们应该只能输入列表中的项目.

更有趣的是,在输入"Bucket"并跳出标签后,如果我再次输入"Bucket",它将同时显示"Bucket".如果我进行第三次尝试,它将返回"船",ComboBox而"Bucket"则返回"TextBox".所以看起来它正在骑自行车穿过所有的B.

在我最近从XP升级到Windows 7之前,我没有注意到这一点.我不明白这与此有什么关系,但无论如何我都把它丢掉了.

如果这种行为是正确的,有人能告诉我我应该做些什么来实现我预期的行为吗?

UPDATE 这似乎这因为预计在Windows XP模式与Windows 7的一切行为方式.任何运行Windows 7的人都可以尝试我的代码并验证我不是疯了吗?

Ecy*_*yrb 6

解决方法可能是更改DropDownStyleDropDown并添加以下内容:

comboBox.Validating += new CancelEventHandler((o, e) =>
    {
        e.Cancel = (comboBox.DataSource as string[]).Contains(comboBox.Text) == false;
    });
Run Code Online (Sandbox Code Playgroud)

这将允许用户键入任何内容,但除非他们键入有效项目,否则不会让他们远离控件.

不过,对于从XP变为Win 7的行为不满意.


bit*_*kar 2

修补程序将解决此问题。

  • 虽然此链接可以回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会变得无效。 (2认同)