DATAGRID经典技巧 [转]

None.gif 很久以前就想写一些关于DataGrid / DataList的东西,但是一直以来,一方面自感所学未深,另一方面,总觉无从下笔,一拖再拖,离刚开始的念头已距一年有余。
None.gifDataGrid
/ DataList在ASP.NET中的重要性,想必就不用我再强调了,凡显示Table类型的数据,大多会使用这两个控件(当然,如果谁还像ASP那样写ASP.NET,那我也没有办法),所以,每个人可能都有自己的领悟,这篇文章,算是抛砖引玉,为大家做个铺垫。
None.gif
None.gif一、方法
None.gif
1 、DataBind
None.gif很简单、最常用的方法。绑定数据用。需要注意的只有一点:执行了这个方法后,DataGrid(由于DataGrid和DataList极为相似,所以下面的介绍虽然是针对DataGrid,但与DataList也相差不远)里面所有的显示绑定数据的控件,都会显示DataSource里的数据,其余控件也将初始化成.aspx里设计的状态。
None.gif
None.gif
None.gif二、属性
None.gif
1 、DataSource
None.gif有DataBind的地方,就应该有DataSource。如果没有指定DataSource而执行DataBind,那DataGrid将什么也不会显示。
None.gifDataSource一般是DataSet、DataTable或者DataView。当然也可以绑定DataReader或者其他实现IEnumerable的类。
None.gif
None.gif
2 、DataKeyField,DataKeys
None.gif当你在DataGrid中定位一行之后,肯定想知道这行在数据表里的位置,至少有五种方法可以做到这一点,设置DataGrid的DataKeyField就是这几种方法之一。
None.gifDataKeyField一般设置为数据表的Unique字段(否则就没意义了),通过DataKey可以得到这一行对应的关键字段的值。
None.gifDataKeys是DataKey的集合,通过行的索引来读取相应行的DataKey。
None.gif
None.gif
3 、EditItemIndex,SelectedIndex,CurrentPageIndex,SelectedItem
None.gif这些属性都很好理解,看名字就知道是什么意思,需要注意的是,设置了EditItemIndex或者CurrentPageIndex后需要重新执行DataBind方法(当然,前面提到过,还需要设置DataSource)。
None.gif
None.gif
4 、Columns
None.gif没什么好解释的,Columns就是Columns,列的集合,可以设置列的属性,包括Visible、HeaderText、FooterText、SortExpression等。
None.gif严重注意:自动生成的列,是不包含在Columns中的。只有在.aspx中显示声明的列和在代码中添加的列才会被包含在其中。
None.gif
None.gif
5 、Items
None.gif俗话说,最后的都是最重要的,把Items作为最后一个属性来介绍,正式基于这样的理由。
None.gifItems是DataGridItem的集合,可以遍历当前DataGrid中显示数据的DataGridItem。
None.gif
5.1 、DataGridItem
None.gif每一个DataGridItem就是DataGrid中显示的一行,其中包括:
None.gifHeader   DataGrid 控件的标题部分
None.gifItem   DataGrid 控件中的项
None.gifAlternatingItem  DataGrid 控件中的交替项
None.gifSelectedItem    DataGrid 控件中的选定项(由SelectedIndex设置,通过SelectedItem属性或者Items[SelectedIndex]来读取)
None.gifEditItem    DataGrid 控件中处于编辑状态的项(由EditItemIndex设置,通过Items[EditItemIndex]来读取)
None.gifSeparator    DataGrid 控件中项之间的分隔符
None.gifFooter    DataGrid 控件的脚注部分
None.gifPager     DataGrid 控件的页选择节
None.gif注意,DataGrid的Items属性中不会包含Header、Footer、Pager这三类DataGridItem的。
None.gif
5.1 . 1 、DataGridItem的属性
None.gifItemIndex 
--  得到行在Items中的索引
None.gifItemType 
--  返回行的类型,也就是上面列出的Header、Item、dot.gif、Pager
None.gifCells 
--  返回行包含的所有TableCell(不管是显示声明的,还是自动生成的,不管是可以看见的,还是隐藏掉的),通过TableCell,可以读取Cell中显示的文本、包含的控件
None.gif严重注意:只有BoundColumn列和自动生成列,才可以通过TableCell.Text属性读取显示的文本。HyperLinkColumn、ButtonColumn、EditCommandColumn都需要将目标控件转换成相应的控件。
None.gif比如:
None.gif假设DataGrid的第一列声明如下
None.gif
< asp:HyperLinkColumn DataTextField = " au_id "  HeaderText = " au_id "  DataNavigateUrlField = " au_id "  DataNavigateUrlFormatString = " Edit.aspx?id={0} " ></ asp:HyperLinkColumn >
None.gif读取的时候可以用:
None.gif
// Items[0]表示第一行,Cells[0]表示第一列,Controls[0]表示Cell中的第一个控件(也只有这个控件可以用)
None.gif
HyperLink link  =  (HyperLink)DataGrid1.Items[ 0 ].Cells[ 0 ].Controls[ 0 ]);
None.gifResponse.Write(link.Text);
None.gif至于模板列(TemplateColumn),当然也可以通过DataGrid1.Items[i].Cells[j].Controls[n]来获取,然后转换成原来的控件类型再操作,但是还有个更好的办法,就是用FindControl来查找控件。
None.gifFindControl是System.Web.UI.Control的方法,可以根据子控件ID来查找子控件
None.gif比如:
None.gif假设DataGrid的某一列声明如下
None.gif
< asp:TemplateColumn >
None.gif   
< ItemTemplate >
None.gif      
< asp:TextBox Runat = " server "  ID = " txtID "  Text = ' <%# DataBinder.Eval(Container.DataItem,"au_id") %> ' >
None.gif      
</ asp:TextBox >
None.gif   
</ ItemTemplate >
None.gif
</ asp:TemplateColumn >
None.gif读取方法:
None.gifTextBox txt 
=  (TextBox)DataGrid1.Items[ 1 ].FindControl( " txtID " );
None.gifResponse.Write(txt.Text);
None.gif注意:DataList中是没有Cell的
None.gif
None.gif
None.gif三、事件
None.gif
1 、ItemCommand、CancelCommand、DeleteCommand、EditCommand、UpdateCommand
None.gif也就是DataGrid中,点击Button、LinkButton后执行的事件,执行的事件取决于按钮的CommandName。其实最主要的一个是ItemCommand,而后面四个都只是ItemCommand的一小部分,
None.gif比如一个按钮的CommandName为
" Cancel " ,当返回后,首先执行的是ItemCommand事件,然后才是CancelCommand事件。
None.gif
None.gif
2 、PageIndexChanged
None.gif如果你的DataGrid是分页的,那当你在DataGrid上点击Pager上的1、
2 、3或者 < > 时,就会激发这个事件。
None.gif在这个事件里面,你可以用e.NewPageIndex来读取要改变的页,然后赋值给DataGrid的CurrentPageIndex属性,最后不要忘了,还要设置DataSource,还要执行DataBind。
None.gif注意:DataList中没有这个事件,如果需要在DataList中分页,可以一段一段的读取数据,然后把当前段的数据绑定到DataList上。
None.gif
None.gif
3 、ItemDataBound,ItemCreated
None.gif首先要说的是这两个事件的发生时间。
None.gifItemDataBound嘛,只要执行了DataBind方法,就会马上激发这个事件。
None.gifItemCreated呢,如果页面是第一次访问(Page.IsPostBack 
=   false ),那在第一次执行DataBind的时候,会先激发ItemCreated事件,也就是说,执行了DataBind后,首先会用ItemCreated来建立Header行,然后用ItemDataBound来绑定Header行,再用ItemCreated来建立第一行,再调用ItemDataBound来绑定第一行,也就是说ItemCreated和ItemDataBound是交替执行的。
None.gif页面返回时,也会执行ItemCreated事件,在Page_Load之前,但是这时候就不会再执行ItemDataBound事件了。
None.gif所以,如果你想在DataGrid里动态添加什么控件,就需要在ItemCreated事件中,而不是在ItemDataBound事件中。
None.gif
None.gif
None.gif四、代码片断
None.gif
1 、DataGrid显示双层表头
None.gif假设你的DataGrid有三列,现在想将前两列作为
" 大类1 " ,第三列作为 " 大类2 " ,现在,你可以在ItemDataBound事件中加入下面的代码:
None.gif
if  (e.Item.ItemType  ==  ListItemType.Header)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif e.Item.Cells[
0].ColumnSpan = 2;
InBlock.gif e.Item.Cells[
0].Text = "大类1</td><td>大类2</td></tr><tr><td>" + e.Item.Cells[0].Text;
ExpandedBlockEnd.gif}

