2015-04-22 39 views
1

在2015年的WinForms這確實是一個錯誤或我只是在做我一些錯誤......的WinForms組合框的錯誤 - 2項具有相同的值,但不同的密鑰

1)創建一個新的WinForms項目(.NET 4.0 )並添加一個組合框到主窗體。 2)使用此爲您的形式加載代碼:除非我要瘋了

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load 

    Dim items As New Dictionary(Of Integer, String) 

    items.Add(1, "Value 1") 
    items.Add(2, "Value 2") 
    items.Add(3, "Value 3") 
    items.Add(4, "Value 3") 

    Dim dataSource As New BindingSource(items, Nothing) 
    ComboBox1.DataSource = dataSource 

    ComboBox1.DisplayMember = "Value" 
    ComboBox1.ValueMember = "Key" 

End Sub 

通知項目3 & 4如何具有相同的值,但不同的密鑰,且顯示器和價值的成員設置是否正確(,其是可能的)。當您運行該應用程序時,打開組合框並選擇最後一個項目。現在,再次打開組合框,您會注意到現在選擇了倒數第二項。這是一個問題。

有什麼想法?

謝謝!

編輯:我添加了一個Infragistics的UltraComboEditor的形式,放在下面的代碼在窗體加載事件:

For Each item As KeyValuePair(Of Integer, String) In items 
     UltraComboEditor1.Items.Add(New ValueListItem With {.DataValue = item.Key, .DisplayText = item.Value}) 
    Next 

    UltraComboEditor1.SelectedIndex = 0 
    UltraComboEditor1.AutoComplete = True 

的Infragistics的控制讓我自動完成,並進入我自己的文字,它是不會改變我當我選擇與上面的項目具有相同文本的項目時進行選擇。 Winforms控件不應該改變我的選擇。

+0

將下拉樣式更改爲'DropDownList'。用戶可以將部分文本輸入爲DropDown樣式,並且CBO將搜索與文本部分中輸入內容相匹配的第一個文本。你顯然不喜歡這個。 – Plutonix

+0

用戶需要能夠輸入自己的值,這是支持與DropDownList? – DonnieDarko

+0

這不是我不喜歡它,而是我明確地選擇了第4項,並以某種方式將控制權交給第3項。我需要所有這些功能,並且我需要用戶能夠開始輸入並選擇第一個。這個問題與用戶輸入任何內容無關。 – DonnieDarko

回答

1

ComboBox允許編輯文本部分時,它將模式匹配並突出顯示匹配的第一個前綴文本。這有副作用,當列表框關閉時,所選項目被更新。

ComboBox'sDropDownStyle == DropDownList模式時,則先前選擇的項目將在下拉列表中突出顯示。

您可以通過將NativeWindow指定給list窗口來更改行爲,然後監聽LB_SETCURSELMsg

您可以使用此線程爲出發點:Prevent AutoSelect behavior of a System.Window.Forms.ComboBox (C#)

int index字段添加到數據對象。然後在Register方法增加:

combo.SelectedIndexChanged += delegate { 
     data.index = combo.SelectedIndex; 
    }; 

然後通過Data到本地窗口,它記錄了先前選擇的索引。

private class NW : NativeWindow { 
    Data data; 
    public NW(IntPtr handle, Data data) { 
     this.AssignHandle(handle); 
     this.data = data; 
    } 

    private const int LB_FINDSTRING = 0x018F; 
    private const int LB_FINDSTRINGEXACT = 0x01A2; 
    private const int LB_SETCURSEL = 0x0186; 

    protected override void WndProc(ref Message m) { 
     if (m.Msg == LB_FINDSTRING) 
      m.Msg = LB_FINDSTRINGEXACT; 

     if (m.Msg == LB_SETCURSEL) 
      m.WParam = (IntPtr) data.index; 

     base.WndProc(ref m); 
    } 
} 
+0

非常感謝你,這會做訣竅,如果我不需要自動完成。我真的不明白爲什麼當用戶用鼠標在列表中選擇了一個項目並且沒有輸入任何內容時它會自動完成。這就是爲什麼我會認爲這是一個錯誤,它不應該這樣做(像Infragistics)。我確實需要自動完成行爲,所以我只是要切換到Infrgistics或DevExpress控件來處理這種情況,而沒有這個小問題。我只是好奇,如果我可能是數據綁定不正確或設置屬性錯誤或什麼的。 – DonnieDarko

+0

如果語句可以取出'm.Msg == LB_FINDSTRING',這可能會使自動完成再次工作。這真的只是在另一個線程上的解決方案。 – Loathing

+0

對不起,我已經能夠回到這個年齡了。希望儘快嘗試...再次感謝! – DonnieDarko

相關問題