【问题标题】:connect custom list with control like combobox将自定义列表与组合框等控件连接起来
【发布时间】:2010-08-21 11:20:00
【问题描述】:

我有表格 - 自定义 ID(如 1.10、1.20)和名称(值可以重复的字符串)。而我的问题是将其设置为 winForms 控件,如组合框。但我希望该用户在字段中只会看到名称,而 ID 将不可见,但下意识地应该连接到控制名称,当用户在组合框中选择项目时,我可以获得此 ID。

有没有可能?

【问题讨论】:

    标签: c# winforms list combobox


    【解决方案1】:

    像这样设置你的组合框:

    // item type to display in the combobox
    public class Item
    {
        public int Id { get; set; }
        public string Text { get; set; }
    }
    
    // build new list of Items
    var data = List<Item>
    {
        new Item{Id = 1, Text = "Item 1"},
        new Item{Id = 2, Text = "Item 2"},
        new Item{Id = 3, Text = "Item 3"}
    };
    
    // set databind
    comboBox1.DataSource = data;
    comboBox1.ValueMember = "Id";  // the value of a list item should correspond to the items Id property
    comboBox1.DisplayMember = "Text";  // the displayed text of list item should correspond to the items Id property
    
    // get selected value
    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        var selectedValue = comboBox1.SelectedValue;        
    }
    

    【讨论】:

    • 超级!超级!理想的解决方案:)
    【解决方案2】:

    使用DisplayMember 属性设置将显示的内容并使用ValueMember 设置它实际链接到的内容。

    例如在您的情况下,将DataSource 设置为表格,将DisplayMember 设置为名称,将ValueMember 设置为ID。

    【讨论】:

      【解决方案3】:

      绑定到列表:

      项目:

      class MyItem
      {
          public int Id { get; set; }
          public string DisplayText { get; set; }
      }
      

      设置绑定:

      List<MyItem> items = new List<MyItem>
      {
          new MyItem(){ Id = 1, DisplayText = "one"},
          new MyItem(){ Id = 2, DisplayText = "two"},
      };
      
      comboBox1.DisplayMember = "DisplayText"; // or whatever field your you want to display
      comboBox1.DataSource = items;
      

      寻找价值:

      private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
      {
          var item = comboBox1.SelectedItem as MyItem;
          if (item != null)
              Console.WriteLine(item.Id);
      }
      

      【讨论】:

        【解决方案4】:

        摆脱 ItemData 概念必须是微软做过的最愚蠢的事情之一。心里真的很麻木。

        这正是你所需要的。

        这是一个模仿该行为的链接。 ItemData

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-28
          相关资源
          最近更新 更多