简体   繁体   中英

ComboBox Index Changed

Need to know: I am working with Windows Forms in Visual Studio and C#.

I have 5 comobobox's that I populate from SQL with the parts available in the DB. Part of the coding to it, one uses a DataTable and set the DataSource of the comboBox to that DataTable.

In this same DataTable via my SQL query, I have listed the cost of the part in the list. What I want to do is whichever part you pick from the dropdown list, the related price must show in the textbox next to it.

I am trying to use the comboBox1_SelectedIndexChanged for this, but the problem I run into is as soon as the DataSource gets set to the DataTable while the form's initial loading, it gets picked up as a Index change and the comboBox1_SelectedIndexChanged wants to run. But at this point in time, the SelectedIndex Value is null due to it still loading, causing it to give me a exception cast error.

how can I work around this?

DataTable SparePart = new DataTable() is declared outside the function to make it available as "public" so that the comboBox1_SelectedIndexChanged can access it.

Then I have this code to populate the comboBox :

                //Read Status info from DB
            SqlDataAdapter SparePartReader = new SqlDataAdapter(SQLSparePartDropbox);
            SparePartReader.Fill(SparePart);


            comboBoxFinJCSpares1.DataSource = SparePart;
            comboBoxFinJCSpares1.DisplayMember = "DisplayMember";
            comboBoxFinJCSpares1.ValueMember = "PartID";

                //Set Combox1 affiliated Cost value to cost textbox
            int ComBo1PartID = (int)comboBoxFinJCSpares1.SelectedValue;
            string CostPrice = (from DataRow dr in SparePart.Rows
                                where (int)dr["PartID"] == ComBo1PartID
                                select (string)dr["PartCost"]).FirstOrDefault();
            textBoxFinJCCost1.Text = CostPrice.ToString();

and then I have this for the comboBoxFinJCSpares1_SelectedIndexChanged :

            //Set Combox1 affiliated Cost value to cost textbox
        int ComBo1PartID = (int)comboBoxFinJCSpares1.SelectedValue;
        string CostPrice = (from DataRow dr in SparePart.Rows
                            where (int)dr["PartID"] == ComBo1PartID
                            select (string)dr["PartCost"]).FirstOrDefault();
        textBoxFinJCCost1.Text = CostPrice.ToString();

enter image description here

The solution is as easy as making one boolean variable and call it formLoaded.

Set it to false, then set it to true after the form loads.

Put your code for populating combobox inside if statement and that should do it

Cheers ~ ChenChi

demo:

        //Read Status info from DB
        if(formLoaded)
        {
            SqlDataAdapter SparePartReader = new SqlDataAdapter(SQLSparePartDropbox);
            SparePartReader.Fill(SparePart);


            comboBoxFinJCSpares1.DataSource = SparePart;
            comboBoxFinJCSpares1.DisplayMember = "DisplayMember";
            comboBoxFinJCSpares1.ValueMember = "PartID";

            //Set Combox1 affiliated Cost value to cost textbox
            int ComBo1PartID = (int)comboBoxFinJCSpares1.SelectedValue;
            string CostPrice = (from DataRow dr in SparePart.Rows
                            where (int)dr["PartID"] == ComBo1PartID
                            select (string)dr["PartCost"]).FirstOrDefault();
            textBoxFinJCCost1.Text = CostPrice.ToString();
        }

谢谢大家,Marcel Hoekstra建议的“ SelectedChangeCommitted”选项解决了我的问题。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM