2010-01-07 30 views
34

我主要是一名ASP.NET開發人員,但我正在開發一個WinForms應用程序,並注意到ASP.NET組合框(html選擇)與WinForms的區別。我發現(也許不正確),WinForm的組合框只有一個「標籤」,而ASP.NET允許你指定一個「標籤」和「值」。如何使用標籤和值創建Winforms組合框?

我正在尋找使用WinForms組合框(或另一個可比較的控件)的標籤和值(Foobar/42329)。這可能嗎?我試圖尋找答案,但沒有提出太多。如果沒有辦法做到這一點,那麼如何設計一個WinForm組合框來代表城市及其關聯的數據庫ID?

  • 多倫多/ 2324
  • 蒙特利爾/ 64547
  • 溫哥華/ 1213
+0

如果你不使用綁定,您可以使用此:http://support.microsoft.com/kb/319946,否則使用榨渣答案。 – 2012-12-10 02:56:50

回答

46

我能想到的幾種方法:

  • 覆蓋一個Cityreturn Name + "/" + Id;
  • 同上的ToString(),但有TypeConverter
  • 添加DisplayText屬性,返回相同的,與使用DisplayMember
  • 爲數據建立墊片類

在過去的:

var data = cities.Select(city => new { 
    Id = city.Id, Text = city.Name + "/" + city.Id }).ToList(); 
cbo.ValueMember = "Id"; 
cbo.DisplayMember = "Text"; 
cbo.DataSource = data; 
+2

我不知道組合框是如此強大......我利用這個解決方案,因爲我也是Linq newb,並決定走這條路。 Stackoverflow規則,謝謝你們! – nokturnal 2010-01-07 20:41:22

+1

似乎有點微不足道,但「Id = city.Id」可以簡化爲「city.Id」,因爲.Net將使用屬性設置器的名稱(如果沒有指定)。 – Arbiter 2012-02-02 20:56:56

+4

@仲裁者是的,我知道;我只是想明確地說......當我重命名事物時避免了意外; p。 – 2012-02-02 20:59:04

4

組合框可以通過設置其屬性DataSource綁定到對象的集合。

默認情況下,SelectedValue屬性將給出被選中的對象,並且列表將在每個對象上調用ToString並顯示結果。
但是,如果您設置ComboBox的DisplayMember屬性,它將顯示列表中DisplayMember中指定屬性的值。同樣,您可以設置ComboBox的ValueMember屬性,並且SelectedValue proeprty將返回由ValueMember命名的屬性的值。


因此,你需要將ComboBox綁定到具有NameValue屬性的對象的列表。
然後,您可以將組合框的[DisplayMember屬性設置爲NameValueMember屬性設置爲Value

編輯:你也可以調用Add方法,並給它一個這樣的對象,而不是數據綁定。或者,你可以將它綁定到一個List<T>或一個數組。

+0

有沒有辦法做到這一點,而無需數據綁定?我手動將項目添加到組合框。 – nokturnal 2010-01-07 20:14:57

+1

combobox.Items.Add – 2010-01-07 20:17:38

+0

如果您設置組合框的ValueMember/DisplayMember屬性,則不需要進行數據綁定。即使使用combobox.Add(yourobject),它也應該使用它們;問題在於你仍然需要一個名稱/值對象。 – 2010-01-07 20:19:40

6

你可以嘗試創建一個小的類名爲ComboBoxItem,像這樣:

public class ComboBoxItem<T> 
{ 
    public string Label { get; set; } 
    public T Value { get; set; } 

    public override string ToString() 
    { 
     return Label ?? string.Empty; 
    } 
} 

然後當你需要獲得一個對象時,只需將它轉換爲ComboBoxItem

+0

你爲什麼在一個字符串上調用'ToString'? – SLaks 2010-01-07 20:29:34

+2

他重寫「ToString」,以便它永遠不會爲空。如何 – EricLaw 2012-09-03 17:11:43

1

有一個屬性叫做DisplayMember =其值將被用於顯示的屬性的名稱,以及ValueMember,它是用於該值的屬性。

36

假設您的值是唯一的,您可以先填充字典,然後將組合框綁定到字典。不幸的是,數據綁定需要IList或IListSource,因此您必須將其包裝在Binding Source中。我找到了解決方案here

private void PopulateComboBox() 
    { 
     var dict = new Dictionary<int, string>(); 
     dict.Add(2324, "Toronto"); 
     dict.Add(64547, "Vancouver"); 
     dict.Add(42329, "Foobar"); 

     comboBox1.DataSource = new BindingSource(dict, null); 
     comboBox1.DisplayMember = "Value"; 
     comboBox1.ValueMember = "Key"; 
    } 
+0

嗨,你在VB中做到這一點,我在編譯時沒有錯誤,但是我已經在運行時 – 2010-09-23 12:35:23

+3

DisplayMember錯誤和ValueMember需要分配前的數據源定義 – CJxD 2012-04-13 08:39:40

+0

@CJxD否不這樣做,至少在NIT Windows窗體。 – 2012-04-13 12:47:43

1
 anestezi.DisplayMember = "Text"; 
     anestezi.ValueMember = "Value"; 
     anestezi.DataSource = new[] { 
      new { Text = "Genel", Value = "G" }, 
      new { Text = "Lokal", Value = "L" }, 
      new { Text = "Sedasyon", Value = "S" } 
     }; 
     anestezi.SelectedIndex = 0;