我刚刚创建了一个测试项目来调试我遇到的问题,似乎无法理解这里发生了什么......在这个测试项目中,我只有一个Form,一个TabControl和一个DataGridView(在tabControl(第2页或更高版本)的“背景”页面中调用dgvTest。这是我用来重现问题的代码:
private void Form1_Load(object sender, EventArgs e)
{
dgvTest.DataSource = GetDataSource();
DataGridViewColumn customColumn = new DataGridViewColumn(new DataGridViewTextBoxCell());
customColumn.DataPropertyName = "SampleColumn";
dgvTest.Columns.Insert(dgvTest.Columns["SampleColumn"].Index, customColumn);
//#region Attempt #1
//dgvTest.Columns.Remove("SampleColumn");
//customColumn.Name = "SampleColumn";
//#endregion
#region Attempt #2
dgvTest.Columns["SampleColumn"].Visible = false;
customColumn.Name = "SampleColumnCbo";
#endregion
dgvTest.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
}
private DataTable GetDataSource()
{
DataTable result = new DataTable();
result.Columns.Add("SampleColumn");
result.Columns.Add("Q");
//no rows needed
return result;
}
现在,如果我运行它,DataGridView只会在我尝试选择它所在的tabPage后才会完全初始化(我的意思是,调用它的AutoGenerateDataBoundColumns)...此时它将抛出一个InvalidOperationException,表示“< strong>无法添加列,因为其CellType属性为null。“或”至少有一个DataGridView控件的列没有单元格模板。“(基本上,同样的事情;但是我在我将代码最小化到当前状态之前,我只在初始项目和测试项目的早期阶段获得了第一条消息。奇怪的是,如果将dgvTest放在第一个tagPage上或直接放在Form本身内,则不会抛出此异常。
有什么想法吗? 提前谢谢。
答案 0 :(得分:2)
这似乎与您在设置DataSource时(在调用Form1_Load代码时)不可见(在后台选项卡上)DataGridView这一事实有关,即使异常直到稍后才触发。例如,如果您处理DataGridView的VisibleChanged
事件并将Form1_Load代码移动到那里,它只会确保初始化代码仅在第一次激活TabPage n 时触发,它将起作用。单击(实际上是伪已初始化事件)。
private bool dgvInitialized = false;
private void dgvTest_VisibleChanged(object sender, EventArgs e)
{
if (dgvTest.Visible && !dgvInitialized)
{
dgvInitialized = true;
// Move Form1_Load code to here instead...
}
}