Как изменить текст ячейки comboBox динамически добавляемой DataGridViewComboBoxColumn?
Я все еще немного новичок в C#, но я использую Winforms, и у меня есть DataGridView, который подключен к источнику данных и заполняется правильно.
Я также добавил ComboBoxColumn во время выполнения. Этот ComboBoxColumn подключается к источнику данных, элемент отображения и значение элемента устанавливаются, устанавливается текст заголовка, а затем столбец добавляется в сетку данных. Соединение работает просто отлично, и когда пользователь нажимает, поле со списком заполняется, как и ожидалось.
Когда пользователь завершает новую строку в сетке, он, очевидно, выберет элемент в поле со списком, а затем вся строка обновится в моей базе данных, когда закончите.
Мой вопрос: когда эта сетка данных снова открывается или перерисовывается, она заполняется из-за свойства источника данных, но как я могу получить в ячейке comboBox значение VALUE, которое он выбрал изначально, а не просто пустое поле? Я знаю код получения значения из БД и ввода значения. Идеальным было бы, если бы я мог поместить эту переменную на дисплей comboBox. Имейте в виду, что comboBox по-прежнему привязан к данным, чтобы пользователь мог изменить значение, если он этого пожелает?
Я знаю, что в обычном элементе управления comboBox я должен просто установить свойство. Text. Но DataGridViewComboBox не имеет того же свойства.
Вот код для фактического подключения к данным и добавления comboBoxColumn:
public void AddComboBoxColumn(DataGridView datagridName, DataTable table, string headerText, int columnIndex)
{
DataGridViewComboBoxColumn column = new DataGridViewComboBoxColumn();
GetDisplayAndValueMembers(table, headerText); //Calls method that gets the datasource, displaymember, valuemember depending on column
column.DataSource = tableRef; //sets datasource to table referenced by column
column.DisplayMember = displayMember; //sets displaymember
column.ValueMember = valueMember; //sets valuemember
column.HeaderText = headerText; //changes headertext to displayed text
if (newColumnIndex == 0)
datagridName.Columns.Add(column); //added to end of datagrid
else
{
datagridName.Columns.RemoveAt(columnIndex);
datagridName.Columns.Insert(newColumnIndex, column); //added in specific index if needed
}
}
Это просто показывает связь с раскрывающимся списком. Очевидно, что много методов используются с большим количеством кода. Но это не проблема, так как работает нормально. Я не знаю, как решить проблему отображения ранее выбранного элемента в качестве текста в поле со списком?
1 ответ
Похоже, что вы ищете, это DataPropertyName
собственность ComboBoxColumn
, Это свойство создает связь между DataSource
из DataGridView
и выбранное значение ComboBoxColumn
,
Например, скажем, у вас есть список продуктов, отображаемых в комбинированных полях. Тогда у вас также будет ProductId в вашем DataGridView
DataSource
, Что-то вроде этого:
// There Orders is a data table coming from the db which includes the product id column
dataGridView1.DataSource = Orders;
// You set up your column just the same, with the DisplayMember and ValueMember
DataGridViewComboBoxColumn column = new DataGridViewComboBoxColumn();
GetDisplayAndValueMembers(table, headerText);
column.DataSource = tableRef; //sets datasource to table referenced by column
column.DisplayMember = displayMember; //sets displaymember
column.ValueMember = valueMember; //sets valuemember
column.HeaderText = headerText; //changes headertext to displayed text
//Now you also set the DataPropertyName
column.DataPropertyName = "ProductId"; // this is the name of a column or property from the grid datasource
dataGridView1.Columns.Add(column);
С DataPropertyName
установить у вас теперь будет привязка данных между ComboBoxColumn
и DataGridView
,
Если исходный источник данных абсолютно не может содержать значение свойства поля со списком, тогда вам нужно будет обработать все эти настройки сохранения и значения ComboBoxColumn
в пользовательском коде.
Чтобы установить выбранное значение DataGridViewComboBoxCell
все, что вам нужно сделать, это выбрать ячейку, а затем установить ее Value
имущество.
dataGridView1.Rows["rowname"].Cells["columnname"].Value = valueFromDb;