将 .NET 类转换为 DataGrid






4.42/5 (13投票s)
2005年7月19日
3分钟阅读

126208

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>
它是如何完成的
它是通过反射找出类的类型及其属性,并通过所有嵌套的子级循环并创建一个 DataTable
的 CreateDataTable()
方法。单击此处查看 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 日:初始版本
许可证
本文没有附加明确的许可,但可能包含文章文本或下载文件本身中的使用条款。 如有疑问,请通过下面的讨论区与作者联系。 可以在 此处 找到作者可能使用的许可证列表。