2008-10-13 33 views
2

我似乎无法找到一种简单易用的.net原生方法来获取.net winform上的组合框,以显示一个值并根据选择返回另一个值,而无需创建自己的帮助器类,并且知道winforms将会在放入它的对象上显示ToString方法。在.net组合框中显示一个值并存储另一个值的最佳方法是什么?

这就是我现在正在做的,非常普遍。首先,创建辅助类。

Public Class ListItem 
    Public Value As Object 
    Public DisplayString As String 

    Public Sub New(ByVal NewValue As Object, ByVal NewDisplayString As String) 
     Value = NewValue 
     DisplayString = NewDisplayString 
    End Sub 

    Public Overrides Function ToString() As String 
     Return DisplayString 
    End Function 
End Class 

然后,从集合或其他任何东西加载组合框。

For Each o as WhateverObject In CollectionIwantToaddItemsFrom 
     li = New ListItem(o.ValueToReturn, o.ValueToDisplay) 
     Me.ComboBox1.Items.Add(li) 
    Next 

最后,使用对象

Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles ComboBox1.SelectedIndexChanged 
if me.combobox1.selecteditem is nothing then exit sub 
Dim li As ListItem = me.ComboBox1.SelectedItem 
Dim o as object = li.value 
'do stuff with o. 
end sub 

我敢肯定有东西,我比较好在我眺望框架使用。它是什么?

回答

6

这有点破解,但这意味着你不必编写自己的名称 - 值对类 - 没什么大不了的(可能在框架中已经有了更好的东西)。但是你可以做的是使用DictionaryEntry类 - 它实际上是一个名称值对。将项添加到列表,然后使用组合框上的DataMember和ValueMember属性绑定到DictionaryEntry类的键和值属性。像这样:

var list = new List<System.Collections.DictionaryEntry>(); 
    list.Add(new System.Collections.DictionaryEntry("one", 1)); 
    list.Add(new System.Collections.DictionaryEntry("two", 2)); 
    list.Add(new System.Collections.DictionaryEntry("three", 3)); 

    comboBox1.DataSource = list; 
    comboBox1.DisplayMember = "Key"; 
    comboBox1.ValueMember = "Value"; 

刚刚意识到你更喜欢vb方言。下面对VB也是一样:-)

Dim list As List(Of DictionaryEntry) 

list = New List(Of DictionaryEntry) 
list.Add(New DictionaryEntry("One", 1)) 
list.Add(New DictionaryEntry("Two", 2)) 
list.Add(New DictionaryEntry("Three", 3)) 

ComboBox1.DataSource = list 
ComboBox1.DisplayMember = "Key" 
ComboBox1.ValueMember = "Value" 
1

由于缺乏对应用程序体系结构的更好理解,您可能采取了一种很好的方法。

通常情况下,我将组合框绑定到重写.ToString()方法的DAL对象。这提供了基本相同的功能,虽然我不得不将组合中选择的任何内容重新设置为其原始类型以获取“值”(通常是对应于实体PK的属性)。

0

那么,通常情况下,您在Items集合中放置的对象将拥有自己的ToString(),以呈现的形式呈现该对象。

但是,如果你想为你的对象显示一个完全不相关的字符串,那么你将不得不以你的方式去做。

0

我通常最终创建一个数据表并将此数据表设置为组合框的数据源。然后我将DisplayMember设置为我想要显示的列,并将ValueMember设置为我想返回的值。除了数据表可能还有更好的东西,但这些是我在使用这些功能时使用的东西。

相关问题