Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58
1, <asp:HyperLinkField DataTextField="CustomerName" DataNavigateUrlFields="id,CustomerName" DataNavigateUrlFormatString="~/Customer/CustomerDetail.aspx?CustomerID={0}&CustomerName={1}" HeaderText="顾客姓名" /> 生成带超连接的一行信息, id, CustomerName为数据源中的字段,它们将分别填充到{0},{1}位置,DataTextField:指定链接显示的字段 带修改之类的可加button <asp:LinkButton ID="lbtnEdit" runat="server" Text="修改" CommandName="Edit" CommandArgument='<%# Eval("orderno") %>'> </asp:LinkButton> CommandName 为要执行的方法。
2,LinkButton 传多个参数: <asp:TemplateField HeaderText="销售人员" ItemStyle-HorizontalAlign="Left" ItemStyle-Width="12%"> <ItemTemplate> <asp:LinkButton ID="lbtnCConfirm" runat="server" Text='<%# Eval("SalesStaff") %>' CommandName="StaffShow" CommandArgument=<%# Eval("id")+","+Eval("SalesStaff") %> > </asp:LinkButton> </ItemTemplate> </asp:TemplateField> <asp:Button ID="btnSave" runat="server" Text="保存" CssClass="btn2" /> 后台在gvTotal_RowCommand方法中通过e.CommandArgument.ToString().Split(',')来分开。 asp:Button 与上类似,若想用CommandArgument传参,可在其onCommand中接收,而不是在onClick事件中。 利用onCommand的原因是:页面中有许多button,想在同一个方法中处理其点击事件,可令每个按纽的onCommnad指向同一个方法,并设置CommandArgument参数,这样在onCommnad中就可依据此参数来对不同的按纽做相应的操作,达到集中处理的目的。 注:若是在GridView中,多个onCommand可指向同一个自定义事件,或者利用GridView提供的gvTotal_RowCommand方法也可,其实是同一个。 Eval: CommandArgument=<%# Eval("OrderNo") + "," + Container.DataItemIndex %> /> DataItemIndex 传当前行号 注:HyperLink传参为: <asp:HyperLink ID="hlDetail" runat="server" NavigateUrl='<%# "followhistoryrecord.aspx?allocateid="+ Eval("id")%>'>明细..</asp:HyperLink>
3, 利用TemplateField引用非数据源控件 (1) <asp:GridView ID="gdCancel" runat="server" AutoGenerateColumns="False" CssClass="grid" onrowcreated="gdCancel_RowCreated" DataKeyNames="id" Height="80%"> <HeaderStyle CssClass="gridHeader"></HeaderStyle> <RowStyle CssClass="gridItem" /> <Columns> <asp:TemplateField HeaderText="选择" > <ItemStyle Width="25%" HorizontalAlign="Center" /> <ItemTemplate> <asp:CheckBox ID="chkItem" runat="server" onclick="Select(this);"/> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView> 注:也可加在标题处 <asp:TemplateField ItemStyle-BorderColor="Black" ItemStyle-BorderWidth="1" HeaderStyle-BorderWidth="1" HeaderStyle-BorderColor="Black"> <ItemStyle Width="5%" HorizontalAlign="Center" /> <HeaderTemplate> <%– <input type="checkbox" id="chkAll1" onclick="CheckAll( this );" />–%> 选择 </HeaderTemplate> <ItemTemplate > <asp:CheckBox ID="chkItem" runat="server" /> </ItemTemplate> </asp:TemplateField>. /*选择所有 checkbox */ function CheckAll(chkAll) { var obj = document.aspnetForm.getElementsByTagName("input"); // var chck1 = document.getElementById( "chkAll1" ); // var chck2 = document.getElementById( "chkAll2" ); // chck1.checked = chkAll.checked; // chck2.checked = chck1.checked; for (var i=0;i<obj.length;i++) { var e = obj[i]; if (e.id.indexOf("chkItem")>=0 && e.type=="checkbox") e.checked = chkAll.checked; } } (2) 在类文件中操作此控件可用: CheckBox ck = (CheckBox)gdCancel.Rows[i].FindControl("chkItem"); 得到每行数据的主键可用:gdCancel.DataKeys[i].Value.ToString()) DataKeys 用DataKeyNames指定 (3) //遍历 foreach (GridViewRow vr in gdCustomer.Rows) { foreach( TableCell tc in vr.Cells ){ Console.Write(tc.Text); //此时的Cell为控件,可设置背景等属性 } } } //GridView只是一个数据显示控件,不是数据存储控件如:DataSet,故它可抓取的数据是它所能显示的数据。 (4) 获取当前行的数据: if (e.Row.RowType == DataControlRowType.DataRow) { //e:GridViewRowEventArgs gdCancel.Rows[gdCancel.SelectedIndex].Cells[1].Text } 注:DataControlRowType:数据控件中行的类型,只有DataRow才会有数据 Header 数据控件的标题行。标题行不能绑定数据。 Footer 数据控件的脚注行。脚注行不能绑定数据。 DataRow 数据控件的数据行。只有 DataRow 行能绑定数据。 Separator 行分隔符。行分隔符不能绑定数据。 Pager 显示页按钮或页导航控件的行。页导航行不能绑定数据。 EmptyDataRow 显示页按钮或页导航控件的行。页导航行不能绑定数据。
4, 为行增加动作。如鼠标经过时变色: protected void gdCancel_RowCreated(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { e.Row.Attributes.Add("onmouseover", "c=this.style.backgroundColor;d=this.style.color;this.style.backgroundColor='#348E37';this.style.color='#ffffff';"); e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor=c;this.style.color=d;"); //e.Row.Attributes.Add("style", "background-color:red"); } }
5,根据逻辑在数据绑定时做一些事情 protected void gdCustomer_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { LinkButton lbtnEdit = (LinkButton)e.Row.FindControl("lbtnEdit"); if (OperateType == "FIRST" && ddlCustomerType.SelectedItem.Value.Trim().IndexOf("distribute") < 0) { lbtnEdit.Enabled = false; } } } 注:在页面级处理的方法为:<%# DataBinder.Eval(Container.DataItem, "DepartmentId").ToString() == "6" ? "增值服务部" : "客户发展部 "%> 控制日期显示长度:<%# DataBinder.Eval(Container.DataItem, "OrderDate", "{0:yyyy-MM-dd}")%> 等同于<% # Eval(“OrderDate”, “{0:yyyy-MM-dd}” ) %> 控制字符串长度 <ItemStyle HorizontalAlign="Left" Width="15%"></ItemStyle> <ItemTemplate> <%# MySubString(DataBinder.Eval(Container.DataItem, "Address"),10)%> </ItemTemplate> </asp:TemplateField> 在程序中定义MySubString方法进行处理 <%# DataBinder.Eval(Container.DataItem, "DepartmentId").ToString() == "6" ? "增值服务部" : "客户发展部 "%> 等同于<%# Eval("DepartmentId")%> 控制字段显示与否 gdCustomer.Columns[8].Visible = false;
6,GridView存额外数据,以备后用 当数据源绑定GridView时提供的数据只是GridView用DataField,或Eval指定的数据,若想存其它数据变通的方法是: <asp:TemplateField HeaderText="广告来源"> <ItemStyle Width="10%"></ItemStyle> <ItemTemplate> <asp:HiddenField Value=<%# Eval( "ADSource" ) %> runat=server ID="ADSource"/> <asp:DropDownList ID="ddlADSource" runat="server"></asp:DropDownList> </ItemTemplate> </asp:TemplateField> 利用HiddenField存储数据, 在程序中通过((HiddenField)e.Row.FindControl("ADSource")).Value 来得到数据。 注:指定一BoundField,将其Visible设为false的方式是不行的,不会存储起数据。
7, 分页 GridView在分页状态下显示的数据条数为pagesize,而不是整个数据
8,根据逻辑显示若隐藏一列:dgOrder.Columns[9].Visible = false;隐藏之后无论查询的数据集中有没有相应的字段,都不会出错。 即:当将GridView的某一数据感应控件设为Visible之后,此控件将不参与GridView的DataBind方法。
9,编辑更新数据 (1)在gridview:AutoGenerateEditButton="True" 会自动生成编辑按纽,点编辑之后会将一行变成txtbox可编辑状态,编辑按纽变成取消与更新两个按纽,要添加相应的事件 //自动产生的按纽格式不要调整,可将AutoGenerateEditButton="False",同样为gridview增加OnRowEditing,OnRowCancelingEdit,OnRowUpdating事件,同时在每一行中增加<asp:TemplateField><ItemTemplate><asp:LinkButtonID="btnEdit" runat="server" CommandName="Edit" Text="修改" /> <asp:LinkButtonID="btnSave" runat="server" CommandName="Update" Text="保存" /></ItemTemplate></asp:TemplateField> 只要CommandName为对应的edit,update,cancel那么它们就会自动调用相应的 OnRowEditing,OnRowCancelingEdit,OnRowUpdating方法,同自动产生的按纽一样,不过更加灵活!
10, OnClientClick传值时要将js函数写在Eval内: OnClientClick='<%# Eval("name","alert(\"{0}\")") %>' > protected void gdCustomer_RowEditing(object sender, GridViewEditEventArgs e) { //编辑 gdCustomer.EditIndex = e.NewEditIndex; BindGrid(); } protected void gdCustomer_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e) { //取消编辑状态 gdCustomer.EditIndex = -1; BindGrid(); } protected void gdCustomer_RowUpdating(object sender, GridViewUpdateEventArgs e) { //更新 sqlcon = new SqlConnection(strCon); string sqlstr = "update 表 set 字段1='" + ((TextBox)(GridView1.Rows[e.RowIndex].Cells[1].Controls[0])).Text.ToString().Trim() + "',字段2='" + ((TextBox)(GridView1.Rows[e.RowIndex].Cells[2].Controls[0])).Text.ToString().Trim() + "',字段3='" + ((TextBox)(GridView1.Rows[e.RowIndex].Cells[3].Controls[0])).Text.ToString().Trim() + "' where id='" + GridView1.DataKeys[e.RowIndex].Value.ToString() + "'"; sqlcom=new SqlCommand(sqlstr,sqlcon); sqlcon.Open(); sqlcom.ExecuteNonQuery(); sqlcon.Close(); gdCustomer.EditIndex = -1; BindGrid(); } 注:若想指定某几行不可编辑可采用如下方式: (1)对指定的不可编辑的行做处理 protected void gdCustomer_RowDataBount(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { if ("回访完毕".Equals(e.Row.Cells[2].Text)) { e.Row.Attributes.Add("disabled", "true"); //disabled这个属性会将一行设置成灰色 } } } (2)获取处理的方式: protected void gdCustomer_RowEditing(object sender, GridViewEditEventArgs e) { foreach (string s in gdCustomer.Rows[e.NewEditIndex].Attributes.Keys) { if ("disabled".Equals(s)) { return; } } gdCustomer.EditIndex = e.NewEditIndex; BindGrid(); }
11. 加汇总 1)指定显示foot (ShowFooter="true" ),2)计算汇总数据
12 空数据时显示提示-EmptyDataText属性
dgOrder.EmptyDataText = string.Format("{0}不存在!", txtPackageNo.Text.Trim());