如何根据另一列的值禁用 gridview 中的 LinkBut​​ton?

How do I disable LinkButton in gridview based on a value from another column?

我有一个状态栏,其中包括批准、拒绝或取消。我还有另一个操作列,其中包含 link 按钮批准和拒绝。现在,如果状态为已取消,我希望为该行禁用 link 按钮。

我尝试使用 GridView1_DataBound 事件,但无法弄清楚其中的逻辑。

 protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {


                if (e.Row.RowType == DataControlRowType.DataRow)
                {
                    if (Server.HtmlDecode(e.Row.Cells[0].Text.Trim()).Equals("Cancelled"))
                    {

                        //OR you can disable it instead of complately hiding it
                        ((LinkButton)GridView1.Rows[e.Row.RowIndex].Cells[0].Controls[0]).Enabled = false;
                    }
                }
}

也许你可以使用这个代码

<asp:GridView ID="gridView" runat="server" AutoGenerateColumns="False" OnRowDataBound="gridView_RowDataBound">
    <Columns>
        <asp:BoundField HeaderText="Column1" DataField="Column1" />
        <asp:BoundField HeaderText="Column2" DataField="Column2" />
        <asp:TemplateField HeaderText="Status">
            <ItemTemplate>
                <asp:Label runat="server" ID="lblStatus" Text='<%#Bind("Status") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Actions">
            <ItemTemplate>
                <asp:LinkButton ID="lnkAction" runat="server">Approve</asp:LinkButton>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

protected void gridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        var status = (e.Row.FindControl("lblStatus") as Label).Text;
        if (status == "Cancelled")
        {
            (e.Row.FindControl("lnkAction") as LinkButton).DisableControl("Disabled button.");
        }
    }
}

要禁用该按钮,您可以使用扩展方法

public static class Extensions
{
      public static TControl DisableControl<TControl>(this TControl control, string desableMessage) where TControl : WebControl
    {
        control.Attributes.Add("disabled", "");
        control.Attributes.Add("data-toggle", "tooltip");
        control.Attributes.Add("title", disableMessage);
        control.Enabled = false;
        return control;
    }
}

方法一

以下应该有效:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
    <Columns>
        <asp:BoundField HeaderText="Status" DataField="Status" />
        <asp:TemplateField HeaderText="Actions">
            <ItemTemplate>
                <asp:LinkButton runat="server" Enabled='<%# !(Eval("Status").ToString().Equals("Cancelled")) %>'>Approve</asp:LinkButton>
                <asp:LinkButton runat="server" Enabled='<%# !(Eval("Status").ToString().Equals("Cancelled")) %>'>Reject</asp:LinkButton>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

方法B

不过,如果您坚持使用代码隐藏方法,访问 LinkButton 控件的最安全方法如下:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" OnRowDataBound="GridView1_RowDataBound">
    <Columns>
        <asp:BoundField HeaderText="Status" DataField="Status" />
        <asp:TemplateField HeaderText="Actions">
            <ItemTemplate>
                <asp:LinkButton ID="ApproveButton" runat="server">Approve</asp:LinkButton>
                <asp:LinkButton ID="RejectButton" runat="server">Reject</asp:LinkButton>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        if (e.Row.Cells[0].Text.Equals("Cancelled"))
        {
            ((LinkButton)e.Row.FindControl("ApproveButton")).Enabled = false;
            ((LinkButton)e.Row.FindControl("RejectButton")).Enabled = false;
        }
    }
}

说明

您的代码不起作用,因为 LinkButton 控件未按照您期望的方式放置在单元格的 Controls 集合中。通过在 GridView1_RowDataBound 的内部条件中放置一个断点来找出你自己,并检查 Controls 集合的项目。你会感到惊讶!