mayrhofer-simon Ответов: 1

Изменение значения combobox только для выбранной строки


У меня есть DataGridView с несколькими строками с 3 ComboBoxColumns. Если я изменю первый столбец ComboBoxColumn в третьей строке, это должно повлиять только на второй столбец ComboBox в третьей строке, где я сделал выбор. Вот вам пример

Ссылка на изображение

Когда я изменяю что-то в выделенной (серой) строке, это должно влиять только на поле со списком в серой строке.

Что я уже пробовал:

Не могли бы вы помочь мне с некоторыми идеями?

private String id;
private int row_number;

//Fill first Combo
private void fill_first_combo()
        {
            datagridview_col1.Items.Clear();

            if (datagridview.SelectedRows.Count > 0)
            {
                string rcs = db_conn.connection();

                using (var OraConn = new OracleConnection(rcs))
                {
                    using (var OraCmd = OraConn.CreateCommand())
                    {
                        try
                        {
                            OraConn.Open();
                            OraCmd.BindByName = true;

                            OraCmd.CommandText = "Oracle Command"
                            OracleDataReader OraDataReader = OraCmd.ExecuteReader();
                            if (OraDataReader.Read() == false)
                            {
                                //MessageBox
                            }
                            else
                            {
                                using (var OraDat = new OracleDataAdapter(OraCmd))
                                {
                                    using (var table = new DataTable())
                                    {
                                        OraDat.Fill(table);

                                        foreach (DataRow row in table.Rows)
                                        {
                                            foreach (DataColumn column in table.Columns)
                                            {
                                                if (row[column] != null)
                                                {
                                                    if (column.ColumnName == "COLUMNNAME")
                                                    {
                                                        datagridview_col1.Items.Add(row[column.ColumnName].ToString());
                                                        id = row[column.ColumnName].ToString().Substring(0, 6);
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        catch (OracleException ex)
                        {
                           //Exceptions
                        }
                        finally
                        {
                            OraConn.Dispose();
                        }
                    }
                }
            }
            else
            {
                //MessageBox
            }
        }

//Fill 2nd ComboBoxColumn
private void fill_combobox2(int row_number)
        {
            datagridview_col2.Items.Clear();

            string rcs = db_conn.connection();

            using (var OraConn = new OracleConnection(rcs))
            {
                using (var OraCmd = OraConn.CreateCommand())
                {
                    try
                    {
                        OraConn.Open();
                        OraCmd.BindByName = true;

                        OraCmd.CommandText = "Oracle Command with id as a Parameter";

                        var id_param = new OracleParameter("id", id);
                        OraCmd.Parameters.Add(id_param);

                        OracleDataReader OraDataReader = OraCmd.ExecuteReader();
                        if (OraDataReader.Read() == false)
                        {
                            //MessageBox
                        }
                        else
                        {
                            using (var OraDat = new OracleDataAdapter(OraCmd))
                            {
                                using (var combo2_table = new DataTable())
                                {
                                    OraDat.Fill(combo2_table);

                                    foreach (DataRow row in combo2_table.Rows)
                                    {
                                        foreach (DataColumn column in combo2_table.Columns)
                                        {
                                            if (row[column] != null)
                                            {
                                                if (column.ColumnName == "BUILDING_LESS")
                                                {
                                                        datagridview_col2.Items.Add(row[column.ColumnName].ToString());
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    catch (OracleException ex)
                    {
//Catch Exceptions
                    }
                    finally
                    {
                        OraConn.Dispose();
                    }
                }
            }
        }


//Trigger SelectionChange
private void datagridview_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            ComboBox cb = e.Control as ComboBox;
            if (cb != null)
            {
                cb.SelectedIndexChanged -= new EventHandler(selectionchange);

                cb.SelectedIndexChanged += selectionchange;
            }
        }


        private void selectionchange(object sender, EventArgs e)
        {
            try
            {
                //ComboBox cb = (ComboBox)sender;
                String selected = (sender as ComboBox).SelectedItem.ToString();

                if (datagridview.CurrentCell.ColumnIndex == 0)
                {
                    row_number = datagridview.CurrentCell.RowIndex;
                    id = selected.Substring(0, 6);
                    if (!String.IsNullOrEmpty(id))
                    {
                        fill_combobox2(row_number);
                    }
                    else if (String.IsNullOrEmpty(id))
                    {
                        //MessageBox);
                    }
                }
                else if (datagridview.CurrentCell.ColumnIndex == 1)
                {
                    section = selected.Substring(0, 2);
                    if (!String.IsNullOrEmpty(id) && !String.IsNullOrEmpty(value2))
                    {
                        //MessageBox
                    }
                    else if (String.IsNullOrEmpty(id) && !String.IsNullOrEmpty(value2))
                    {
                        //MessageBox
                    }
                    else if (String.IsNullOrEmpty(id) && String.IsNullOrEmpty(value2))
                    {
                        //MessageBox
                    }
                }
            }
            catch (Exception ex)
            {
                //MessageBox
            }
        }

Garth J Lancaster

"это должно повлиять только на ComboBox в серой строке" .. хорошо, но вы написали код, не так ли ? к сожалению, поскольку вы не показали нам код соответствующего события/обработчика щелчка, мы мало чем можем вам помочь .. как насчет использования Улучшите решение таким образом, мы можем увидеть код и наметить потенциальные проблемы ?

mayrhofer-simon

Теперь я обновил свой вопрос

1 Ответов

Рейтинг:
10

OriginalGriff

Используйте Практическое руководство.Событие CellClick[^] и проверьте столбец - его индекс передается в DataGridViewCellEventArgs[^] вместе с индексом строки.
Вы можете проверить, является ли это столбцом checkbox, и если да, то проверьте значение checkbox.
Затем вы используете RowIndex для обновления только этой строки.