Dot-Net
在 Windows 7 中 DropDownStyle = DropDownList 時,ComboBox.SelectedValue 與顯示的文本不匹配
假設我們在 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顯示。SelectedValue_ComboBox
ComboBox當我在and 選項卡中鍵入“Bucket”時,我遇到了意外的行為。出於某種原因,ComboBox顯示“船”,但TextBox顯示“桶”。我希望他們都顯示“桶”。如果我將其更改
DropDownStyle為,它的行為與預期相同DropDown,但我不希望使用者能夠輸入他們想要的任何內容。他們應該只能鍵入列表中的項目。更有趣的是,在鍵入“Bucket”並跳動之後,如果我再次鍵入“Bucket”,它將在兩者中顯示“Bucket”。如果我進行第三次嘗試,它會返回“Boat”用於
ComboBox“TextBox”,“Bucket”用於“TextBox”。因此,它似乎在所有 B 中循環。直到我最近從 XP 升級到 Windows 7 才注意到這一點。我不明白這與這有什麼關係,但我還是把它扔掉了。
如果這種行為是正確的,誰能告訴我應該做些什麼來實現我的預期行為?
更新 這似乎與Windows 7 有關。在 Windows XP 模式下,一切都按預期執行。其他執行 Windows 7 的人可以嘗試我的程式碼並驗證我沒有發瘋嗎?
此修補程序將解決此問題。
解決方法可能是更改
DropDownStyletoDropDown並添加以下內容:comboBox.Validating += new CancelEventHandler((o, e) => { e.Cancel = (comboBox.DataSource as string[]).Contains(comboBox.Text) == false; });這將允許使用者鍵入任何內容,但除非他們鍵入有效項目,否則不會讓他們離開控制項。
儘管如此,對從 XP 到 Win 7 的行為變化還是不滿意。