2010-07-08 58 views
0

我有一个gridview,其中的复选框中的第一列。网格显示用户搜索时从数据库返回的一条或多条记录(网格填充名为“protected void DisplayGridData()”)的过程。如果该记录的“非活动”列是“1”,我希望禁用复选框。我怎么能做到这一点?禁用gridview中的复选框

的HTML代码是:

  <asp:GridView ID="gvCanadaOrders" runat="server" AutoGenerateColumns="False" CellPadding="2" CellSpacing="2" GridLines="None" Width="100%" AllowPaging="True" PageSize="30" 
       onpageindexchanging="gvCanadaOrders_PageIndexChanging" ForeColor="#333333" DataKeyNames="RecID"> 
       <Columns> 
        <asp:TemplateField HeaderText="Disable" > 
         <ItemTemplate> 
          <asp:CheckBox ID="cbPONumber" runat="server"/> 
         </ItemTemplate> 
        </asp:TemplateField> 
        <%--<asp:BoundField DataField="Rec_ID" HeaderText="Rec_ID" HtmlEncode="False"></asp:BoundField>--%> 
        <asp:BoundField DataField="Inactive" HeaderText="Inactive" HtmlEncode="False" ></asp:BoundField> 
        <asp:BoundField DataField="PO_Number" HeaderText="PO Number" HtmlEncode="False" ></asp:BoundField> 
        <asp:BoundField DataField="VENDOR_NAME" HeaderText="Vendor Name"></asp:BoundField> 
        <asp:BoundField DataField="ITEM_DESC" HeaderText="Item Description"></asp:BoundField> 
        <asp:BoundField DataField="MFG_PART_NO" HeaderText="MFG Part Number"></asp:BoundField> 
        <asp:BoundField DataField="System_DATE" HeaderText="System Date"></asp:BoundField> 
        <asp:BoundField DataField="PRINT_DATE" HeaderText="Print Date"></asp:BoundField> 
       </Columns> 
       <FooterStyle CssClass="GridFooter" BackColor="#990000" Font-Bold="True" ForeColor="White" /> 
       <PagerStyle CssClass="GridPager" ForeColor="#333333" BackColor="#FFCC66" HorizontalAlign="Center" /> 
       <SelectedRowStyle BackColor="#FFCC66" Font-Bold="True" ForeColor="Navy" /> 
       <HeaderStyle CssClass="GridHeader" BackColor="#990000" Font-Bold="True" ForeColor="White" /> 
       <RowStyle CssClass="GridItem" BackColor="#FFFBD6" ForeColor="#333333" /> 
       <AlternatingRowStyle CssClass="GridAltItem" BackColor="White" /> 
      </asp:GridView> 

加载在GridView的代码是:

protected void btnDisable_Click(object sender, EventArgs e)  
{ 
    try 
    { 
     string strPONumber = ""; 
     foreach (GridViewRow gvr in gvCanadaOrders.Rows) 
     { 
      if (((CheckBox)gvr.FindControl("cbPONumber")).Checked == true) 
      { 
       string strRec_ID = gvCanadaOrders.DataKeys[gvr.RowIndex].Value.ToString(); 

       //Update table here, diable inactive field; 
       SqlConnection con = new SqlConnection(strConn); 
       string sqlCanadaOrdersUpdate = "usp_CanadaOrders_Close"; 
       SqlCommand cmdCanadaOrdersUpdate = new SqlCommand(sqlCanadaOrdersUpdate, con); 

       cmdCanadaOrdersUpdate.CommandType = CommandType.StoredProcedure; 

       cmdCanadaOrdersUpdate.Parameters.Add(new SqlParameter("@rec_ID", SqlDbType.VarChar, 50)); 
       cmdCanadaOrdersUpdate.Parameters["@rec_ID"].Value = strRec_ID; 

       cmdCanadaOrdersUpdate.Parameters.Add(new SqlParameter("@usr_id", SqlDbType.VarChar, 50)); 
       cmdCanadaOrdersUpdate.Parameters["@usr_id"].Value = User.Identity.Name.Substring(User.Identity.Name.Length - 7); 

       con.Open(); 

       SqlDataAdapter sqladaCanadaOrdersUpdate = new SqlDataAdapter(cmdCanadaOrdersUpdate); 
       cmdCanadaOrdersUpdate.ExecuteNonQuery(); 
      } 
      ClientScript.RegisterStartupScript(GetType(), "alert", "alert('Purchase Order " + strPONumber + " has been disabled.');", true); 
     } 
    } 

的gridview的databoundrow的代码是:

void gvCanadaOrders_RowDataBound(Object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     // Display the company name in italics. 
     e.Row.Cells[1].Text = "<i>" + e.Row.Cells[1].Text + "</i>"; 
    } 
} 

回答

3

挂钩到GridView的RowDataBound事件。从那里,您可以将DataItem转换为您的记录类型。对标志进行测试可让您修改行控制。

我在VB.net中有这样的代码,并根据您的C#标记做了快速转换,所以请原谅任何错误。

void myGridView_RowDataBound(Object sender, GridViewRowEventArgs e) { 
    if (e.Row.RowType == DataControlRowType.DataRow) { 
     MyObject myObj = (myObj)e.Row.DataItem; 
     if (myObj.flag) { 
      CheckBox cb = (CheckBox)e.Row.FindControl("myCheckBox"); 
      cb.Enabled=false; 
     } 
    } 
} 

编辑:根据您编辑的问题,您的标记中没有OnRowDataBound。你需要添加OnRowDataBound =“gvCanadaOrders_RowDataBound”。它的工作原理与OnPageIndexChanging相同。

+0

怎么叫的RowDataBound事件? – user279521 2010-07-08 18:20:34

+0

在标记中指定名称,或者您可以在代码隐藏中动态地执行此操作。 http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.rowdatabound.aspx – 2010-07-08 18:25:57

+0

该名称是在标记中指定的,但RowDataBound事件永远不会被调用(如果我把一个在它的断点) – user279521 2010-07-08 18:27:17

0

处理的RowDataBound事件和使用e.Row参数来查找您的复选框。

0

在所有的情况下,它不会工作,如果你使用的是HTML复选框,你应该从CSS禁用财产进行其他:

e.Row.Cells[0].Attributes["disabled"] = "disabled"; 

Reference link