使用自定义列延迟加载DataGridView

时间:2013-04-20 15:44:53

标签: c# winforms datagridview invalidoperationexception

我刚刚创建了一个测试项目来调试我遇到的问题,似乎无法理解这里发生了什么......在这个测试项目中,我只有一个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本身内,则不会抛出此异常。

有什么想法吗? 提前谢谢。

1 个答案:

答案 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...
    }
}