2008-10-13 32 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設置爲我想返回的值。除了數據表可能還有更好的東西,但這些是我在使用這些功能時使用的東西。

相關問題