如何将列表绑定到ComboBox?


107

我想将A连接BindingSource到类对象列表,然后将对象值连接到ComboBox。
有人可以建议如何做吗?

public class Country
{
    public string Name { get; set; }
    public IList<City> Cities { get; set; }

    public Country()
    {
        Cities = new List<City>();
    }
}

是我的课程,我想将其name字段绑定到BindingSource,然后可以将其与ComboBox关联


Winforms我想要的是帮助我连接国家对象其余部分的名称字段中的数据值,我会弄清楚
Mobin

Answers:


160

当您指的是组合框时,我假设您不想使用2向数据绑定(如果是,请使用BindingList

public class Country
{
    public string Name { get; set; }
    public IList<City> Cities { get; set; }
    public Country(string _name)
    {
        Cities = new List<City>();
        Name = _name;
    }
}



List<Country> countries = new List<Country> { new Country("UK"), 
                                     new Country("Australia"), 
                                     new Country("France") };

var bindingSource1 = new BindingSource();
bindingSource1.DataSource = countries;

comboBox1.DataSource = bindingSource1.DataSource;

comboBox1.DisplayMember = "Name";
comboBox1.ValueMember = "Name";

要查找在绑定组合框中选择的国家,您可以执行以下操作:Country country = (Country)comboBox1.SelectedItem;

如果要ComboBox动态更新,则需要确保已设置为DataSource实现的数据结构IBindingList;一种这样的结构是BindingList<T>


提示:请确保将绑定DisplayMember到类的Property而不是公共字段。如果您使用类public string Name { get; set; },它将起作用,但是如果使用public string Name;,它将无法访问该值,而是在组合框中显示每一行的对象类型。


...这可能看起来很明显,但是事后看来一切都很明显:)
demoncodemonkey

12
您可以解释或添加bindingSource1的声明吗?
beppe9000,2015年

1
System.Windows.Forms.BindingSource bindingSource1;
2.718 2016年

是对的comboBox1.DataSource = bindingSource1.DataSource;吗 还是应该这样comboBox1.DataSource = bindingSource1;
Masoud

27

对于背景技术,有两种使用ComboBox / ListBox的方法

1)将“国家对象”添加到“项目”属性,并检索“国家”作为“选定项”。要使用此功能,您应该覆盖Country的ToString。

2)使用DataBinding,将DataSource设置为IList(List <>)并使用DisplayMember,ValueMember和SelectedValue

对于2),您首先需要国家列表

// not tested, schematic:
List<Country> countries = ...;
...; // fill 

comboBox1.DataSource = countries;
comboBox1.DisplayMember="Name";
comboBox1.ValueMember="Cities";

然后在SelectionChanged中,

if (comboBox1.Selecteditem != null)
{
   comboBox2.DataSource=comboBox1.SelectedValue;

}

2
谢谢,但是有点问题,在运行应用程序时,组合框中的名称不可见
Mobin 2009年

23
public MainWindow(){
    List<person> personList = new List<person>();

    personList.Add(new person { name = "rob", age = 32 } );
    personList.Add(new person { name = "annie", age = 24 } );
    personList.Add(new person { name = "paul", age = 19 } );

    comboBox1.DataSource = personList;
    comboBox1.DisplayMember = "name";

    comboBox1.SelectionChanged += new SelectionChangedEventHandler(comboBox1_SelectionChanged);
}


void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    person selectedPerson = comboBox1.SelectedItem as person;
    messageBox.Show(selectedPerson.name, "caption goes here");
}

繁荣。


1
除了SelectionNETd事件在.NET 4.0中的控件上似乎没有出现以外,此方法有效。我用SelectionChangeCommitted替换了它,一切都很好。
韦德·哈特勒

0

尝试这样的事情:

yourControl.DataSource = countryInstance.Cities;

如果使用的是WebForms,则需要添加以下行:

yourControl.DataBind();

1
以及comboBox1.DataBind(); 函数,我在解决方案中看不到它,我正在使用
Winforms

0
public class Country
{
    public string Name { get; set; }
    public IList<City> Cities { get; set; }

    public Country()
    {
        Cities = new List<City>();
    }
}

public class City 
{
    public string Name { get; set; } 
}

List<Country> Countries = new List<Country>
{
    new Country
    {
        Name = "Germany",
        Cities =
        {
            new City {Name = "Berlin"},
            new City {Name = "Hamburg"}
        }
    },
    new Country
    {
        Name = "England",
        Cities =
        {
            new City {Name = "London"},
            new City {Name = "Birmingham"}
        }
    }
};
bindingSource1.DataSource = Countries;
member_CountryComboBox.DataSource = bindingSource1.DataSource;
member_CountryComboBox.DisplayMember = "Name";
member_CountryCombo

Box.ValueMember = "Name";

这是我现在使用的代码。


1
一些注意事项:bindingSource是一种链接源,您现在还没有真正使用它,可能还可以。但是,如果要使用它来链接其他内容,请使用member_cbx = bindingSource1;。
汉克·霍尔特曼

-1

如果使用的是ToolStripComboBox,则不会暴露任何数据源(.NET 4.0):

List<string> someList = new List<string>();
someList.Add("value");
someList.Add("value");
someList.Add("value");

toolStripComboBox1.Items.AddRange(someList.ToArray());

3
在这种情况下,您需要使用ToolstripComboBox.ComboBox.DataSource。看起来像是ToolstripComboBox普通纸的包装纸ComboBox
yu_ominae
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.