Как отключить LinkButton в gridview на основе значения из другого столбца? - PullRequest
1 голос
/ 18 октября 2019

У меня есть столбец статуса, который включает одобренный, отклоненный или отмененный. У меня есть другой столбец Действия, который содержит кнопки ссылки одобрить и отклонить. Теперь, если статус Отменен, я хочу, чтобы кнопка ссылки была отключена для этой строки.

Я пытался использовать событие 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;
                    }
                }
}

Ответы [ 2 ]

0 голосов
/ 20 октября 2019

Метод A

Должно работать следующее:

<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. Вы будете удивлены!

0 голосов
/ 18 октября 2019

Может быть, вы можете использовать этот код

<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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...