None.gif用这个方法可以为任意添加新行。
None.gif
None.gif
2 、设置绑定列或者自动生成列的编辑框宽度
None.gif请在你的ItemDataBound事件中加入一下代码:
None.gif
if  (e.Item.ItemType  ==  ListItemType.EditItem)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif 
for (int i = 0; i < e.Item.Cells.Count; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif 
dot.gif{
InBlock.gif  TextBox txt 
= (TextBox)e.Item.Cells[i].Controls[0];
InBlock.gif  txt.Width 
= Unit.Pixel(50);
ExpandedSubBlockEnd.gif }

ExpandedBlockEnd.gif}

None.gif
None.gif
3 、处理在DataGrid中的DropDownList的事件
None.gifDropDownList没有CommandName属性,所以不能用ItemCommand事件,不过你可以这样试试:
None.gif在DataGrid的模板列中加入的DropDownList控件
None.gif
< asp:DropDownList runat = " server "  id = " ddl "  AutoPostBack = " True "  OnSelectedIndexChanged = " ddl_SelectedIndexChanged "   />
None.gif然后你在.aspx.cs中加入一个函数
None.gif
protected   void  ddl_SelectedIndexChanged( object  sender, System.EventArgs e)  // 一定要声明成protected或者public,不能是private的。
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif  
//在这里就可以加入其他代码
ExpandedBlockEnd.gif
}

