Как отключить кнопку редактирования в Gridview?

Я использую поле шаблона элемента в моем представлении сетки, чтобы обновить значения внутри определенного столбца. Поле ItemTemplate содержит элемент управления «label», а EditItemTemplate содержит «DropDownList». Теперь проблема в том, что мне нужно отключить кнопку «Редактировать» в зависимости от значения «Метка» ... Прикрепил строки кодировки. Может ли кто-нибудь дать мне решение.

Home.Aspx:
**********
   <Columns>

                    <asp:BoundField DataField="Date" HeaderText="Date" ReadOnly="true" />
                    <asp:BoundField DataField="Type" HeaderText="Type" ReadOnly="true" />
                    <asp:BoundField DataField="Reason" HeaderText="Reason" ReadOnly="true" />
                    <asp:BoundField DataField="Request By" HeaderText="Request By" ReadOnly="true" />
                    <asp:TemplateField HeaderText="Status" HeaderStyle-HorizontalAlign="center">
                        <EditItemTemplate>
                            <asp:DropDownList ID="ddlState" AutoPostBack="false" runat="server">
                                <asp:ListItem Text="Approved" Value="Approved">  </asp:ListItem>
                                <asp:ListItem Text="Declined" Value="Declined">  </asp:ListItem>
                                <asp:ListItem Text="Pending" Value="Pending">  </asp:ListItem>
                            </asp:DropDownList>
                        </EditItemTemplate>
                        <ItemTemplate>
                            <asp:Label ID="lblName" runat="server" Text='<%# Bind("Status") %>'></asp:Label>
                        </ItemTemplate>
                        <HeaderStyle HorizontalAlign="Center"></HeaderStyle>
                    </asp:TemplateField>
                    <asp:CommandField ShowEditButton="True" />
                </Columns>

Здесь в моей кодировке «lblName» имеет значение статуса в ItemTemplate, а «ddlState» имеет значение статуса в EditItemTemplate. В зависимости от значения "lblName" необходимо включить параметр "Редактировать" ...


person ognale88    schedule 05.08.2013    source источник


Ответы (2)


Преобразуйте ваш Edit CommandField в TemplateField.

Во вновь созданном Button добавьте следующую разметку:

Enabled='<%# IsEditEnabled(Eval("Status")) %>'

В коде программной части создайте новый метод:

protected bool IsEditEnabled(string statusValue)
{
    // Here is where you determine the value
}

Сообщите мне, как это работает для вас.

person Garrison Neely    schedule 05.08.2013

Другой подход - использовать RowDataBound, чтобы вы могли напрямую использовать значение Status. Это предполагает, что вы используете DataTable или другую коллекцию DataRow для своего источника данных. Приведение DataItem необходимо будет обновить, если вы используете другой тип данных.

<asp:GridView ID="ExampleGridView" runat="server" OnRowDataBound="ExampleGridView_RowDataBound">
    <Columns>
        <asp:TemplateField HeaderText="Status" HeaderStyle-HorizontalAlign="center">
            <EditItemTemplate>
                <asp:DropDownList ID="StateDropDownList" AutoPostBack="false" runat="server">
                    <asp:ListItem Text="Approved" Value="Approved" />
                    <asp:ListItem Text="Declined" Value="Declined" />
                    <asp:ListItem Text="Pending" Value="Pending" />
                </asp:DropDownList>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:Label ID="NameLabel" runat="server" Text='<%# Bind("Status") %>' />
            </ItemTemplate>
        </asp:TemplateField>
        <asp:CommandField ShowEditButton="True" />
        <asp:TemplateField ShowHeader="False">
            <ItemTemplate>
                <asp:LinkButton ID="EditButton" runat="server" CommandName="Edit" Text="Edit" Visible="true" />
            </ItemTemplate>
            <EditItemTemplate>
                <asp:LinkButton ID="UpdateButton" runat="server" CommandName="Update" Text="Update" />
                <asp:LinkButton ID="CancelButton" runat="server" CommandName="Cancel" Text="Cancel" />
            </EditItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

Из кода позади вы можете обрабатывать строку независимо и иметь доступ к большей части того, что происходит:

protected void ExampleGridView_RowDataBound(Object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow 
        && (
            e.Row.RowState == DataControlRowState.Alternate
            || e.Row.RowState == DataControlRowState.Normal
            || e.Row.RowState == DataControlRowState.Selected
        ))
    {
        Button EditButton = (Button)e.Row.FindControl("EditButton");
        System.Data.DataRow dataRecord = (System.Data.DataRow)e.Row.DataItem;
        if (EditButton != null && dataRecord != null)
        {
            if (dataRecord["Status"] == "ValueThatShowsEditButton")
            {
                EditButton.Visible = true;
            }
        }
    }
}
person Chris Porter    schedule 05.08.2013
comment
Спасибо @Chris Porter, работает. Но я не хочу, чтобы ddlstate отображался как false, мне нужно отключить кнопку редактирования в поле команды .... - person ognale88; 06.08.2013
comment
@ ognale88, извините за ошибку раскрывающегося списка. Я обновил свой пример, чтобы вместо раскрывающегося списка отображалась кнопка редактирования. - person Chris Porter; 07.08.2013