延迟加载带有自定义列的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是不可见的(在背景选项卡上),当您设置其数据源(当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...
}
}