कैसे एक ComboBox के लिए एक सूची बाँधने के लिए?


107

मैं BindingSourceक्लास ऑब्जेक्ट्स की एक सूची से कनेक्ट करना चाहता हूं और फिर ऑब्जेक्ट्स कॉम्बो बॉक्स में मूल्य।
क्या कोई सुझाव दे सकता है कि यह कैसे करना है?

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

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

मेरी कक्षा है और मैं इसके nameक्षेत्र को एक बाइंडिंग स्रोत से बाँधना चाहता हूँ जो तब कॉम्बो बॉक्स के साथ जुड़ा हो सकता है


Winforms मुझे जो चाहिए वह मुझे देश वस्तु नाम के क्षेत्र में डेटा मान कनेक्ट करने में मदद करता है बाकी मैं इसका पता
लगाऊंगा

जवाबों:


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किसी संपत्ति को वर्ग पर बाँध रहे हैं न कि किसी सार्वजनिक क्षेत्र में। यदि आप वर्ग का उपयोग public string Name { get; set; }करते हैं तो यह काम करेगा लेकिन यदि इसका उपयोग करता है तो यह public string Name;मूल्य तक नहीं पहुंच पाएगा और इसके बजाय कॉम्बो बॉक्स में प्रत्येक पंक्ति के लिए ऑब्जेक्ट प्रकार प्रदर्शित करेगा।


... जो स्पष्ट लग सकता है, लेकिन फिर सब कुछ स्पष्ट है :)
15

12
क्या आप समझा सकते हैं या bindingSource1घोषणा को जोड़ सकते हैं ?
beppe9000

1
System.Windows.Forms.BindingSource बाइंडिंग Source1;
2.718

है comboBox1.DataSource = bindingSource1.DataSource;सही? या यह होना चाहिए comboBox1.DataSource = bindingSource1;?
मसूद

27

एक बैकग्राउंडर के लिए, कॉम्बो बॉक्स / लिस्टबॉक्स का उपयोग करने के 2 तरीके हैं

1) देश की वस्तुओं को आइटम की संपत्ति में जोड़ें और चयनित के रूप में एक देश को पुनः प्राप्त करें। इसका उपयोग करने के लिए आपको देश के ToString को ओवरराइड करना चाहिए।

2) डेटाबाइंडिंग का उपयोग करें, डेटा स्रोत को एक आइलिस्ट (सूची <>) पर सेट करें और डिस्प्लेमेम्बर, वैल्यूमेम्बर और सेलेक्टवैल्यू का उपयोग करें

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
धन्यवाद, लेकिन एक समस्या का एक छोटा सा नाम यहाँ आवेदन करते समय कॉम्बोक्स में दिखाई नहीं दे रहा है
मोबिन

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 के साथ बदल दिया और सब कुछ ठीक है।
वेड हैटलर

0

कुछ इस तरह की कोशिश करो:

yourControl.DataSource = countryInstance.Cities;

और यदि आप WebForms का उपयोग कर रहे हैं, तो आपको इस पंक्ति को जोड़ना होगा:

yourControl.DataBind();

1
साथ ही comboBox1.DataBind (); फ़ंक्शन मैं इसे समाधानों में नहीं देखता हूं मैं
वाइनफॉर्म

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
कुछ नोट्स: एक बाइंडिंग स्रोत एक तरह का लिंक-थ्रू स्रोत है, आप वास्तव में अब इसका उपयोग नहीं कर रहे हैं, शायद ठीक है। लेकिन अगर आप इसे अन्य सामान को लिंक करने के लिए उपयोग करना चाहते हैं, तो member_cbx = बाइंडिंग सोर्स 1 का उपयोग करें;
हेनक होल्टरमैन

-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
यु_ओमिनाई
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.