更新:
我不确定如何为我的项目正确地实现CellValueNeeded()事件,或者它是否会对我的DataGrid性能有所帮助。
我正在创建一个包含DataGridView的用户控件(请参见下面的代码)。当调用SetProject()方法时,我的控件被设置为特定的Project类实例。然后,控件使用静态方法Informa.Data.GetProjectDataTable(Project proj)从Project中提取一个DataTable。然后将DataGrid的DataSource属性设置为返回的DataTable。
这是我第一次使用ADO或DataGrids,所以请多多包涵。看起来CellValueNeed()允许我覆盖DataGrid找到其单元格值的方式,但在我的情况下,这比MSDN上的示例复杂得多。实际数据源是各种节点对象的树结构,其根是Project实例。每个节点可以具有一组可变属性,这些属性也可以在运行时由用户扩展。然后,还有一堆其他复杂性,例如节点从其父节点继承属性值,并从其子节点累加其他属性值。
Informa.Data.GetProjectDataTable()穿越所有这些疯狂的东西,并生成一个包含所有节点属性的单个平面DataTable。在这一点上,我不关心能否将此表的任何更改与原始树结构相关联,或者在树结构更改时更新表的特定部分。我只想在DataGrid中向用户显示数据。
那么我是否要实现CellValueNeeded()以从Project提供的DataTable中读取数据?我认为DataGrid应该已经知道如何有效地使用DataTable作为DataSource?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Informa;
namespace Informa
{
public partial class ProjectGridControl : UserControl
{
private Project proj;
public ProjectGridControl()
{
InitializeComponent();
}
public void SetProject(Project proj)
{
this.proj = proj;
UpdateGridControl();
}
public void UpdateGridControl()
{
if (this.proj == null)
{
this.dataGrid.DataSource = null;
}
else
{
//Extracts a DataTable from the project and sets it as the
//DataSource of the property grid
this.dataGrid.DataSource = Informa.Data.GetProjectDataTable(proj);
}
}
}
}