リストをComboBoxにバインドする方法


107

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

回答:


160

あなたがコンボボックスを参照しているので、私はあなたが双方向のデータバインディングを使用したくないと仮定しています(もしそうなら、の使用を見てください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。そのような構造の1つですBindingList<T>


ヒント:をDisplayMemberパブリックフィールドではなく、クラスのプロパティにバインドしていることを確認してください。クラスを使用public string Name { get; set; }すると機能しますが、使用public string Name;すると値にアクセスできなくなり、代わりにコンボボックスの各行のオブジェクトタイプが表示されます。


...それは明白に思えるかもしれませんが、その後すべてが後から明らかです:)
demoncodemonkey

12
bindingSource1の宣言を説明または追加できますか?
beppe9000

1
System.Windows.Forms.BindingSource bindingSource1;
2.718

あるcomboBox1.DataSource = bindingSource1.DataSource;正しいですか?それともそうcomboBox1.DataSource = bindingSource1;ですか?
Masoud

27

背景については、ComboBox / ListBoxを使用する2つの方法があります。

1)国オブジェクトをItemsプロパティに追加し、国をSelecteditemとして取得します。これを使用するには、国の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

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
これは、SelectionChangedイベントが.NET 4.0のコントロール上にないように見えることを除いて機能します。私はそれをSelectionChangeCommittedで置き換えましたが、すべて順調です。
ウェイドハトラー、2014

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は一種のリンクスルーソースです。あなたは今それを実際には使用していません。おそらくOKです。しかし、それを使用して他のものをリンクする場合は、member_cbx = bindingSource1;を使用します。
ヘンクホルターマン

-1

ToolStripComboBoxを使用している場合、公開されているDataSourceはありません(.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.DataSourceToolstripComboBox普通のラッパーのようですComboBox
yu_ominae 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.