65.9K
CodeProject 正在变化。 阅读更多。
Home

将 .NET 类转换为 DataGrid

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.42/5 (13投票s)

2005年7月19日

3分钟阅读

viewsIcon

126208

downloadIcon

1396

从 ArrayList 创建 DataGrid,ArrayList 是特定类类型的集合。读取嵌套层次结构中类的所有属性,并从中创建数据列,或者仅选择一些属性作为数据列而忽略其他属性。最终在数据表中拥有唯一的、可读的数据列名称。

引言

到处你都会看到 OOPS 的概念,并且强调你使用 OOPS,但是问问任何人如何从 ArrayList 创建 DataGrid,ArrayList 是同一类类型的集合,你会发现人们说使用 DataSet 或者从这些 ArrayList 项创建 DataTable 行。 当我被要求设计一个 DataGrid 并且我从 C# 团队得到的只是一个 ArrayList 时,我也面临着同样的问题。

我非常肯定,正在阅读这篇文章的你们中的一位会说在 DataGrid 中仍然可以做到这一点,并且可以使用“.”运算符,但是如果我问你如何在它们上面进行排序和分页,以及如果该项在 ArrayList 内部,你可能没有任何答案。

我不是说这是 100% 正确的,但这是将 ArrayList(特定类类型的集合)转换为 DataTable 的最简单方法之一,您可以在 DataGrid 上进行排序、分页和过滤。 因为你最终形成的任何 DataTable 都有有效的列名。

概述

我们有什么?

ArrayList - arrEmployees 
 Item[0] - (Type EmployeeCmpnt)
 Item[1] - (Type EmployeeCmpnt)
 Item[2] - (Type EmployeeCmpnt)
 ...

EmployeeCmpnt 结构

我们想要什么?

If the first item of the ArrayList contains following
 Employeecmpnt.NameCmpnt.FirstName = "John"
 Employeecmpnt.NameCmpnt.LastName = "Abraham"
 Employeecmpnt.HomeAddress.AddressDetailsCmpnt.Address1 = 
                                      "1520 Magnolia Apts"
 ...
and the second item contains following
 Employeecmpnt.NameCmpnt.FirstName = "Peter"
 Employeecmpnt.NameCmpnt.LastName = "Paul"
 Employeecmpnt.HomeAddress.AddressDetailsCmpnt.Address1 = 
                                       "1870 Meridan Pkwy"
 ....

预期的 DataGrid 输出如下所示

实施该方法

FYI The DataTable column names finally when it is implemented
 EmployeeCmpnt__NameCmpnt__FirstName
 EmployeeCmpnt__NameCmpnt__LastName
 EmployeeCmpnt__HomeAddress__AddressDetailCmpnt__Address1
 EmployeeCmpnt__OfficeAddress__AddressDetailCmpnt__Address1

你可以看到每个层次结构都用双下划线“__”分隔。 请注意,使用的是公开的属性名称,而不是类型。(我的意思是说使用的是 "HomeAddress",而不是类型 "AddressCmpnt"。)

将 ArrayList 转换为 DataGrid 的步骤

在 .cs 中

ArrayList arrEmployee = new ArrayList();
//Fill data in arrEmployee
arrEmployee.Add(new EmployeeCmpnt("Peter",
                               "Paul","1520.."));
...
....
//Create instance of grid utility class 
GridViewClass gridView = new GridViewClass();
//Create specific columns (DataColumns) OR 
//create all attributes of a class 
//as column (AutoNestedColumns)
//Set all attributes as data columns //ALL OF THE ATTRIBUTES, 
                                     //MAXIMUM SIZE.
gridView.AutoNestedColumns = true;
//Create specific columns //LESS COLUMNS, LESS DATATABLE SIZE
//gridView.DataColumns  = "EmployeeCmpnt__NameCmpnt__FirstName,
                   EmployeeCmpnt__NameCmpnt__LastName,
                   EmployeeCmpnt__HomeAddress__AddressDetailCmpnt__*";
//Call the CreateDataTable() method which does the conversion job.
DataTable dtEmployee = gridView.CreateDataTable(arrEmployee);
dgEmployee.DataSource = dtEmployee;
dgEmployee.DataBind();

在 .aspx 中

<asp:TemplateCOLUMN HeaderText="First Name" 
    SortExpression='EmployeeCmpnt__NameCmpnt__FirstName'  >
    <ITEMTEMPLATE>
     <asp:Label id="Label8"  style="text-align:left" 
         Runat="server" Text='<%# DataBinder.Eval(Container, 
             "DataItem.EmployeeCmpnt__NameCmpnt__FirstName") %>' />
    </ITEMTEMPLATE>
</asp:TemplateCOLUMN>

它是如何完成的

它是通过反射找出类的类型及其属性,并通过所有嵌套的子级循环并创建一个 DataTableCreateDataTable() 方法。单击此处查看 GridView.cs 的代码。

我可以进行分页和排序吗?

是的,当然!这就是进行所有这些麻烦的原因,因为 DataTable 列名是有效的名称,您可以直接在 DataGrid 的“SortExpression”中使用它们。

protected void dgEmployee_Sort(Object sender, 
                   DataGridSortCommandEventArgs e)
{
  //"EmployeeCmpnt__NameCmpnt__LastName"
  dtEmployee.DefaultView.Sort = e.SortExpression; 
  dgEmployee.DataSource = dtEmployee;
  dgEmployee.DataBind();   
}

我可以在我的自定义 ASP 网格控件中使用它并按照我想要的方式使用它吗?

当然,你可以将 "CreateDataTable()" 方法添加到你的 DataGrid 自定义控件,并且可以有两个公开的属性,如 "DataColumns" 和 "AutoNestedColumns",它们可以接受进一步的输入。 例如

public class MyDataGrid : System.Web.UI.WebControls.DataGrid
{
  public string DataColumns
  {
    get... set...
  }
  public bool AutoNestedColumns
  {
    get... set...
  }
  public DataTable CreateDataTable(..)
  {
     ..
  }
}

顺便说一句,您会很高兴知道我已经完成了这项工作,并且很快将在我的下一篇文章中发布我的自定义 DataGrid,但前提是我的当前文章获得良好的评分:),此外,我需要提交此内容来解释如何从类集合创建 DataGrid

您知道我所说的自定义 DataGrid 控件具有多列排序、冻结标题/行/列等功能,而且非常容易。

致谢

您可以以任何方式和任何方式使用此处给出的代码,但如果您保留作者姓名以及代码,我将非常感谢。

历史

  • 2005 年 7 月 19 日:初始版本

许可证

本文没有附加明确的许可,但可能包含文章文本或下载文件本身中的使用条款。 如有疑问,请通过下面的讨论区与作者联系。 可以在 此处 找到作者可能使用的许可证列表。

© . All rights reserved.