在DataGridView中的特定单元格中设置ComboBox

时间:2017-07-19 17:18:06

标签: c# datagridview combobox

我在DataGridView行/列中看到过多个关于组合框的线程,但没有真正专注于一个单元格。我正在尝试遍历DataGridView中的所有单元格,当它识别出应该具有On / Off选项的Parameter时,它会加载一个ComboBox。

我一直在研究的代码是:

 dataGridView1.DataSource = typeof(Parameter);
 dataGridView1.DataSource = _paramList;

     foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            foreach (DataGridViewCell ce in row.Cells)
            {
                foreach (Information i in _information)
                {
                    if (ce.Value.ToString() == "Light")
                    {
                        DataGridViewComboBoxCell c = new DataGridViewComboBoxCell();
                        c.Items.Add("On");
                        c.Items.Add("Off");

             dataGridView1.Rows[ce.RowIndex].Cells[ce.ColumnIndex] = c;
                    }
                }
            }
        }

它抛出错误“集合已被修改;枚举操作可能无法执行”。我猜它与组合框填充单元格并尝试继续foreach语句有什么关系?有任何想法/改变来解决这个问题吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

Foreach循环为您处理枚举器,它们很容易得到此错误(枚举无法继续,集合已修改)。你可以通过使用for循环来解决这个问题。我测试了下面的内容(首先尝试使用foreach - 没有骰子),我们似乎很好。

另外值得注意的是 - 在设置新项目之前,我必须将实际单元格值设置为null。没有这个,我得到一个错误“datagridcomboboxcell的值无效”(或类似的东西)。

编辑:我遗漏了你的第三个嵌套循环。这个概念证明没有必要。这只是将组合框添加到100%的细胞中。

包括我所有的复制测试代码:

using System;
using System.Data;
using System.Windows.Forms;

namespace WindowsFormsApp5
{
public partial class Form1 : Form
{
    private DataGridView oDg;
    public Form1()
    {
        InitializeComponent();
        CreateGrid();
        this.Shown += Form1_Shown;
    }

    private void Form1_Shown(object sender, EventArgs e)
    {
        TestIt();
    }

    private void TestIt()
    {
        //works
        for (int i = 0;i < oDg.RowCount; i++)
        {
            for (int j = 0;j< oDg.ColumnCount; j++)
            {
                oDg.Rows[i].Cells[j].Value = null; //this is important.
                DataGridViewComboBoxCell c = new DataGridViewComboBoxCell();
                c.Items.Add("On");
                c.Items.Add("Off");
                oDg.Rows[i].Cells[j] = c;  
            }
        }    
        //does not work
        //foreach (DataGridViewRow row in oDg.Rows)
        //{
        //    foreach (DataGridViewCell ce in row.Cells)
        //    {
        //        oDg.Rows[ce.RowIndex].Cells[ce.ColumnIndex].Value = null;
        //        DataGridViewComboBoxCell c = new DataGridViewComboBoxCell();
        //        c.Items.Add("On");
        //        c.Items.Add("Off");
        //        oDg.Rows[ce.RowIndex].Cells[ce.ColumnIndex] = c;
        //    }
        //}
    }
    private void CreateGrid()
    {
        oDg = new DataGridView();
        oDg.Width = 800;
        oDg.Height = 800;
        oDg.DataSource = CreateDataSource();
        this.Controls.Add(oDg);
    }
    private DataTable CreateDataSource()
    {
        DataTable oDt = new DataTable();
        for(int i = 0; i < 8; i++)
        {
            DataColumn col = new DataColumn(i.ToString(),typeof (String));
            oDt.Columns.Add(col);
        }
        for (int i = 0; i < 99; i++)
        {
            DataRow rw = oDt.NewRow();
            for (int j = 0;j < oDt.Columns.Count; j++)
            {
                rw[j] = j.ToString();
            }
            oDt.Rows.Add(rw);
        }
        return oDt;
    }
}
}