2

我刚刚创建了一个测试项目来调试我遇到的问题,但似乎无法理解这里发生了什么......在这个测试项目中,我只有一个 Form、一个 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 只会在我尝试选择它所在的 tabPage 后完全初始化(我的意思是,调用它的 AutoGenerateDataBoundColumns)......此时它会抛出一个 InvalidOperationException,显示“无法添加列因为它的 CellType 属性为空。 ”或“至少有一个 DataGridView 控件的列没有单元格模板。 ”(基本上,同样的事情;但我只在我的初始项目和早期阶段收到了第一条消息测试项目,在我将代码最小化到当前状态之前)。奇怪的是,如果 dgvTest 放在第一个 tagPage 上或直接放在 Form 本身内,则不会抛出此异常。

有任何想法吗?提前致谢。

4

1 回答 1

3

这似乎与您的 DataGridView 在设置其 DataSource 时(在调用 Form1_Load 代码时)不可见(在背景选项卡上)这一事实有关,即使直到稍后才触发异常。例如,如果您处理VisibleChangedDataGridView 的事件并将您的 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...
    }
}
于 2013-04-20T17:03:31.907 回答