Найти значение в DataTable

111
26 января 2020, 12:50

(c# winforms sv2010 net4) На форме есть Datagridview1 с разными типами колонок: Combobox, TextBox (определены заранее). После запуска формы в Datagridview1 по кнопке "Добавить строку" добавляются строки (по одной). В коде "btn_AddRow_Click" в колонку DatagridviewCombobox загружается список значений из таблицы access "СПИСОК" из колонки1 "Название". В таблице access "СПИСОК" всего 4-ре колонки (пример ниже).

Название|Описание|Ед1|Ед2
аа|111|555|444
бб|222|222|777

Вопрос: Как после выбора значения из списка в DataGridViewComboBox (в добавленной строке в Datagridview1 это Column1), например, выбрано "аа", в DatagridviewTextBox (в Datagridview1 это Column2) вывести значение "111".

private void btn_AddRow_Click(object sender, EventArgs e)
        {
            int index = Datagridview1.Rows.Count;
            index++;
            Datagridview1.Rows.Add();
            int nRowIndex = Datagridview1.Rows.Count - 1;
            string connStr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="c:\1.mdb";
            string query = "";
            query = "SELECT * FROM СПИСОК";
            OleDbConnection cn = new OleDbConnection(connStr);
            OleDbDataAdapter da = new OleDbDataAdapter(query, cn);
            DataTable dt = new DataTable();
            da.Fill(dt);
            ArrayList StringList = new ArrayList();
            foreach (DataRow item in dt.Rows)
            {
                StringList.Add(item["Название"].ToString());
            }
            DataGridViewComboBoxCell Col = (DataGridViewComboBoxCell)Datagridview1.Rows[nRowIndex].Cells["Column1"];
            Col.Items.Clear();
            Col.DataSource = StringList;
        }

Получается так:(но как определить номер строки(вместо Rows[0]))?

private void Datagridview1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            string connStr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="c:\1.mdb";
            string query = "";
            query = "SELECT * FROM СПИСОК";
            OleDbConnection cn = new OleDbConnection(connStr);
            OleDbDataAdapter da = new OleDbDataAdapter(query, cn);
            DataTable dt = new DataTable();
            da.Fill(dt);
            if (Datagridview1.Rows[e.RowIndex].Cells["Column1"].Value != null)
            {
                if (Datagridview1.Rows[e.RowIndex].Cells["Column1"].Value.ToString().Length != 0)
                {
string S = dt.Rows[0]["Описание"].ToString();
                Datagridview1.Rows[e.RowIndex].Cells["Column2"].Value = S.ToString();
                }
            }
}
Answer 1
ComboBox cb;
DataGridViewCell currentCell;
private void Datagridview1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            if (cb != null)
            {
                cb.SelectionChangeCommitted -= new EventHandler(cb_SelectionChangeCommitted);
            }
        }
        private void Datagridview1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            if (Datagridview1.CurrentCell.ColumnIndex == 1)
            {
                if (e.Control is ComboBox)
                {
                    cb = (ComboBox)e.Control;
                    if (cb != null)
                    {
                        cb.SelectionChangeCommitted += new EventHandler(cb_SelectionChangeCommitted);
                    }
                    currentCell = Datagridview1.CurrentCell;
                }
            }
        }
        void cb_SelectionChangeCommitted(object sender, EventArgs e)
        {
            string connStr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="1.mdb";
            string query = "";
            query = "SELECT * FROM СПИСОК";
            OleDbConnection cn = new OleDbConnection(connStr);
            OleDbDataAdapter da = new OleDbDataAdapter(query, cn);
            DataTable dt = new DataTable();
            da.Fill(dt);
            DataRow[] findRow = dt.Select("Название = '" + cb.Text + "'");
            Datagridview1[currentCell.ColumnIndex + 1, currentCell.RowIndex].Value = findRow[0]["Описание"].ToString();
        }
READ ALSO
Как написать скрипт обхода зданий в unity

Как написать скрипт обхода зданий в unity

Подскажите пожалуйста как лучше написать скрипт движения персонажа в 2д игре с видом сверху так чтобы персонаж обходил или останавливался...

134
Перебор многомерного jagged массива

Перебор многомерного jagged массива

Ребят, решил после js изучать С#, сразу возникли сложностиНеобходимо перебрать двухмерный массив

128
Отсутствие класса OpenFileDialog в библиотеке Microsoft.Win32

Отсутствие класса OpenFileDialog в библиотеке Microsoft.Win32

У меня в решении два проектаВ главном проекте я могу обратиться к классу следующим образом:Microsoft

130
В чем разница в массивах IEnumerable<T> и List<T>?

В чем разница в массивах IEnumerable<T> и List<T>?

Возможно вопрос не совсем корректныйДопустим у нас имеется следующий код:

112