C#自定义网格组件(DataGridView)实现数据分组、排序

2012-05-01 23:59:39|?次阅读|上传:wustguangh【已有?条评论】发表评论

关键词:C#, 界面设计|来源:唯设编程网

如果dataSource是IListSource类型的实例,则调用InitDataSet方法对DataSourceManager类的数据进行初始化,InitDataSet方法的定义如下:

private void InitDataSet() {
    Columns = new ArrayList();
    Rows = new ArrayList();

    DataTable table = ((DataSet)dataSource).Tables[this.dataMember];
    // use reflection to discover all properties of the object
    foreach (DataColumn c in table.Columns)
        Columns.Add(c.ColumnName);

    foreach (DataRow r in table.Rows) {
        DataSourceRow row = new DataSourceRow(this, r);
        for (int i = 0; i < Columns.Count; i++)
            row.Add(r[i]);
        Rows.Add(row);
    }
}

该方法比较容易理解,首先将dataSource强制转换成DataSet类型,然后从中获取对应表名为dataMember的DataTable数据表,根据该数据表的内容实例化DataSourceManager类的数据成员。

b. InitList

如果dataSource是IList类型的实例,则调用InitList方法对DataSourceManager类的数据进行初始化,InitList方法的定义如下:

private void InitList() {
    Columns = new ArrayList();
    Rows = new ArrayList();
    IList list = (IList)dataSource;

    // use reflection to discover all properties of the object
    BindingFlags bf = BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetProperty;
    PropertyInfo[] props = list[0].GetType().GetProperties();
    foreach (PropertyInfo pi in props)
        Columns.Add(pi.Name);

    foreach (object obj in list) {
        DataSourceRow row = new DataSourceRow(this, obj);
        foreach (PropertyInfo pi in props) {
            object result = obj.GetType().InvokeMember(pi.Name, bf, null, obj, null);
            row.Add(result);
        }
        Rows.Add(row);
    }
}

该方法默认传入的IList类型实例dataSource是一个对象的链表,使用C#反射的特性获取链表中对象的公共属性名称以及对应的值,构成列标题和行数据内容,最后逐行加入到Rows属性中。

c. InitGrid

如果dataSource是OutlookGrid类型的实例,则调用InitGrid方法对DataSourceManager类的数据进行初始化,InitGrid方法的定义如下:

private void InitGrid() {
    Columns = new ArrayList();
    Rows = new ArrayList();

    OutlookGrid grid = (OutlookGrid)dataSource;
    // use reflection to discover all properties of the object
    foreach (DataGridViewColumn c in grid.Columns)
        Columns.Add(c.Name);

    foreach (OutlookGridRow r in grid.Rows) {
        if (!r.IsGroupRow && !r.IsNewRow) {
            DataSourceRow row = new DataSourceRow(this, r);
            for (int i = 0; i < Columns.Count; i++)
                row.Add(r.Cells[i].Value);
            Rows.Add(row);
        }
    }
}

由于dataSource已经是一个OutlookGrid类型的实例,所以其数据的列模型和行数据与当前的类型一致,只需要简单的复制过来即可。

到此,自定义的DataGridView类型网格组件的设计工作介绍完成了,下面通过客户端程序介绍自定义DataGridView控件的使用方法。新建一个Windows窗体应用程序,将其命名为OutlookGridApp,并将其添加到当前解决方案中。

将刚才创建的OutlookGrid组件拖动到Form1中,如图:

C#分组网格组件(OutlookGrid)

发表评论0条 】
网友评论(共?条评论)..
C#自定义网格组件(DataGridView)实现数据分组、排序