None.gif
None.gif
3.1 、在上面的事件中怎样得到本行其他Cell的值呢?
None.gif我们知道,DataGrid完全是一个Table结构的控件,DataGrid包含DataGridItem,每个DataGridItem又包含TableCell,那么,我们就可以在TableCell的某个控件中,利用控件的Parent来得到TableCell,再利用TableCell的Parent,就可以得到DataGridItem了。
None.gif
protected   void  ddl_SelectedIndexChanged( object  sender, System.EventArgs e)  // 一定要声明成protected或者public,不能是private的。
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif  DropDownList ddl 
= (DropDownList)sender;
InBlock.gif  TableCell cell 
= (TableCell)ddl.Parent;
InBlock.gif  DataGridItem item 
= (DataGridItem)cell.Parent;
InBlock.gif  Response.Write(item.Cells[
0].Text);
ExpandedBlockEnd.gif}

None.gif
None.gif
4 、怎样得到Header、Footer、Pager里的控件
None.gif方法一:在ItemCreated或者ItemDataBound中,具体代码就不在多写了
None.gif方法二:遍历DataGrid的所有Item(注意,不是遍历DataGrid1.Items下的Item)
None.gif
foreach  (DataGridItem item  in  DataGrid1.Controls[ 0 ].Controls)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif  
if (item.ItemType == ListItemType.Header)
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif    
//用item.FindControl查找相应的控件
ExpandedSubBlockEnd.gif
  }

ExpandedBlockEnd.gif}

