![](/img/trans.png)
[英]C# ComboBox in DataGridView with valuemember and displaymember
[英]combobox multiple valuemember single displaymember c#
我有這樣的數據...
id->name->floor
1->store1->1
2->store2->1
3->store2->2
4->store2->3
5->store3->2
我想將其添加到帶有這樣的顯示的combobox
...
store1
store2
store3
當我選擇store2時我想獲得valuemember = 2, 3, 4
我認為是一種邏輯(我尚未嘗試編寫代碼)...
當我選擇store2時,我只是得到valuemember = 2
之后我檢查database
中id
在表中是否具有相同name
。 但是我有500 ++數據,所以我認為這是浪費過程
任何想法??
注意 : 這只是示例表格,我不知道如何編碼,我只是進行設計
如果您給我實現組合框而不是cmd會有所幫助
您是否想輕松地檢索選定項目中的數據? 我更喜歡用特殊類型填充數據,以便可以直接從選中的項目中獲取數據。 因為Combox.Item.Add()
函數需要Object類型的參數,所以,我建議您首先可以以新類型定義數據,如下所示:
/// <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;
}
}
這是我的結果:
您可以在將數據放入組合框之前對其進行分組。 我整理了一個小示例 (按照鏈接進行運行或更改):
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()));
}
}
盡管此示例是一個Console應用程序,但我希望它顯示解決問題所需的主要步驟。 您將ComboBox綁定到分組操作的結果,並使用SelectedItem屬性訪問所選項目。 另外,您可以將值成員設置為“ Floors”,以使用SelectedValue屬性。
另外,將顯示成員設置為“名稱”,以便組合框顯示名稱。
要注意的一件事是,在分組時,您會丟失記錄的ID。 如果在這種情況下這是有價值的信息,則您需要調整分組語句,以使其不僅占據發言權,而且將ID放入分組項目中。 如果商店名稱的ID相同(示例數據中的ID則不是),則可以向MyGroupedData類添加Id屬性。
.NET可以在DataSource屬性中接受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";
我希望這對您的詢問有用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.