मैं डेटा स्रोत से एक combobox पॉप्युलेट कर रहा हूँ और मेरे पास कोड है जब उपयोगकर्ता combobox में चयन बदलता है। तो जाहिर है कि मैं नहीं चाहता कि चयनित इंडेक्स चेंज विधि में कोड फॉर्म लोड पर आग लग जाए।

इस SO प्रश्न का उत्तर दो बातों का सुझाव देकर दिया गया था:

1) कॉम्बोक्स में डेटा लोड करने से पहले और बाद में इस कोड का उपयोग करें:

private void LoadYourComboBox()
{
    this.comboBox1.SelectedIndexChanged -= new EventHandler(comboBox1_SelectedIndexChanged);
        // Set your bindings here . . .
    this.comboBox1.SelectedIndexChanged += new EventHandler(comboBox1_SelectedIndexChanged);
}

मैंने कोशिश की कि इस कोड के साथ:

this.cboSelectCategory.SelectedIndexChanged -= new EventHandler(cboSelectCategory_SelectedIndexChanged);

हालांकि, cboSelectCategory_SelectedIndexChanged भाग में लाल रंग की त्रुटि है और इसके ऊपर मँडराते हुए कहते हैं: The name cboSelectCategory_SelectedIndexChanged does not exist in the current context। मैंने उस कोड को form_load और वास्तव में combobox को पॉप्युलेट करने वाली विधि दोनों में करने की कोशिश की।

2) उसी SO प्रश्न का उत्तर SelectedIndexChangeCommitted ईवेंट का उपयोग करने के लिए था।

private void cboSelectCompany_SelectedIndexChangeCommitted(object sender, EventArgs e)
{
    string selectedCat = cboSelectCategory.SelectedValue.ToString();
    Console.WriteLine(selectedCat);
}

लेकिन जब मैं combobox में चयन बदलता हूं तो वह घटना फायरिंग नहीं कर रही है।

क्या मुझे कहीं कुछ याद आ रहा है? क्या मेरा कोड बंद है या गलत जगह पर है?

0
marky 18 मार्च 2020, 21:53

1 उत्तर

सबसे बढ़िया उत्तर

तो जाहिर है कि मैं नहीं चाहता कि चयनित इंडेक्स चेंज विधि में कोड फॉर्म लोड पर आग लग जाए।

यदि आप फॉर्म के कंस्ट्रक्टर (InitializeComponent() के बाद) में अपने कम्बोबॉक्स को बांधते हैं, तो फॉर्म दिखाई देने से पहले SelectedIndexChanged आग लग जाएगा, इसलिए यदि फॉर्म अदृश्य है तो आप केवल चयनित इंडेक्स चेंज किए गए ईवेंट से वापस आ सकते हैं:

    public MainForm()
    {
        InitializeComponent();

        DataTable dt = new DataTable();
        dt.Columns.Add("Name");
        dt.Columns.Add("Code");


        dt.Rows.Add("Milk", "MLK");
        dt.Rows.Add("Bread", "BRD_WHITE");
        dt.Rows.Add("Bread", "BRD_BROWN");
        dt.Rows.Add("Coffee", "COFF");

        comboBox1.DataSource = dt;
        comboBox1.DisplayMember = "Name";
        comboBox1.ValueMember = "Code";

    }


    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (!this.Visible)
            return;

        MessageBox.Show("a");
    }

इवेंट हैंडलर को हटाने और जोड़ने की कोशिश करने में गड़बड़ी करने की तुलना में अवांछित समय पर किसी ईवेंट हैंडलर से वापस लौटना अक्सर आसान होता है

साइड नोट: यदि आप दृढ़ता से टाइप किए गए डेटासेट का उपयोग करते हैं और विंडोज़ फॉर्म डिज़ाइनर का उपयोग करके बाइंडिंग बनाते हैं, तो ईवेंट सक्रिय नहीं होता है, मेरा मानना ​​है कि फॉर्म डिज़ाइनर InitializeComponent() प्रारंभ और अंत में घटकों पर प्रारंभ/एंडइनिट को कॉल करता है

1
Caius Jard 18 मार्च 2020, 19:27