【问题标题】:c# add a dgv row with a dataGridViewComboBoxCellc# 添加带有 dataGridViewComboBoxCell 的 dgv 行
【发布时间】:2011-12-03 23:38:27
【问题描述】:

我目前正在尝试将 ComboBox 添加到 dataGridView。

在DGV中,有5列:checkbox、string、string、combobox、combobox。

两个组合框列都配置为 datagridview 组合框列(通过 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:项目不显示...

用新的 DGVcomboBoxCell 或 -Column 填充 obj[3] 和 4:

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

更多信息:每列在组合框中应具有相同的项目。 (这些以前是通过互联网加载的,作为 xml)。将数据源设置为两列会破坏整个 DGV(我认为是因为其他列没有数据源)。 简而言之:如何将行添加到包含填充项目的组合框的 DGV?

真诚地, 游牧民族

编辑:这里有一些代码可以解决我的问题:

        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); 

首先添加一行,转换列,配置它们并将它们添加到行中。 无需在设计器中预先指定任何列。

【问题讨论】:

    标签: c# winforms datagridview datagridviewcomboboxcell


    【解决方案1】:

    您可以使用此解决方案将项目添加到 datagird 视图组合框列

     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 来完成。根据cell的rowIndex,设置不同的datasource(string[])到不同的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;
                    }
    
                }
            }
        }    
    

    【讨论】:

    • 感谢您的帮助,我想出了更简单的方法:我刚刚弄错了 dataGridView.Columns.Add 方法,我以为每次添加一行时,都会添加一个新列使用 Columns.Add 方法时也添加到整个 DGB,所以我使用了 Cells.Add。 (出了什么问题)在添加行之后添加列(到一行)是诀窍。顺便说一句,对不起我糟糕的英语:P
    • 我在 Linqpad 中测试了您的第一个解决方案,它工作正常。但是当我在 Visual Studio 的表单设计器中使用它时,它无法正确显示 ComboxCell。这很奇怪。
    • 优秀的帖子,让我摆脱了使用 DataGridView 时遇到的麻烦
    【解决方案2】:

    我并不完全清楚您在这里要做什么,但如果您只是想从组合框中为您添加的每一行选择一个值,您可以选择一个现有的组合框值作为字符串。

    如果我有一个两列 datagridview,两者都带有预先填充的组合框(我通过简单地编辑每一列并将我的选择添加到那里的集合中,在 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”已经是组合框中的选项。我可以通过简单地按名称引用我想要的选项来填充每一行。如果我愿意,我想我也可以通过索引号来做到这一点。

    希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      如果您需要保留已配置的列,请尝试以下操作:

      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 的类型。我正在寻找这个主题,所以 我以为有人可以使用它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-17
        相关资源
        最近更新 更多