winforms 如何将列表绑定到组合框?

sxpgvts3  于 2022-11-25  发布在  其他
关注(0)|答案(7)|浏览(145)

我想将一个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关联

mdfafbf1

mdfafbf11#

由于您指的是组合框,我假定您不希望使用双向数据绑定(如果是这样,请考虑使用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;一种这样结构是X1 M4 N1 X。
提示:请确保将DisplayMember绑定到类的属性,而不是公共字段。如果类使用public string Name { get; set; },它将工作,但如果它使用public string Name;,它将无法访问值,而是显示组合框中每行的对象类型。

zqry0prt

zqry0prt2#

对于背景,有两种方法可以使用组合框/列表框
1)将Country对象添加到Items属性并检索Country作为Selecteditem。若要使用此属性,应重写Country的ToString。
2)使用数据绑定,将数据源设置为IList(List〈〉),并使用显示成员、值成员和选定值
对于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;

}
dsekswqp

dsekswqp3#

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");
}

轰的一声。

jv2fixgn

jv2fixgn4#

请尝试以下操作:

yourControl.DataSource = countryInstance.Cities;

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

yourControl.DataBind();
uqzxnwby

uqzxnwby5#

如果您使用的是ToolStripComboBox,则不会公开任何数据来源(.NET 4.0):

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

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

ix0qys7i6#

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_CountryComboBox.ValueMember = "Name";

这是我现在使用的代码。

u5rb5r59

u5rb5r597#

作为一个小的补充,我尝试合并一些类似于此代码的内容,但令人沮丧的是,从列表中添加/删除并没有反映在ComboBox中。这是因为添加/删除没有触发OnPropertyChange。
如果要添加/删除并在组合框中反映它们,则需要将List〈〉更改为ObservableCollection

List<Country> Countries

应替换为

private ObservableCollection<Country> countries;
    public ObservableCollection<Country> Countries
    {
        get { return countries; }
        set
        {
            countries= value;
            OnPropertyChanged("Countries");
        }
    }

OnPropertyChanged和ObservableCollection的来源

using System.Runtime.CompilerServices;
using System.Collections.ObjectModel;
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChangedEventHandler handler = this.PropertyChanged;
        if (handler != null)
        {
            var e = new PropertyChangedEventArgs(propertyName);
            handler(this, e);
        }
    }

所有这一切都在前面的一个解释here中更雄辩地表达了

相关问题