DataGrid使⽤⽅法
⼀、⽅法
1、DataBind
很简单、最常⽤的⽅法。绑定数据⽤。需要注意的只有⼀点:执⾏了这个⽅法后,DataGrid(由于DataGrid和DataList极为相似,所以下⾯的介绍虽然是针对DataGrid,但与DataList也相差不远)⾥⾯所有的显⽰绑定数据的控件,都会显⽰DataSource⾥的数据,其余控件也将初始化成.aspx⾥设计的状态。
datasource是什么意思⼆、属性
1、DataSource
有DataBind的地⽅,就应该有DataSource。如果没有指定DataSource⽽执⾏DataBind,那DataGrid将什么也不会显⽰。
DataSource⼀般是DataSet、DataTable或者DataView。当然也可以绑定DataReader或者其他实现IEnumerable的类。
2、DataKeyField,DataKeys
当你在DataGrid中定位⼀⾏之后,肯定想知道这⾏在数据表⾥的位置,⾄少有五种⽅法可以做到这⼀点,设置DataGrid的DataKeyField就是这⼏种⽅法之⼀。
DataKeyField⼀般设置为数据表的Unique字段(否则就没意义了),通过DataKey可以得到这⼀⾏对应的关键字段的值。
DataKeys是DataKey的集合,通过⾏的索引来读取相应⾏的DataKey。
3、EditItemIndex,SelectedIndex,CurrentPageIndex,SelectedItem
这些属性都很好理解,看名字就知道是什么意思,需要注意的是,设置了EditItemIndex或者CurrentPageIndex后需要重新执⾏DataBind⽅法(当然,前⾯提到过,还需要设置DataSource)。
4、Columns
没什么好解释的,Columns就是Columns,列的集合,可以设置列的属性,包括Visible、HeaderText、FooterText、SortExpression等。
严重注意:⾃动⽣成的列,是不包含在Columns中的。只有在.aspx中显⽰声明的列和在代码中添加的列才会被包含在其中。
5、Items
俗话说,最后的都是最重要的,把Items作为最后⼀个属性来介绍,正式基于这样的理由。
Items是DataGridItem的集合,可以遍历当前DataGrid中显⽰数据的DataGridItem。
5.1、DataGridItem
每⼀个DataGridItem就是DataGrid中显⽰的⼀⾏,其中包括:
Header DataGrid 控件的标题部分
Item DataGrid 控件中的项
AlternatingItem DataGrid 控件中的交替项
SelectedItem DataGrid 控件中的选定项(由SelectedIndex设置,通过SelectedItem属性或者Items[SelectedIndex]来读取)
EditItem DataGrid 控件中处于编辑状态的项(由EditItemIndex设置,通过Items[EditItemIndex]来读取)
Separator DataGrid 控件中项之间的分隔符
Footer DataGrid 控件的脚注部分
Pager DataGrid 控件的页选择节
注意,DataGrid的Items属性中不会包含Header、Footer、Pager这三类DataGridItem的。
5.1.1、DataGridItem的属性
ItemIndex —— 得到⾏在Items中的索引
ItemType —— 返回⾏的类型,也就是上⾯列出的Header、Item、...、Pager
Cells —— 返回⾏包含的所有TableCell(不管是显⽰声明的,还是⾃动⽣成的,不管是可以看见的,还是隐藏掉的),通过TableCell,可以读取Cell中显⽰的⽂本、包含的控件
严重注意:只有BoundColumn列和⾃动⽣成列,才可以通过TableCell.Text属性读取显⽰的⽂本。Hyp
erLinkColumn、ButtonColumn、EditCommandColumn都需要将⽬标控件转换成相应的控件。
⽐如:
假设DataGrid的第⼀列声明如下
<asp:HyperLinkColumn DataTextField="au_id" HeaderText="au_id" DataNavigateUrlField="au_id" DataNavigateUrlFormatString="Edit.aspx?id={0}"></asp:HyperLinkColumn>
读取的时候可以⽤:
//Items[0]表⽰第⼀⾏,Cells[0]表⽰第⼀列,Controls[0]表⽰Cell中的第⼀个控件(也只有这个控件可以⽤)
HyperLink link = (HyperLink)DataGrid1.Items[0].Cells[0].Controls[0]);
Response.Write(link.Text);
⾄于模板列(TemplateColumn),当然也可以通过DataGrid1.Items[i].Cells[j].Controls[n]来获取,然后转换成原来的控件类型再操作,但是还有个更好的办法,就是⽤FindControl来查控件。
FindControl是System.Web.UI.Control的⽅法,可以根据⼦控件ID来查⼦控件
⽐如:
假设DataGrid的某⼀列声明如下
<asp:TemplateColumn>
<ItemTemplate>
<asp:TextBox Runat="server" ID="txtID" Text='<%# DataBinder.Eval(Container.DataItem,"au_id") %>'>
</asp:TextBox>
</ItemTemplate>
</asp:TemplateColumn>
读取⽅法:
TextBox txt = (TextBox)DataGrid1.Items[1].FindControl("txtID");
Response.Write(txt.Text);
注意:DataList中是没有Cell的
三、事件
1、ItemCommand、CancelCommand、DeleteCommand、EditCommand、UpdateCommand
也就是DataGrid中,点击Button、LinkButton后执⾏的事件,执⾏的事件取决于按钮的CommandName。其实最主要的⼀个是ItemCommand,⽽后⾯四个都只是ItemCommand的⼀⼩部分,
⽐如⼀个按钮的CommandName为"Cancel",当返回后,⾸先执⾏的是ItemCommand事件,然后才是CancelCommand事件。
2、PageIndexChanged
如果你的DataGrid是分页的,那当你在DataGrid上点击Pager上的1、2、3或者<、>时,就会激发这个事件。
在这个事件⾥⾯,你可以⽤e.NewPageIndex来读取要改变的页,然后赋值给DataGrid的CurrentPageIndex属性,最后不要忘了,还要设置DataSource,还要执⾏DataBind。
注意:DataList中没有这个事件,如果需要在DataList中分页,可以⼀段⼀段的读取数据,然后把当前段的数据绑定到DataList上。
3、ItemDataBound,ItemCreated
⾸先要说的是这两个事件的发⽣时间。
ItemDataBound嘛,只要执⾏了DataBind⽅法,就会马上激发这个事件。
ItemCreated呢,如果页⾯是第⼀次访问(Page.IsPostBack = false),那在第⼀次执⾏DataBind的时候,会先激发ItemCreated事件,也就是说,执⾏了DataBind后,⾸先会⽤ItemCreated来建⽴Header⾏,然后⽤ItemDataBound来绑定Header⾏,再⽤ItemCreated来建⽴第⼀⾏,再调⽤ItemDataBound来绑定第⼀⾏,也就是说ItemCreated和ItemDataBound是交替执⾏的。
页⾯返回时,也会执⾏ItemCreated事件,在Page_Load之前,但是这时候就不会再执⾏ItemDataBound事件了。
所以,如果你想在DataGrid⾥动态添加什么控件,就需要在ItemCreated事件中,⽽不是在ItemDataBound事件中。
四、代码⽚断
1、DataGrid显⽰双层表头
假设你的DataGrid有三列,现在想将前两列作为"⼤类1",第三列作为"⼤类2",现在,你可以在ItemDataBound事件中加⼊下⾯的代码:
if (e.Item.ItemType == ListItemType.Header)
{
e.Item.Cells[0].ColumnSpan = 2;
e.Item.Cells[0].Text = "⼤类1</td><td>⼤类2</td></tr><tr><td>" + e.Item.Cells[0].Text;
}
⽤这个⽅法可以为任意添加新⾏。
2、设置绑定列或者⾃动⽣成列的编辑框宽度
请在你的ItemDataBound事件中加⼊⼀下代码:
if (e.Item.ItemType == ListItemType.EditItem)
{
for (int i = 0; i < e.Item.Cells.Count; i++)
{
TextBox txt = (TextBox)e.Item.Cells[i].Controls[0];
txt.Width = Unit.Pixel(50);
}
}
3、处理在DataGrid中的DropDownList的事件
DropDownList没有CommandName属性,所以不能⽤ItemCommand事件,不过你可以这样试试:
在DataGrid的模板列中加⼊的DropDownList控件
<asp:DropDownList runat="server" id="ddl" AutoPostBack="True" OnSelectedIndexChanged="ddl_SelectedIndexChanged" />
然后你在.aspx.cs中加⼊⼀个函数
protected void ddl_SelectedIndexChanged(object sender, System.EventArgs e) //⼀定要声明成protected或者public,不能是private的。{
//在这⾥就可以加⼊其他代码
}
3.1、在上⾯的事件中怎样得到本⾏其他Cell的值呢?
我们知道,DataGrid完全是⼀个Table结构的控件,DataGrid包含DataGridItem,每个DataGridItem⼜包含TableCell,那么,我们就可以在TableCell的某个控件中,利⽤控件的Parent来得到TableCell,再利⽤TableCell的Parent,就可以得到DataGridItem了。
protected void ddl_SelectedIndexChanged(object sender, System.EventArgs e) //⼀定要声明成protected或者public,不能是private的。{
DropDownList ddl = (DropDownList)sender;
TableCell cell = (TableCell)ddl.Parent;
DataGridItem item = (DataGridItem)cell.Parent;
Response.Write(item.Cells[0].Text);
}
4、怎样得到Header、Footer、Pager⾥的控件
⽅法⼀:在ItemCreated或者ItemDataBound中,具体代码就不在多写了
⽅法⼆:遍历DataGrid的所有Item(注意,不是遍历DataGrid1.Items下的Item)
foreach (DataGridItem item in DataGrid1.Controls[0].Controls)
{
if (item.ItemType == ListItemType.Header)
{
//⽤item.FindControl查相应的控件
}
}
⼤家可能会注意到,这⾥有个DataGrid1.Controls[0].Controls,这表⽰,DataGrid1下,有⼀个⼦控件,这个⼦控件是DataGridTable类型,他下⾯才是DataGridItem集合
在DataList中,下⾯的⼦控件直接就是DataListItem了,⽽没有Table:
foreach (DataListItem item in DataList1.Controls)
{
//....
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论