c# добавить строку dgv с dataGridViewComboBoxCell

В настоящее время я пытаюсь добавить ComboBox в dataGridView.

В DGV есть 5 столбцов: флажок, строка, строка, поле со списком, поле со списком.

оба столбца со списком настроены как столбцы datagridviewcombobox (через конструктор VisualStudio). Моя проблема заключается в добавлении строк.

Моя текущая попытка: столбцы уже определены, и я добавляю строки через dataGridView.Rows.Add. Для этого я использую массив объектов. Пример:

dataGridViewRow row = new dataGridViewRow();
object[] obj = new object[5] {true, "str1", "str2", null, null};
dataGridView1.Rows.Add(obj);

Это проходит без каких-либо ошибок. Но логически, поля со списком ничем не заполнены.

Я попытался установить источник данных в 4-ю и 5-ю ячейку строки:

Ошибка... Использование ROW.dataGridViewComboBoxCell.Items.Add: элементы не отображаются...

заполнение obj[3] и 4 новым DGVcomboBoxCell или -Column:

 Error... :The error message says "The dataGridViewComboBoxCell-Value is invalid.

Дополнительная информация: каждый столбец должен иметь одинаковые элементы в полях со списком. (Они предварительно загружаются через Интернет в формате xml). Установка источника данных для двух столбцов уничтожает весь DGV (я думаю, потому что у других столбцов нет источника данных). В двух словах: как добавить строки в DGV, которые содержат поля со списком, заполненные элементами?

С уважением, NoMad

edit: вот код для решения моей проблемы:

        DataGridViewCheckBoxColumn check = new DataGridViewCheckBoxColumn();
        check.Name = "Col1";
        dataGridView1.Columns.Add(check);

        dataGridView1.ColumnCount = 3;
        dataGridView1.Columns[1].Name = "Col2";
        dataGridView1.Columns[2].Name = "Col3";

        object[] row = new object[] { true, "str1", "str2" };
        dataGridView1.Rows.Add(row);

        DataGridViewComboBoxColumn combo1 = new DataGridViewComboBoxColumn();
        DataGridViewComboBoxColumn combo2 = new DataGridViewComboBoxColumn();

        combo1.Name = "Col4";
        combo1.Items.Add("100x100");
        combo1.Items.Add("200x200");

        combo2.Name = "Col5";
        combo2.Items.Add("option1");
        combo2.Items.Add("option2");

        dataGridView1.Columns.Add(combo1);
        dataGridView1.Columns.Add(combo2); 

Сначала добавьте строку, приведите столбцы, настройте их и добавьте в строку. Никакие столбцы не должны быть предварительно указаны в дизайнере.


person NoMad    schedule 09.10.2011    source источник


Ответы (3)


Вы можете использовать это решение для добавления элементов в столбец со списком представления данных.

 DataSet ds; //class variable
    public Form1()
    {
        InitializeComponent();

        ds = new DataSet();
        //column 1 (normal textColumn):
        dataGridView1.Columns.Add("col1", "Column1");
        //column 2 (comboBox):
        DataGridViewComboBoxColumn comboCol = new DataGridViewComboBoxColumn();
        comboCol.Name = "cmbColumn";
        comboCol.HeaderText = "combobox column";
        dataGridView1.Columns.Add(comboCol);

        //using dataTable for each datasource:             
        for (int i = 0; i < 10; i++)
        {
            string text = "item " + i; //data for text
            int[] data = { 1 * i, 2 * i, 3 * i }; //data for comboBox:

            //create new dataTable:
            DataTable table = new DataTable("table" + i);
            table.Columns.Add("column1", typeof(string));

            //fillig rows:
            foreach (int item in data)
                table.Rows.Add(item);

            //add table to dataSet:
            ds.Tables.Add(table);

            //creating new row in dgv (text and comboBox):
            CreateCustomComboBoxDataSouce(i, text, table);
        }
    }

    private void CreateCustomComboBoxDataSouce(int row, string texst, DataTable table) //row index ,and two parameters
    {
        dataGridView1.Rows.Add(texst);
        DataGridViewComboBoxCell comboCell = dataGridView1[1, row] as DataGridViewComboBoxCell;
        comboCell.DataSource = new BindingSource(table, null);
        comboCell.DisplayMember = "column1"; //name of column indataTable to display!!
        comboCell.ValueMember = "column1"; // vlaue if needed 
        //(mostly you used these two propertes like: Name as DisplayMember, and Id as ValueMember)
    }

если вышеуказанное не работает, взгляните на решение ниже.

вы можете сделать это через DataGridViewComboBoxCell. В соответствии с rowIndex ячейки установите другой источник данных (строка []) для другого DataGridViewComboBoxCell. Кодирую так:

    private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
    {
        if (e.ColumnIndex == 0)
        {
            DataGridViewComboBoxCell combo = this.dataGridView1[0, e.RowIndex] as DataGridViewComboBoxCell;

                if (e.RowIndex == 0)
                {
                    //these data will be displayed in comboBox:
                     string[] data= {"item A1", "item B1", "item C1"};  
                    combo.DataSource = data;
                }
                if (e.RowIndex == 1)
                {
                    //these data will be displayed in comboBox:
                    string[] data = {"item A2", "item B2", "item C2"};                        
                    combo.DataSource = data;
                }
                if (e.RowIndex == 2)
                {
                    //these data will be displayed in comboBox:
                    string[] data = { "item A3", "item B3", "item C3" };                           
                    combo.DataSource = data;
                }

            }
        }
    }    
person Enigma State    schedule 09.10.2011
comment
Спасибо за помощь, я понял, как это сделать немного проще: я просто ошибся методом dataGridView.Columns.Add, я думал, что каждый раз, когда добавляется строка, новый столбец добавляется во весь DGB тоже при использовании метод Columns.Add, поэтому я использовал Cells.Add. (что было не так) Добавление столбцов (в строку) после добавления строки - это трюк. Кстати, извините за мой плохой английский: P - person NoMad; 09.10.2011
comment
Я тестирую ваше первое решение в Linqpad, оно работает нормально. Но когда я использую его в дизайнере форм в Visual Studio, оно не отображает правильно ComboxCell. Это странно. - person zionpi; 26.06.2014
comment
Отличный пост, избавил меня от проблем, с которыми я столкнулся с DataGridView. - person Dano; 08.02.2019

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

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

Public Class Form1
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim newRow(1) As Object
        newRow(0) = "Foo"
        newRow(1) = "Bar"
        DataGridView1.Rows.Add(newRow)
    End Sub
End Class

Таким образом, «Foo» и «Bar» уже являются вариантами выбора в полях со списком. Я могу заполнить каждую строку, просто сославшись на нужный вариант по имени. Думаю, я мог бы также сделать это по номеру индекса, если бы захотел.

Надеюсь это поможет!

person Crownedjitter    schedule 09.10.2011

Если вам нужно сохранить настроенные столбцы, попробуйте что-то вроде этого:

dataGridView1.Rows.Add();
DataGridViewRow tmp = dataGridView1.Rows[dgvMatw.Rows.Count - 1];
tmp.Cells[0] = true;
tmp.Cells[1] = "str1";
tmp.Cells[2] = "str2";
((DataGridViewComboBoxCell)tmp.Cells[3]).Value = 1;
((DataGridViewComboBoxCell)tmp.Cells[4]).Value = 2;

Значения 1 и 2 приведены только в качестве примера. Это должен быть тип вашего DataGridViewComboBoxColumn.ValueMember. Я искал эту тему, поэтому я подумал, что кто-то может ее использовать.

person Tomek    schedule 18.04.2016