2013-12-22 42 views
0

我有這樣的數據...組合框多valuemember單displaymember C#

id->name->floor 
1->store1->1 
2->store2->1 
3->store2->2 
4->store2->3 
5->store3->2 

我想這樣的顯示器將其添加在combobox ...

store1   
store2   
store3   

當我選擇商店2我想得到valuemember = 2, 3, 4

我認爲一個邏輯(我還沒有嘗試在代碼)...
當我選擇store2我只得到valuemember = 2之後我檢查了database哪個id在表中有相同的name。但我有500 ++的數據,所以我認爲這是浪費的過程

任何想法??

注: example 這只是抽樣的形式,我不知道如何代碼,我只是做設計
這將是有益的,如果你給我實施的ComboBox不要在cmd

回答

0

你想要輕鬆檢索所選項目中的數據?我更喜歡使用其特殊類型填充數據,以便可以直接從選擇的項目中獲取數據。因爲Combox.Item.Add()功能需要在對象類型prameter,所以,我建議你可以先在一個新的類型定義你的數據,這樣的:

/// <summary> 
/// my own data define 
/// </summary> 
public class MyFloor 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Floor { get; set; } 

    //very important, the result will be displayed in the combox 
    public override string ToString() 
    { 
     return string.Format("{0}->{1}->{2}", ID, Name, Floor); 
    } 
} 

然後,您可以填寫的數據到特殊類型COMBOX:

void FillData() 
    { 
     //load data from txt or database 
     List<MyFloor> floorList = new List<MyFloor>(){ 
      new MyFloor{ID=1, Name="store1", Floor="1"}, 
      new MyFloor{ID=2, Name="store2", Floor="1"}, 
      new MyFloor{ID=3, Name="store2", Floor="2"}, 
      new MyFloor{ID=4, Name="store2", Floor="3"}, 
      new MyFloor{ID=5, Name="store3", Floor="2"} 
      }; 
     //fill into combox 
     foreach (MyFloor floor in floorList) 
     { 
      this.comboBox1.Items.Add(floor); 
     } 
    } 

最後,你可以直接得到你的數據:

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     //retrieve data from selected item as MyFloor object 
     MyFloor floor = this.comboBox1.SelectedItem as MyFloor; 
     //show the selected data object 
     if (floor != null) 
     { 
      txtID.Text = floor.ID.ToString(); 
      txtName.Text = floor.Name; 
      txtFloor.Text = floor.Floor; 
     } 
    } 

這裏是我的結果: result show

0

您可以在將數據放入組合框之前對數據進行分組。我已經把一個小sample(後續運行或改變它的鏈接):

using System; 
using System.Collections.Generic; 
using System.Linq; 

    public class MyData 
    { 

    public int Id { get; set; } 
    public string Name { get; set; } 
    public int Floor { get; set; } 
} 

public class MyGroupedData 
{ 
    public string Name { get; set; } 
    public IEnumerable<int> Floors { get; set; } 
} 

public class Test 
{ 
    public static void Main() 
    { 
     MyData[] data = { 
      new MyData() { Id = 1, Name = "Store1", Floor = 1 }, 
      new MyData() { Id = 2, Name = "Store2", Floor = 1 }, 
      new MyData() { Id = 3, Name = "Store2", Floor = 2 }, 
      new MyData() { Id = 4, Name = "Store2", Floor = 3 }, 
      new MyData() { Id = 5, Name = "Store3", Floor = 2 }, 
     }; 
     var groupedData = from x in data group x by x.Name into grp 
      select new MyGroupedData() { Name = grp.Key, Floors = grp.Select(y => y.Floor) }; 
     foreach(var g in groupedData) 
      Console.WriteLine("{0} -> {1}", g.Name, string.Join(", ", g.Floors.Select(x => x.ToString()).ToArray())); 
    } 
} 

雖然此示例是一個控制檯應用程序,我希望它表明你需要解決你的問題的主要步驟。您將ComboBox綁定到分組操作的結果,並使用SelectedItem屬性訪問所選項目。此外,您可以將值成員設置爲「Floors」以便使用SelectedValue屬性。
此外,您將顯示成員設置爲「名稱」,以便ComboBox顯示名稱。
需要注意的一件事是,分組時,您會丟失記錄的標識。如果在這種情況下這是一個有價值的信息,那麼您需要調整分組聲明,以便它不僅佔用發言權,而且還會將id分配到組項中。如果商店名稱的id相同(在示例數據中不是這種情況),則可以將Id屬性添加到MyGroupedData類。

0

.NET有能力接受數據源屬性中的LINQ結果,列表,數據集等。 你可以做這樣的事情:

comboBox.DataSource = DataSetObject; 
    comboBox.DisplayMember = "DataTableFromDataSetObject.nameColumn"; 
    comboBox.ValueMember = "DataTableFromDataSetObject.idColumn"; 
    /*-------OR LINQ OBJECT-----------*/ 

    comboBox.DataSource = (from dt.Select() in row 
         select new {name = row["nameColumn"],id = row["idColumn"]}).ToList(); 
    comboBox.DisplayMember = "nameColumn"; 
    comboBox.ValueMember = "idColumn"; 

我希望這應該是你的問問

有用
相關問題