2015-04-22 23 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

相关问题