C#ComboBox数据绑定

时间:2015-08-04 17:34:58

标签: c# combobox

我有一个例程,它打开一个记录集并构建一个组合框的Items集合。在谷歌搜索后,我找到了使用ComboboxItem类的方法。

public class ComboboxItem
{
    public string Text { get; set; }
    public object Value { get; set; }

    public override string ToString()
    {
        return Display;
    }
}

我的代码使用此类将项添加到ComboBox。当我运行应用程序并单击Combobox时,列表中的正确值...很棒!我的问题是,当表单从数据库加载记录时,它会查找与数据库值对应的相应列表值,而只是显示数据库中的值:例如英国而不是英国。当我尝试保存记录时,它会尝试保存“英国”而不是“英国”。所以我认为DisplayMember和ValueMember属性需要分配。我假设我需要将它们分配为“Text”和“Value”,但是当我这样做时,Combobox会显示相同值的列表。我做错了什么?

编辑:这是我放入ComboBox类的简化版本:

public class StandardComboBox : ComboBox
    {
        protected List<ComboboxItem> DataSourceList = new List<ComboboxItem>();

        public bool SetRecordSource(string Criteria)
        {
            ADODB.Recordset RS = new ADODB.Recordset();

            try
            {
                DataSourceList.Clear();

               // Open ADDOB.Recordset RS with the records specified in Criteria

               while (RS.EOF == false)
               {
            ComboboxItem MyComboboxItem = new ComboboxItem();
            MyComboboxItem.Value = RS.Fields[0].Value.ToString();
            MyComboboxItem.Display = RS.Fields[1].Value.ToString();

                    DataSourceList.Add(MyComboboxItem);

                    RS.MoveNext();
                }

                this.DataSource = DataSourceList;
                this.ValueMember = "Value";
                this.DisplayMember = "Display";

                return true;
            }
       }
}

2 个答案:

答案 0 :(得分:1)

首先,我认为你应该更好地命名你的班级(例如国家)。然后设置属性的名称。使用字符串作为数据类型。

public class Country
{
    public string ID { get; set; }
    public string Name { get; set; }
}

然后绑定组合框并设置DisplayMember和DisplayValue。

comboBox1.DataSource = listCountry;
comboBox1.DisplayMember = "Name";
comboBox1.ValueMember = "ID";

如果您想获取该值,只需使用SelectedValue。

private void button1_Click(object sender, EventArgs e)
{
    MessageBox.Show(comboBox1.SelectedValue.ToString());
}

完整的源代码。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication4
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            var listCountry = new List<Country>() {
                new Country() {ID = "UK", Name = "United Kingdom"},
                new Country() {ID = "US", Name = "United States of America"},
            };

            comboBox1.DataSource = listCountry;
            comboBox1.DisplayMember = "Name";
            comboBox1.ValueMember = "ID";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show(comboBox1.SelectedValue.ToString());
        }
    }

    public class Country
    {
        public string ID { get; set; }
        public string Name { get; set; }
    }
}

答案 1 :(得分:0)

我现在设法解决了这个问题。我来自MsAccess背景,例如你只需指定一个带有'UK'的组合框,并且组合框显示'United Kingdom'。在C#中它更复杂。如果要为组合框指定值,则必须使用FindString()方法来定位要显示的值,然后分配SelectedIndex属性以使其显示该值。这是一个球疼,但我可以将这个逻辑构建到我的班级,而不必再考虑它。感谢您的输入。 -