首 页 | 新 闻 | 技术中心 | 第二书店 | 《程序员》 | 《开发高手》 | 社 区 | 黄 页 | 人 才
移 动专 题SUNIBM微 软微 创精 华Donews人 邮
我的技术中心 
我的分类 我的文档
全部文章 发表文章
专栏管理 使用说明



 RSS 订阅 
最新文档列表
Windows/.NET
.NET  (rss)    
Visual C++  (rss)    
Delphi  (rss)    
Visual Basic  (rss)    
ASP  (rss)    
JavaScript  (rss)    
Java/Linux
Java  (rss)    
Perl  (rss)    
综合
其他开发语言  (rss)    
文件格式  (rss)    
企业开发
游戏开发  (rss)    
网站制作技术  (rss)    
数据库
数据库开发  (rss)    
软件工程
其他  (rss)    

积极原创作者 
tellmenow (22)
cutemouse (22)
softj (78)
iiprogram (69)
qdzx2008 (50)
goodboy1881 (14)
wangchinaking (58)
fancyhf (1)
harrymeng (41)
yjz0065 (113)
CSDN - 文档中心 - .NET 阅读:9971   评论: 1    参与评论
标题   格式化 DataGrid 输出     选择自 nxyc_twz 的 Blog
关键字   DataGrid
出处   http://www.aspnextgen.com
 

格式化 DataGrid 输出

翻译:nxyc_twz@163.com

  在这个论坛中,我看到了大量的关于如何在DataGrid中格式化显示数据的问题。人们想知道在特殊情况下,怎样改变某行的颜色,文字或基本的显示值 。 在这篇文章中,我将使用两种不同的技术向您演示如何修改您的数据的输出格式。我将向你展示怎样使用helper函数来改变数据数据显示格式。在这之后,我将解释怎样使用DataGrid的OnItemDataBound事件来修改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 字段.
Email None 不做任何改变.
Status ItemDataBound 需要改变基于 Manager 字段值的行的背景色。另外,需要改变显示基于 Manager 字段值的 ManagerEmployee 。第二部分能够使用 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控件的可有性。



相关文章
对该文的评论
CSDN 网友 ( 2004-11-23)
不错,不错。