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显示SelectedValue的ComboBox.
当我在" ComboBox标签"中输入"Bucket"时,我会遇到意外行为.由于某种原因,ComboBox显示"船"但TextBox显示"桶".我希望他们都能显示"Bucket".
如果我更改DropDownStyle为DropDown,它的行为与预期一致,但我不希望用户能够键入他们想要的任何内容.他们应该只能输入列表中的项目.
更有趣的是,在输入"Bucket"并跳出标签后,如果我再次输入"Bucket",它将同时显示"Bucket".如果我进行第三次尝试,它将返回"船",ComboBox而"Bucket"则返回"TextBox".所以看起来它正在骑自行车穿过所有的B.
在我最近从XP升级到Windows 7之前,我没有注意到这一点.我不明白这与此有什么关系,但无论如何我都把它丢掉了.
如果这种行为是正确的,有人能告诉我我应该做些什么来实现我预期的行为吗?
UPDATE 这似乎这是因为预计在Windows XP模式与Windows 7的一切行为方式.任何运行Windows 7的人都可以尝试我的代码并验证我不是疯了吗?
解决方法可能是更改DropDownStyle为DropDown并添加以下内容:
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的行为不满意.
| 归档时间: |
|
| 查看次数: |
10394 次 |
| 最近记录: |