None.gif大家可能会注意到,这里有个DataGrid1.Controls[
0 ].Controls,这表示,DataGrid1下,有一个子控件,这个子控件是DataGridTable类型,他下面才是DataGridItem集合
None.gif在DataList中,下面的子控件直接就是DataListItem了,而没有Table:
None.gif
foreach  (DataListItem item  in  DataList1.Controls)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif  
//dot.gif.
ExpandedBlockEnd.gif
}

None.gif
None.gif 
None.gif
None.gif
None.gif
// from msdn by lyh
None.gif
Selecting Rows by Clicking Anywhere
None.gifThe 
default  model  for  selecting rows  in  the grid  is   for  you to add a Select button (actually, a LinkButton control) whose CommandName property  is   set  to  " Select. "  When the button  is  clicked, the DataGrid control receives the Select command and automatically displays the row  in  selected mode.
None.gif
None.gifNot everyone likes having an 
explicit  Select button, and a common question  is  how to implement the feature where users can click anywhere  in  a grid row to select it. The solution  is  to perform a kind of sleight - of - hand  in  the grid. You add the Select LinkButton control  as  normal. Users can still use it, or you can hide it. In either  event , you then inject some client script into the page that effectively duplicates the functionality of the Select button  for  the row  as  a whole.
None.gif
None.gifThe example below shows how. In the grid
' s ItemDataBound handler, first make sure that you are not in the header, footer, or pager. Then get a reference to the Select button, which in this instance is assumed to be the first control in the first cell. You then call a little-known method called GetPostBackClientHyperlink. This method returns the name of the postback call for the designated control. In other words, if you pass in a reference to a LinkButton control, it returns the name of the client function call that will perform the postback.
None.gif

None.gifFinally, you assign the client
- side method to the item itself. When the grid renders, it renders  as  an HTML table. By assigning the method to the item, it  is  the equivalent of adding client - side code to each row ( < TR >  element)  in  the table. The grid ' s Item object does not directly support a way to assign client code to it, but you can do that by using its Attributes collection, which passes anything you assign to it through to the browser.
None.gif

None.gifNote   One small disadvantage of 
this  technique  is  that it adds somewhat to the stream rendered to the browser, and it adds information  for  each row to view state.
None.gif
'  Visual Basic
None.gif
Private Sub DataGrid1_ItemDataBound(ByVal sender As Object, _
None.gif      ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) _
None.gif      Handles DataGrid1.ItemDataBound
None.gif   Dim itemType As ListItemType 
=  e.Item.ItemType
None.gif   If ((itemType 
=  ListItemType.Pager) Or _
None.gif      (itemType 
=  ListItemType.Header) Or _
None.gif      (itemType 
=  ListItemType.Footer)) Then
None.gif      Return
None.gif   Else
None.gif      Dim button As LinkButton 
=  _
None.gif         CType(e.Item.Cells(
0 ).Controls( 0 ), LinkButton)
None.gif      e.Item.Attributes(
" onclick " =  _
None.gif         Page.GetPostBackClientHyperlink(button, 
"" )
None.gif   End If
None.gifEnd Sub
None.gif
None.gif
//  C#
None.gif
private   void  DataGrid1_ItemDataBound( object  sender, 
None.gifSystem.Web.UI.WebControls.DataGridItemEventArgs e)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif   ListItemType itemType 
= e.Item.ItemType;
InBlock.gif   
if ((itemType == ListItemType.Pager) || 
InBlock.gif       (itemType 
== ListItemType.Header) || 
InBlock.gif       (itemType 
== ListItemType.Footer)) 
ExpandedSubBlockStart.gifContractedSubBlock.gif   
dot.gif{
InBlock.gif      
return;
ExpandedSubBlockEnd.gif   }

InBlock.gif   LinkButton button 
= (LinkButton)e.Item.Cells[0].Controls[0];
InBlock.gif   e.Item.Attributes[
"onclick"= 
InBlock.gif      Page.GetPostBackClientHyperlink(button, 
"");
ExpandedBlockEnd.gif}

None.gif
None.gif
None.gif

转载于:https://www.cnblogs.com/jhobo/archive/2006/11/13/558959.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值