【问题标题】:disable a checkbox in gridview禁用gridview中的复选框
【发布时间】:2010-07-08 17:39:19
【问题描述】:

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

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>";
    }
}

【问题讨论】:

    标签: c# asp.net .net-3.5 gridview


    【解决方案1】:

    挂钩到 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 相同。

    【讨论】:

    • RowDataBound 事件是如何调用的?
    • 在标记中指定名称,或者您可以在代码隐藏中动态执行此操作。 msdn.microsoft.com/en-us/library/…
    • 名称在标记中指定,但不会调用 RowDataBound 事件(如果我在其中放置断点)
    • 使用代码隐藏中的标记和函数编辑您的原始问题?
    • 感谢您帮助我完成流程 rchem。
    【解决方案2】:

    处理 RowDataBound 事件并使用 e.Row 参数找到您的复选框。

    【讨论】:

      【解决方案3】:

      它不适用于所有情况,如果您使用 HTML 复选框,您应该通过禁用 CSS 的属性来继续:

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

      Reference link

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-07
        • 2013-12-01
        • 2016-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-24
        • 2013-03-26
        相关资源
        最近更新 更多