【发布时间】:2011-01-01 08:42:29
【问题描述】:
假设我们在 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);
这里没有魔法,只是一个绑定到字符串列表的ComboBox。 TextBox 显示ComboBox 的SelectedValue。
当我在 ComboBox 中键入“Bucket”并离开时,我遇到了意外行为。出于某种原因,ComboBox 显示“Boat”,但TextBox 显示“Bucket”。我希望他们都显示“桶”。
如果我将DropDownStyle 更改为DropDown,它会按预期运行,但我不希望用户能够输入他们想要的任何内容。他们应该只能键入列表中的项目。
更有趣的是,在键入“Bucket”并跳开后,如果我再次键入“Bucket”,它会在两者中显示“Bucket”。如果我进行第三次尝试,它会返回到 ComboBox 的“Boat”和“TextBox”的“Bucket”。所以它似乎在所有 B 中循环。
直到我最近从 XP 升级到 Windows 7 时才注意到这一点。我不明白这与这有什么关系,但我还是把它扔掉了。
如果这种行为是正确的,谁能告诉我应该做些什么来实现我的预期行为?
更新这似乎与 Windows 7 相关。在 Windows XP 模式下,一切都按预期运行。其他运行 Windows 7 的人可以尝试我的代码并验证我没有发疯吗?
【问题讨论】:
-
我完全采用了您的代码并将其扔到一个新的表单上,并且无法重现该行为。您可能会尝试连接 SelectedIndexChanged 事件并在其中输入一些控制台消息,然后在您键入组合时查看发生了什么。
-
我添加了
comboBox.SelectedIndexChanged += new EventHandler(delegate { Console.WriteLine("SelectedIndex = {0}", comboBox.SelectedIndex); });,输出显示SelectedIndex更改为“2”,然后更改为“3”,这与TextBox显示的内容相匹配。 -
如果这是一个可重现的错误,您应该将其提交给 Microsoft Connect:connect.microsoft.com/VisualStudio
-
我希望其他运行 Win7 的人可以先确认一下,但我已经继续并打开了一个错误:connect.microsoft.com/VisualStudio/feedback/…。
-
我刚刚尝试过,我也可以复制(尽管我没有尝试查看它是否可以在 XP 上复制)。我已对您的 Connect 错误表示赞成并声明我可以复制它。这个问题现在可以结束了。
标签: .net winforms data-binding windows-7 combobox