จะผูกรายการเข้ากับ 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

ตามที่คุณอ้างถึง combobox ฉันสมมติว่าคุณไม่ต้องการใช้การเชื่อมต่อฐานข้อมูลแบบ 2 ทาง (ถ้าเป็นเช่นนั้นให้ดูที่การใช้ a 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";

เพื่อหาประเทศที่เลือกใน ComboBox Country country = (Country)comboBox1.SelectedItem;ถูกผูกไว้คุณจะทำสิ่งที่ชอบ:

หากคุณต้องการให้ ComboBox อัปเดตแบบไดนามิกคุณจะต้องตรวจสอบให้แน่ใจว่าโครงสร้างข้อมูลที่คุณตั้งไว้เป็นDataSourceเครื่องมือIBindingListนั้น 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

สำหรับพื้นหลังมี 2 วิธีในการใช้ ComboBox / ListBox

1) เพิ่ม Country Objects ในคุณสมบัติ Items และดึงข้อมูล Country เป็น Selecteditem ในการใช้สิ่งนี้คุณควรแทนที่ ToString of Country

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
ขอบคุณ แต่มีปัญหาเล็กน้อยที่นี่ชื่อจะไม่ปรากฏใน combobox เมื่อเรียกใช้แอปพลิเคชัน
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

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.