목록을 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필드를 ComboBox와 연결할 수있는 BindingSource 에 바인딩하고 싶습니다.


내가 원하는 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. 그러한 구조 중 하나는 BindingList<T>.


팁 : DisplayMember공용 필드가 아닌 클래스의 속성 에을 바인딩하고 있는지 확인하십시오 . 클래스에서 사용 public string Name { get; set; }하는 경우 작동하지만 사용 public string Name;하는 경우 값에 액세스 할 수없고 대신 콤보 상자의 각 줄에 대한 개체 유형을 표시합니다.


... 그것은 분명해 보일지 모르지만 모든 것이 뒤늦게 분명합니다 :)
demoncodemonkey

12
bindingSource1의 선언 을 설명하거나 추가 할 수 있습니까 ?
beppe9000 2015 년

1
System.Windows.Forms.BindingSource bindingSource1;
2.718

comboBox1.DataSource = bindingSource1.DataSource;맞습니까? 아니면 그럴까요 comboBox1.DataSource = bindingSource1;?
Masoud

27

백그 라운더의 경우 ComboBox / ListBox를 사용하는 두 가지 방법이 있습니다.

1) Items 속성에 Country 개체를 추가하고 Country를 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로 바꾸었고 모든 것이 잘되었습니다.
Wade Hatler 2014

0

다음과 같이 시도하십시오.

yourControl.DataSource = countryInstance.Cities;

WebForms를 사용하는 경우 다음 줄을 추가해야합니다.

yourControl.DataBind();

1
뿐만 아니라 comboBox1.DataBind (); 함수 내가 winforms를 사용하고있는 솔루션에서 그것을 보지 못합니다
Mobin

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;
Henk Holterman

-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.DataSource. 그것은 ToolstripComboBox보통의 래퍼 처럼 보입니다 ComboBox.
yu_ominae 2013
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.