【问题标题】:combobox multiple valuemember single displaymember c#组合框多值成员单显示成员 C#
【发布时间】:2013-12-22 07:53:09
【问题描述】:

我有这样的数据...

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 会很有帮助

【问题讨论】:

    标签: c# combobox valuemember


    【解决方案1】:

    您想轻松检索所选项目中的数据吗?我更喜欢用它的特殊类型填充数据,以便可以直接从选定的项目中获取数据。因为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;
            }
        }
    

    这是我的结果:

    【讨论】:

      【解决方案2】:

      您可以在将数据放入 ComboBox 之前对其进行分组。我整理了一个小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 属性。
      此外,您将显示成员设置为“名称”,以便组合框显示名称。
      需要注意的一件事是,在分组时,您会丢失记录的 id。如果在这种情况下这是一个有价值的信息,您需要调整分组语句,以便它不仅占用发言权,而且还将 id 纳入分组项目。如果商店名称的 id 相同(在您的示例数据中不是这种情况),您可以将 Id 属性添加到 MyGroupedData 类。

      【讨论】:

        【解决方案3】:

        .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";
        

        我希望这对您的问题有用

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-05-14
          • 2016-09-09
          • 1970-01-01
          • 1970-01-01
          • 2023-04-10
          • 1970-01-01
          • 2019-02-01
          相关资源
          最近更新 更多