Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 延迟加载带有自定义列的DataGridView_C#_Winforms_Datagridview_Invalidoperationexception - Fatal编程技术网

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

C# 延迟加载带有自定义列的DataGridView,c#,winforms,datagridview,invalidoperationexception,C#,Winforms,Datagridview,Invalidoperationexception,我刚刚创建了一个测试项目来调试我遇到的一个问题,但似乎无法理解这里发生了什么。。。在这个测试项目中,我在TabControl(第2页或更高版本)的“后台”页面中只有一个表单、一个TabControl和一个DataGridView(称为dgvTest)。下面是我用来重现问题的代码: private void Form1_Load(object sender, EventArgs e) { dgvTest.DataSource = GetDataSource();

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

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

这似乎与设置数据源(调用Form1\u加载代码时)时DataGridView不可见(在后台选项卡上)有关即使该异常直到稍后才会触发。例如,如果您处理DataGridView的
VisibleChanged
事件,并将Form1\u加载代码移到该事件,则该异常仍将有效,只需注意确保初始化代码仅在第一次单击TabPage n时触发(实际上是一个伪初始化事件)


注意:根本原因似乎是有两个DGV列绑定到同一个DataTable列:如果我注释掉“customColumn.DataPropertyName=“SampleColumn”;”赋值,则一切正常……但它不会像我希望的那样自动数据绑定到项目。:-s
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...
    }
}