2013-12-22 111 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"; 

我希望这应该是你的问问

有用
相关问题