格式化 DataGrid 输出
计划
首先,我设计了这个示例中的数据文件,它是一个简单的关于联系人的XML文件。我的DataGird中的显示需求包括:
- 合并首尾姓名。
- 如果Manager的值是1或Employee的值是0时改变Manager的显示方式。
- 如果Manager字段中有任一一行的值是1,则改变该行的背景色。
<?xml version="1.0" standalone="yes"?>
<Contacts>
<Contact>
<Email>myaddress@mycompany.com</Email>
<FirstName>John</FirstName>
<LastName>Doe</LastName>
<Manager>0</Manager>
</Contact>
<Contact>
<Email>youraddress@yourcompany.com</Email>
<FirstName>Jane</FirstName>
<LastName>Doe</LastName>
<Manager>1</Manager>
</Contact>
<Contact>
<Email>fred@bedrock.com</Email>
<FirstName>Fred</FirstName>
<LastName>Flintstone</LastName>
<Manager>0</Manager>
</Contact>
<Contact>
<Email>barney@bedrock.com</Email>
<FirstName>Barney</FirstName>
<LastName>Rubble</LastName>
<Manager>0</Manager>
</Contact>
<Contact>
<Email>slate@bedrock.com</Email>
<FirstName>Mr</FirstName>
<LastName>Slate</LastName>
<Manager>1</Manager>
</Contact>
</Contacts>
接下来设置数据网格。我想用 First Name, Last Name 格式将名字组合到一列中,因此我使用 TemplateColumn。其它两列,每列简单的绑定在一个字段 ,因此用 BoundColumn 就足够了。
<asp:DataGrid id="dgContacts" runat="server" AutoGenerateColumns="False" Width="370px">
<ItemStyle CssClass="item"></ItemStyle>
<HeaderStyle CssClass="heading"></HeaderStyle>
<Columns>
<asp:TemplateColumn HeaderText="Name">
<ItemTemplate>
<asp:Label runat="server" Text= '<%# DataBinder.Eval(Container, "DataItem.FirstName") %>'>
</asp:Label>
</ItemTemplate>
</asp:TemplateColumn>
<asp:BoundColumn DataField="Email" ReadOnly="True" HeaderText="Email"></asp:BoundColumn>
<asp:BoundColumn DataField="Manager" ReadOnly="True" HeaderText="Status">
<HeaderStyle HorizontalAlign="Center"></HeaderStyle>
<ItemStyle HorizontalAlign="Center"></ItemStyle>
</asp:BoundColumn>
</Columns>
</asp:DataGrid>
哪个方法?
现在,需要显示网格数据,我需要决定使用哪个方法来显示这些数据。 使用 helper 函数是一种非常容易的改变数据输出的方法。 为了改变网格的格式,应使用 ItemDataBound 事件。 大脑中应记住这些规则,下面是这决定要做的事情:
| 列 | 方法 | 说明 |
| Name | Helper | 输出需要简单的组合 FirstName 和 LastName 字段. |
| None | 不做任何改变. | |
| Status | ItemDataBound | 需要改变基于 Manager 字段值的行的背景色。另外,需要改变显示基于 Manager 字段值的 Manager 或 Employee 。第二部分能够使用 helper 函数很容易的实现,但是因为我已经使用了 ItemDataBound 事件,因此我决定在同一个位置做两次操作。 |
Helper 函数
设置 helper 函数非常简单。 首先,我在代码区创建了这个函数。 注意:函数作用域被声明为 protected. 这是必需的,因为函数将会在代码后的ASPX页中被调用。 去掉函数的私有属性将会在分析页面时出现错误。
[C#]
protectedstring FormatFullName(object FirstName, object LastName)
{
// Combine the names to get the Last, First format.
return (string)LastName + ", " + (string)FirstName;
}
[VB]
ProtectedFunction FormatFullName(ByVal FirstName AsObject, ByVal LastName AsObject) AsString
' Combine the names to get the Last, First format.
ReturnCType(LastName, String) & ", " & CType(FirstName, String)
EndFunction
为了从网格中调用函数,我改变了 TemplateColumn 中标签的文本值。
<asp:Label runat="server" Text='<%# FormatFullName(DataBinder.Eval(Container, "DataItem.FirstName"), DataBinder.Eval(Container, "DataItem.LastName")) %>'>
ItemDataBound 事件
然后,我设置了网格的 ItemDataBound 事件。有一件事你必须记住:当使用这个事件时,它会触发DataGrid中已建立的每一行。 这包含了页首及页尾行! 结果是,你必须确信你正确的设置了数据行的类型。 这由检查Item对象的ItemType 属性来完成。我无法告诉你当我试着存取数据行中已存在的控件时,曾经遇到过多少次运行时错误,但页首中就不存在这样的情况。
[C#]
protectedvoid dgContacts_ItemDataBound(object source, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
// 确定是数据行而非页首或页尾
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
// 取得 manager 字段的值
string isManager = (string)DataBinder.Eval(e.Item.DataItem, "Manager");
if (isManager == "1")
{
// 设置文本及背景颜色.
e.Item.Cells[2].Text = "Manager";
e.Item.BackColor = System.Drawing.Color.AliceBlue;
}
else
{
// 仅设置文本.
e.Item.Cells[2].Text = "Employee";
}
}
}
[VB]
PrivateSub dgContacts_ItemDataBound(ByVal sender AsObject, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) Handles dgContacts.ItemDataBound
' 确定是数据行而非页首或页尾
If e.Item.ItemType = ListItemType.ItemOrElse e.Item.ItemType = ListItemType.AlternatingItem Then
' 取得 manager 字段的值
Dim isManager AsString = CType(DataBinder.Eval(e.Item.DataItem, "Manager"), String)
If isManager = "1"Then
' 设置文本及背景颜色.
e.Item.Cells(2).Text = "Manager"
e.Item.BackColor = System.Drawing.Color.AliceBlue
Else
' 仅设置文本.
e.Item.Cells(2).Text = "Employee"
EndIf
EndIf
EndSub
结果
最后,我们总结一下,看看已经创建了什么! 如果我已经正确的完成了每件工作,我将可以获得一个包含了3列的简单网格。名字由 last name 和 first name 组合而成。接着是电子邮件地址,然后是状态列指示此人是否是管理员或雇员。 最后,任何显示为管理人员的行都有背景色,让我们看看最终的运行结果!

摘要
正如你所看到的,有多种不同的方法可以改变你的DataGrid中的数据输出格式。 你所选择的方法依赖于你需要执行的操作或你考虑的方式。 以上方法都非常简单,当你使用它们的时候,就会增加DataGrid控件的可有性
All the posts in this blog are provided "AS IS" with no warranties, and confer no rights. Except where otherwise noted, content on this site is licensed under a Creative Commons Attribution 2.5 China Mainland License.
浙公网安备 33010602011771号