DataGridViewComboBox DataSource - PullRequest
       0

DataGridViewComboBox DataSource

3 голосов
/ 26 февраля 2012

В настоящее время у меня есть DataGridView шириной 2 столбца, первый столбец - DataGridViewTextBoxColumn, а второй - DataGridViewComboBoxColumn. У меня также есть предварительно сгенерированный общий список (строка), который должен использоваться в качестве источника данных для DataGridViewComboBox для каждой строки.

Наконец, у меня есть цикл, который перебирает ряд строк и анализирует их соответственно, с извлеченными значениями, применяемыми к соответствующим ячейкам, используя, как показано ниже:

dataGridView.Rows.Add("Column1Text", "Column2Text");

Данные вида сетки заполнены, как и ожидалось, вместе с DataGridViewComboBox, правильно отображающим идеальный элемент.

Проблема в том, что DataGridViewComboBox при нажатии не выпадает ни одного элемента. Я проверил, что DataGridViewComboBox содержит элементы. AutoSizeMode объекта DataGridViewTextBoxColumn установлен на «Fill», если он имеет какое-либо значение.

Любое понимание того, что я могу делать неправильно? Нужно ли вручную опускать элементы при нажатии на данную ячейку? Благодаря.

Обновление

Я пробовал два разных метода с точки зрения связывания общего списка в качестве источника данных.

Первый связывал источник данных всего столбца с помощью:

col_key.DataSource = KeyList;

Второй метод связывал DataSource каждого нового DataGridViewComboBoxCell в соответствующей строке:

(DataGridViewComboBoxCell)(row.Cells[1]).DataSource = KeyList;

Оба эти метода компилируют и правильно добавляют необходимые элементы во время выполнения, но при нажатии на них ни один элемент не выпадает.

Ответы [ 3 ]

1 голос
/ 22 августа 2012

Я решил обработать это в событии CellEnter:

private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
    {
        if (e.ColumnIndex == 2)
        {
            DataGridViewComboBoxCell cell = this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex] as DataGridViewComboBoxCell;
            if (cell.DataSource == null)
            {
                cell.DataSource = this._ComboItemsBindingSource;
                cell.DisplayMember = "Value"; //lite-weight wrapper on string
                cell.ValueMember = "Value";   //where Value is a property
            }
        }
    }
0 голосов
/ 25 апреля 2014

У меня была похожая проблема. Я обнаружил, что установка свойства EditMode DGV для EditOnEnter (это было ранее EditProgrammatics) устранила проблему. Это можно сделать в конструкторе.

0 голосов
/ 26 февраля 2012

Чтобы заполнить комбинированный столбец сетки, вы должны обращаться с ним как с обычным комбинированным списком, источник данных для комбинированного списка должен иметь элемент значения и элемент отображения, поэтому проверьте следующий пример:

//Coded by Amen Ayach's DataClassBuilder @26/02/2012
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public class iddesc{

    private int _id;
    public int id{
        get {
            return _id;
        }
        set {
            _id = value;
        }
    }

    private string _description;
    public string description{
        get {
            return _description;
        }
        set {
            _description = value;
        }
    }

}

Для заполнения сетки:

    private void FillData()
    {
        List<iddesc> DataList = new List<iddesc>();
        for (int i = 1; i < 11; i++)
        {
            DataList.Add(new iddesc() { id = i, description = "Desc" + i.ToString() });
        }
        ComboCol.ValueMember = "id";
        ComboCol.DisplayMember = "description";
        ComboCol.DataSource = DataList;

        for (int i = 0; i < 10; i++)
        {
            grd.Rows.Add();
            grd[ComboCol.Name, i].Value = DataList[i].id;//Here you deliver the valuemember
            grd[Column1.Name, i].Value = DataList[i].description;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...