Как изменить текст ячейки comboBox динамически добавляемого DataGridViewComboBoxColumn? - PullRequest
2 голосов
/ 17 июля 2011

Я все еще немного новичок в 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 Ответ

2 голосов
/ 17 июля 2011

Звучит так, как будто вы ищете 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;
...