簡體   English   中英

組合框多值成員單個顯示成員c#

[英]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之后我檢查databaseid在表中是否具有相同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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM