新手菜鸟又来丢人现眼了~~~~~~~~~~~~~~~~~~嘻~~~~~~ DataGrid问题~~~ http://dotnet.aspx.cc/ShowList.aspx?id=1 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 谢谢 net_lover(孟子E章) 看看先~~~~~~~~~ 问题1:使用DataSet,在DataSet里添加一行再绑定DataGrid就可以了问题2:添加按钮列,问题3:添加按钮列, 又让net_lover(孟子E章) 抢先了 TO: xueqs() 你也发表发表侬的高见啊!!!!!!!!! 集思广益嘛 谢谢~~~ 孟老前辈给你指点了,那我给你来段详细介绍Datagrid和Datalist的文章DataGrid/DataList在ASP.NET中的重要性,想必就不用我再强调了,凡显示Table类型的数据,大多会使用这两个控件(当然,如果谁还像ASP那样写ASP.NET,那我也没有办法),所以,每个人可能都有自己的领悟,这篇文章,算是抛砖引玉,为大家做个铺垫。一、方法1、DataBind很简单、最常用的方法。绑定数据用。需要注意的只有一点:执行了这个方法后,DataGrid(由于DataGrid和DataList极为相似,所以下面的介绍虽然是针对DataGrid,但与DataList也相差不远)里面所有的显示绑定数据的控件,都会显示DataSource里的数据,其余控件也将初始化成.aspx里设计的状态。二、属性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、...、PagerCells —— 返回行包含的所有TableCell(不管是显示声明的,还是自动生成的,不管是可以看见的,还是隐藏掉的),通过TableCell,可以读取Cell中显示的文本、包含的控件严重注意:只有BoundColumn列和自动生成列,才可以通过TableCell.Text属性读取显示的文本。HyperLinkColumn、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){ //....} 页面:<TABLE id="Table8" style="HEIGHT: 379px" height="379" cellSpacing="0" borderColorDark="#8195b8" cellPadding="0" width="98%" align="center" borderColorLight="#8195b8" border="2"> <TR> <TD align="center" bgColor="#f2f2f2"> <TABLE id="Table2" style="HEIGHT: 329px" height="329" cellSpacing="0" borderColorDark="#8195b8" cellPadding="0" width="98%" align="center" borderColorLight="#ebf3eb" border="2"> <TR> <TD vAlign="middle" bgColor="#ffffff"><FONT face="宋体"> <TABLE id="Table1" style="HEIGHT: 215px" cellSpacing="0" cellPadding="0" width="98%" align="center" border="0"> <TR> <TD style="FONT-SIZE: 10pt; WIDTH: 749px; HEIGHT: 49px"> 系统编号: <asp:TextBox id="T_ID" Width="30px" runat="server" Enabled="False"></asp:TextBox> 用户姓名: <asp:TextBox id="T_name" Width="85px" runat="server" Enabled="False"></asp:TextBox> 权限选择: <asp:DropDownList id="D_purview" Width="76px" runat="server"> <asp:ListItem Value="3">A</asp:ListItem> <asp:ListItem Value="2">B</asp:ListItem> <asp:ListItem Value="1">C</asp:ListItem> </asp:DropDownList> <asp:Button id="Button1" Width="65px" runat="server" Height="22px" Text="分配" BorderStyle="Groove" Visible="False"></asp:Button> </TD> </TR> <TR> <TD style="FONT-SIZE: 10pt; WIDTH: 749px; HEIGHT: 359px"> <P><FONT face="宋体"><asp:datagrid id="MyDataGrid" Font-Name="宋体" HeaderStyle-BackColor="#aaaadd" AutoGenerateColumns="False" Font-Names="宋体" AllowPaging="True" DataKeyField="UserID" Font-Size="10pt" Height="211px" runat="server" Width="100%"> <ItemStyle Font-Size="9pt" HorizontalAlign="Center"></ItemStyle> <HeaderStyle HorizontalAlign="Center" BackColor="#F2F2F2"></HeaderStyle> <Columns> <asp:EditCommandColumn ButtonType="LinkButton" UpdateText="更新" HeaderText="编辑" CancelText="取消" EditText="编辑"></asp:EditCommandColumn> <asp:BoundColumn DataField="UserID" ReadOnly="True" HeaderText="编号"></asp:BoundColumn> <asp:BoundColumn DataField="usergrade" HeaderText="级别"></asp:BoundColumn> <asp:BoundColumn DataField="account" HeaderText="用户账号"></asp:BoundColumn> <asp:BoundColumn DataField="userpassword" HeaderText="用户密码"></asp:BoundColumn> <asp:BoundColumn DataField="factname" HeaderText="真实姓名"></asp:BoundColumn> <asp:BoundColumn DataField="UserEmail" HeaderText="Email"></asp:BoundColumn> <asp:BoundColumn DataField="Usersex" HeaderText="性别"></asp:BoundColumn> <asp:BoundColumn DataField="homepage" HeaderText="主页"></asp:BoundColumn> <asp:BoundColumn DataField="registertime" HeaderText="注册时间"></asp:BoundColumn> <asp:BoundColumn DataField="logintimes" HeaderText="登录次数"></asp:BoundColumn> <asp:BoundColumn DataField="lasttime" HeaderText="最后登录时间"></asp:BoundColumn> <asp:ButtonColumn Text="删除" HeaderText="编辑" CommandName="Delete"></asp:ButtonColumn> </Columns> <PagerStyle Font-Size="9pt" Mode="NumericPages"></PagerStyle> </asp:datagrid></FONT></P> </TD> </TR> </TABLE> </FONT> </TD> </TR> </TABLE> </TD> </TR></TABLE> ftp://211.162.77.132uncj.net uncj.net开发用的资源\ASP.NET学习资源\黄海作品\DataGrid增删改简单例子 后台:namespace Manage.admin.controls{ using System; using System.Data; using System.Drawing; using System.Web; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using System.Data.SqlClient; using System.Data.OleDb; /// <summary> /// useradd 的摘要说明。 /// </summary> public abstract class userinfo : System.Web.UI.UserControl { protected System.Web.UI.WebControls.DataGrid MyDataGrid; OleDbConnection conn=new OleDbConnection(System.Configuration.ConfigurationSettings.AppSettings["datasource"]); protected System.Web.UI.WebControls.Button Button1; protected System.Web.UI.WebControls.DropDownList D_purview; protected System.Web.UI.WebControls.Label Label1; public string name; protected System.Web.UI.WebControls.TextBox T_name; protected System.Web.UI.WebControls.TextBox T_ID; public string userID; private void Page_Load(object sender, System.EventArgs e) { // 在此处放置用户代码以初始化页面 BindGrid(); } void BindGrid() { string sql="select * from UserInfo order by UserID"; OleDbCommand cmd=new OleDbCommand(sql,conn); DataSet ds=new DataSet(); OleDbDataAdapter dp=new OleDbDataAdapter(cmd); conn.Open(); dp.Fill(ds,"userinfo"); conn.Close(); MyDataGrid.DataSource=ds.Tables["userinfo"].DefaultView; MyDataGrid.DataBind(); } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { // // CODEGEN:该调用是 ASP.NET Web 窗体设计器所必需的。 // InitializeComponent(); base.OnInit(e); } /// 设计器支持所需的方法 - 不要使用 /// 代码编辑器修改此方法的内容。 /// </summary> private void InitializeComponent() { this.Button1.Click += new System.EventHandler(this.Button1_Click); this.MyDataGrid.PageIndexChanged += new System.Web.UI.WebControls.DataGridPageChangedEventHandler(this.MyDataGrid_PageIndexChanged); this.MyDataGrid.CancelCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.MyDataGrid_Cancel); this.MyDataGrid.EditCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.MyDataGrid_Edit); this.MyDataGrid.DeleteCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.MyDataGrid_Delete); this.MyDataGrid.SelectedIndexChanged += new System.EventHandler(this.MyDataGrid_SelectedIndexChanged); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void MyDataGrid_SelectedIndexChanged(object sender, System.EventArgs e) { BindGrid(); } private void MyDataGrid_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e) { MyDataGrid.CurrentPageIndex=e.NewPageIndex; BindGrid(); } public void MyDataGrid_Cancel(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e) { MyDataGrid.EditItemIndex = -1; BindGrid(); } public void MyDataGrid_Delete(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e) { string sql="delete from UserInfo where UserID=@UserID"; OleDbCommand cmd=new OleDbCommand(sql,conn); cmd.Parameters.Add(new OleDbParameter("@UserID",OleDbType.Integer,4)); cmd.Parameters["@UserID"].Value=MyDataGrid.DataKeys[(int)e.Item.ItemIndex]; conn.Open(); cmd.ExecuteNonQuery(); conn.Close(); BindGrid(); } private void Button1_Click(object sender, System.EventArgs e) { string sql="update UserInfo set usergrade='"+D_purview.SelectedItem.Value+"' where UserID="+T_ID.Text+""; OleDbCommand cmd=new OleDbCommand(sql,conn); conn.Open(); cmd.ExecuteNonQuery(); conn.Close(); BindGrid(); } private void MyDataGrid_Edit(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e) { name=e.Item.Cells[3].Text; userID=e.Item.Cells[1].Text; T_name.Text=name; T_ID.Text=userID; Button1.Visible=true; } }} 加入你的工程就可以用,不过你要把你的DataGrid的属性配置一下,DataKeyField=UserIDUserID是你的数据表自动增长的字段,而且把你的Edit和select的事件生成一下 还有Delete,pageindex,cancel等事件生成 谢谢你们 我的信箱 [email protected] QQ 8453605 谢谢 WZCNet(没有做不到,只有想不到) and 117hn(一刀) and littlehb(网际浪子) 不过 littlehb(网际浪子) 您那个FTP好象打不开呀 怎么回事??说我没有访问的权限 5555.... TO: bitsbird(一瓢.net) 好 我看看先~~~~~~ net_lover(孟子E章) http://dotnet.aspx.cc/ShowList.aspx?id=1-------> ~~~~宝库呀!!~~~~ 如何动态改变单元格的背景图 这个功能该如何去实现??关于图片和地图的 我只会.NET,要工作了,我还应当要具备哪些技能? discuz nt 中方法返回值的问题 兄弟们,小弟想问一个关于网站的问题,进来帮忙啊!100送上! 在Windows Form应用程序中如何得到IIS的根目录? 打印方案问题? 树形菜单的问题 (在线等待) 怎样在ASP.NET(C#)中,用DataSet来显示XML数据--在线等待,急!!!! asp.net网站图片管理! 怎么把HTML的LIST控件中的值传回到服务器端? 用datalist显示数据时,如其中ONE COLUMN有多行文字时,整个表格就会变形
问题2:添加按钮列,
问题3:添加按钮列,
1、DataBind
很简单、最常用的方法。绑定数据用。需要注意的只有一点:执行了这个方法后,DataGrid(由于DataGrid和DataList极为相似,所以下面的介绍虽然是针对DataGrid,但与DataList也相差不远)里面所有的显示绑定数据的控件,都会显示DataSource里的数据,其余控件也将初始化成.aspx里设计的状态。
二、属性
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属性读取显示的文本。HyperLinkColumn、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)
{
//....
}
<TABLE id="Table8" style="HEIGHT: 379px" height="379" cellSpacing="0" borderColorDark="#8195b8"
cellPadding="0" width="98%" align="center" borderColorLight="#8195b8" border="2">
<TR>
<TD align="center" bgColor="#f2f2f2">
<TABLE id="Table2" style="HEIGHT: 329px" height="329" cellSpacing="0" borderColorDark="#8195b8"
cellPadding="0" width="98%" align="center" borderColorLight="#ebf3eb" border="2">
<TR>
<TD vAlign="middle" bgColor="#ffffff"><FONT face="宋体">
<TABLE id="Table1" style="HEIGHT: 215px" cellSpacing="0" cellPadding="0" width="98%" align="center"
border="0">
<TR>
<TD style="FONT-SIZE: 10pt; WIDTH: 749px; HEIGHT: 49px"> 系统编号:
<asp:TextBox id="T_ID" Width="30px" runat="server" Enabled="False"></asp:TextBox>
用户姓名:
<asp:TextBox id="T_name" Width="85px" runat="server" Enabled="False"></asp:TextBox> 权限选择:
<asp:DropDownList id="D_purview" Width="76px" runat="server">
<asp:ListItem Value="3">A</asp:ListItem>
<asp:ListItem Value="2">B</asp:ListItem>
<asp:ListItem Value="1">C</asp:ListItem>
</asp:DropDownList>
<asp:Button id="Button1" Width="65px" runat="server" Height="22px" Text="分配" BorderStyle="Groove"
Visible="False"></asp:Button>
</TD>
</TR>
<TR>
<TD style="FONT-SIZE: 10pt; WIDTH: 749px; HEIGHT: 359px">
<P><FONT face="宋体"><asp:datagrid id="MyDataGrid" Font-Name="宋体" HeaderStyle-BackColor="#aaaadd" AutoGenerateColumns="False"
Font-Names="宋体" AllowPaging="True" DataKeyField="UserID" Font-Size="10pt" Height="211px" runat="server"
Width="100%">
<ItemStyle Font-Size="9pt" HorizontalAlign="Center"></ItemStyle>
<HeaderStyle HorizontalAlign="Center" BackColor="#F2F2F2"></HeaderStyle>
<Columns>
<asp:EditCommandColumn ButtonType="LinkButton" UpdateText="更新" HeaderText="编辑" CancelText="取消" EditText="编辑"></asp:EditCommandColumn>
<asp:BoundColumn DataField="UserID" ReadOnly="True" HeaderText="编号"></asp:BoundColumn>
<asp:BoundColumn DataField="usergrade" HeaderText="级别"></asp:BoundColumn>
<asp:BoundColumn DataField="account" HeaderText="用户账号"></asp:BoundColumn>
<asp:BoundColumn DataField="userpassword" HeaderText="用户密码"></asp:BoundColumn>
<asp:BoundColumn DataField="factname" HeaderText="真实姓名"></asp:BoundColumn>
<asp:BoundColumn DataField="UserEmail" HeaderText="Email"></asp:BoundColumn>
<asp:BoundColumn DataField="Usersex" HeaderText="性别"></asp:BoundColumn>
<asp:BoundColumn DataField="homepage" HeaderText="主页"></asp:BoundColumn>
<asp:BoundColumn DataField="registertime" HeaderText="注册时间"></asp:BoundColumn>
<asp:BoundColumn DataField="logintimes" HeaderText="登录次数"></asp:BoundColumn>
<asp:BoundColumn DataField="lasttime" HeaderText="最后登录时间"></asp:BoundColumn>
<asp:ButtonColumn Text="删除" HeaderText="编辑" CommandName="Delete"></asp:ButtonColumn>
</Columns>
<PagerStyle Font-Size="9pt" Mode="NumericPages"></PagerStyle>
</asp:datagrid></FONT></P>
</TD>
</TR>
</TABLE>
</FONT>
</TD>
</TR>
</TABLE>
</TD>
</TR>
</TABLE>
uncj.net uncj.net开发用的资源\ASP.NET学习资源\黄海作品\DataGrid增删改简单例子
namespace Manage.admin.controls
{
using System;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Data.OleDb; /// <summary>
/// useradd 的摘要说明。
/// </summary>
public abstract class userinfo : System.Web.UI.UserControl
{
protected System.Web.UI.WebControls.DataGrid MyDataGrid;
OleDbConnection conn=new OleDbConnection(System.Configuration.ConfigurationSettings.AppSettings["datasource"]);
protected System.Web.UI.WebControls.Button Button1;
protected System.Web.UI.WebControls.DropDownList D_purview;
protected System.Web.UI.WebControls.Label Label1;
public string name;
protected System.Web.UI.WebControls.TextBox T_name;
protected System.Web.UI.WebControls.TextBox T_ID;
public string userID;
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
BindGrid(); } void BindGrid()
{
string sql="select * from UserInfo order by UserID";
OleDbCommand cmd=new OleDbCommand(sql,conn);
DataSet ds=new DataSet();
OleDbDataAdapter dp=new OleDbDataAdapter(cmd);
conn.Open();
dp.Fill(ds,"userinfo");
conn.Close();
MyDataGrid.DataSource=ds.Tables["userinfo"].DefaultView;
MyDataGrid.DataBind(); } #region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN:该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// 设计器支持所需的方法 - 不要使用
/// 代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.MyDataGrid.PageIndexChanged += new System.Web.UI.WebControls.DataGridPageChangedEventHandler(this.MyDataGrid_PageIndexChanged);
this.MyDataGrid.CancelCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.MyDataGrid_Cancel);
this.MyDataGrid.EditCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.MyDataGrid_Edit);
this.MyDataGrid.DeleteCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.MyDataGrid_Delete);
this.MyDataGrid.SelectedIndexChanged += new System.EventHandler(this.MyDataGrid_SelectedIndexChanged);
this.Load += new System.EventHandler(this.Page_Load); }
#endregion private void MyDataGrid_SelectedIndexChanged(object sender, System.EventArgs e)
{
BindGrid();
} private void MyDataGrid_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
{
MyDataGrid.CurrentPageIndex=e.NewPageIndex;
BindGrid();
} public void MyDataGrid_Cancel(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
MyDataGrid.EditItemIndex = -1;
BindGrid();
} public void MyDataGrid_Delete(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
string sql="delete from UserInfo where UserID=@UserID";
OleDbCommand cmd=new OleDbCommand(sql,conn);
cmd.Parameters.Add(new OleDbParameter("@UserID",OleDbType.Integer,4));
cmd.Parameters["@UserID"].Value=MyDataGrid.DataKeys[(int)e.Item.ItemIndex];
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
BindGrid();
} private void Button1_Click(object sender, System.EventArgs e)
{
string sql="update UserInfo set usergrade='"+D_purview.SelectedItem.Value+"' where UserID="+T_ID.Text+"";
OleDbCommand cmd=new OleDbCommand(sql,conn);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
BindGrid();
} private void MyDataGrid_Edit(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
name=e.Item.Cells[3].Text;
userID=e.Item.Cells[1].Text;
T_name.Text=name;
T_ID.Text=userID;
Button1.Visible=true;
} }
}
UserID是你的数据表自动增长的字段,而且把你的Edit和select的事件生成一下
http://dotnet.aspx.cc/ShowList.aspx?id=1-------> ~~~~宝库呀!!~~~~