我在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语句有什么关系?有任何想法/改变来解决这个问题吗?
谢谢!
答案 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;
}
}
}