延迟加载带有自定义列的DataGridView

本文关键字:DataGridView 自定义 延迟加载 | 更新日期: 2023-09-27 18:10:04

我刚刚创建了一个测试项目来调试我遇到的问题,似乎无法理解这里发生了什么…在这个测试项目中,我只有一个表单,一个TabControl,和一个DataGridView(称为dgvTest)在TabControl(第2页或以后)的"背景"页面。下面是我用来重现这个问题的代码:

    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只会得到完全初始化(我的意思是,调用它的AutoGenerateDataBoundColumns)后,我尝试选择tabPage它在…此时,它将抛出InvalidOperationException,表示"Column不能被添加,因为它的CellType属性为空。""或"至少有一个DataGridView控件的列没有单元格模板。"(基本上是一样的;但我只在我的初始项目和测试项目的早期阶段(在我将代码最小化到当前状态之前)得到了第一条消息。奇怪的是,如果dgvTest被放置在第一个标签页上或直接在表单本身中,则不会抛出此异常。

任何想法?

延迟加载带有自定义列的DataGridView

似乎这与您的DataGridView是不可见的(在背景选项卡上),当您设置其数据源(当Form1_Load代码被调用),即使异常不触发,直到后来。例如,它将工作,如果你处理的VisibleChanged事件的DataGridView和移动你的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...
    }
}