2012-12-31 202 views
0

這可能是不可能的或有點錯了,但在WinForms我有組合框需要填充特定的選項。該項目使用了大約10種不同的形式,都具有相似但略有不同的功能:因此,爲什麼我不使用一種形式並根據需要隱藏/顯示控件。傳遞枚舉作爲參數 - 作爲字典(的字符串,枚舉)(VB 2012)

現在我做了一個簡單的選項字典並用Enum提供值。現在我意識到我有重複的代碼,並希望整合它。選項集是日期順序和名稱順序,但我還有一兩個要列出。

這是我做過嘗試,但不能把字典爲:

Public Sub BuildOrderOptions(nameorder As ComboBox, Options As Dictionary(Of String, [Enum])) 

    nameorder.Items.Clear() 

    For Each item In Options 
     nameorder.Items.Add(item) 
    Next 
    nameorder.DisplayMember = "Key" 
    nameorder.ValueMember = "Value" 
End Sub 

Property NameOrderOptions As New Dictionary(Of String, PersonList.orderOption) From {{"First Name", PersonList.orderOption.FirstName}, 
                        {"Last Name", PersonList.orderOption.LastName}, 
                        {"Room Number", PersonList.orderOption.RoomNumber}} 

Property DateOrderOptions As New Dictionary(Of String, OrderDate) From {{"Newest First", OrderDate.NewestFirst}, {"Oldest First", OrderDate.OldestFirst}} 

我試着輸入一些變化和[枚舉] .getnames等,但我無法通過不同的詞典類型 - 我認爲我已經過度複雜了整個業務,但現在感覺我錯過了一個優雅的解決方案。不久,我將轉換回單獨的字符串匹配,或只是每個盒子類型的功能 - 邪惡的重複,但我可以繼續前進。

我是否認爲有一個更好的方法來做到這一點?除非我只是爲選項定義某種全局資源 - 但全局變量是不對的?

編輯:固定感謝史蒂文。如果任何人發現它有用或者更好,任何人都可以批評和更好,這裏是所有表單可以用來生成他們的選項的模塊代碼。

Public Sub BuildOrderOptions(nameorder As ComboBox, Options As IDictionary) 
    nameorder.Items.Clear() 
    For Each item In Options 
     nameorder.Items.Add(item) 
    Next 
    nameorder.DisplayMember = "Key" 
    nameorder.ValueMember = "Value" 
End Sub 

Property NameOrderOptions As New Dictionary(Of String, orderOption) From {{"First Name", orderOption.FirstName}, 
                        {"Last Name", orderOption.LastName}, 
                        {"Room Number", orderOption.RoomNumber}} 

Property DateOrderOptions As New Dictionary(Of String, OrderDate) From {{"Newest First", OrderDate.NewestFirst}, {"Oldest First", OrderDate.OldestFirst}} 

Property personStatusOptions As New Dictionary(Of String, personStatus) From {{"Active", personStatus.Active}, 
                        {"InActive", personStatus.InActive}, 
                        {"All", personStatus.All}} 

Public Sub BuildComboBoxes(ListBoxes As Dictionary(Of ComboBox, IDictionary)) 
    For Each pair In ListBoxes 
     BuildOrderOptions(pair.Key, pair.Value) 
    Next 
End Sub 

Public Enum OrderDate 
    OldestFirst 
    NewestFirst 
End Enum 

Public Enum personStatus 
    Active 
    InActive 
    All 
End Enum 

Public Enum orderOption 
    None 
    FirstName 
    LastName 
    RoomNumber 
End Enum 

這裏是我使用它得到一個表格的方式 - 是的,我可以有一大堆的參數或多個函數調用:我只是想有一個對象給我一個單一的參數來傳遞。

BuildComboBoxes(New Dictionary (Of ComboBox , IDictionary) From {{NameOrder, NameOrderOptions}, 
                    {DateOrder, DateOrderOptions}, 
                    {personStatus, PersonStatusOptions}}) 

回答

2

你只需要改變你的方法來接受任何IDictionary對象,而不是特定類型的詞典:

Public Sub BuildOrderOptions(nameorder As ComboBox, Options As IDictionary) 

當您使用仿製藥,如Dictionary(Of TKey, TValue),泛型類型是不是真的一種類型。您可以將它想象爲任意數量的特定類型的模板。因此,每次使用使用不同類型參數的泛型類型時,它們都是完全不同和不兼容的類型。例如:

' This works fine because both d1 and d2 are exactly the same type 
Dim d1 As New Dictionary(Of String, String)() 
Dim d2 As Dictionary(Of String, String) = d1 

' This will not compile because d1 and d2 are completely different types 
Dim d1 As New Dictionary(Of String, Integer)() 
Dim d2 As Dictionary(Of String, Boolean) = d1 

正如你已經發現了,即使你試圖使用一個基類的泛型類型參數,兩者仍然不兼容。因此,即使StreamMemoryStream的基類,你仍然不能做到這一點:

' This will not compile because d1 and d2 are completely different types 
Dim d1 As New Dictionary(Of String, MemoryStream)() 
Dim d2 As Dictionary(Of String, Stream) = d1 
+2

你固定它!尼斯之一。它不會讓我很快接受你的回答:)。這正是我無法想到的信息 - 過於集中在枚舉位上。謝謝。我喜歡這個網站:)。 –