GridView


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)计算汇总数据 protected void gvEmployee_RowDataBound(object sender, GridViewRowEventArgs e) if (e.Row.RowType == DataControlRowType.Footer) { e.Row.Cells[0].Text = "统计:"; e.Row.Cells[8].Text = dt.Compute("sum(Quantity)", "").ToString(); e.Row.Cells[9].Text = dt.Compute("sum(PresentPrice2)", "").ToString(); //e.Row.Cells[3].Text = dt.Compute("sum(InPrice)", "").ToString(); //e.Row.Cells[4].Text = dt.Compute("sum(cbPrice)", "").ToString(); //e.Row.Cells[5].Text = dt.Compute("sum(OutPrice)", "").ToString(); //e.Row.Cells[6].Text = dt.Compute("sum(salePrice)", "").ToString(); } }

12 空数据时显示提示-EmptyDataText属性
dgOrder.EmptyDataText = string.Format("{0}不存在!", txtPackageNo.Text.Trim());