Как я могу программно определить, какой элемент управления использовать в моей EditItemTemplate?(ASP.NET) - PullRequest
1 голос
/ 30 июля 2010

В моем приложении ASP.NET у меня есть GridView. Для определенного поля в этом GridView я добавил EditItemTemplate с DropDownList. Однако, если значение поля «X», то я хочу просто отобразить метку вместо DropDownList. Итак, как я могу программно проверить значение поля, а затем решить, какой элемент управления отображать?

Вот мой EditItemTemplate:

<EditItemTemplate>

<asp:DropDownList ID="DropDownListLevel_ID" runat="server"
    DataSourceID="ODSTechLvl" DataTextField="Level_Name"
    DataValueField="Level_ID" SelectedValue='<%# Bind("Level_ID", "{0}") %>'>
</asp:DropDownList>

</EditItemTemplate>

Если значение Level_ID равно «X», то я хочу использовать:

<asp:Label ID="LabelLevel_ID" runat="server" Text='<%# Bind("Level_ID") %>'></asp:Label>

вместо DropDownList.

Я попытался встроить оператор if перед DropDownList, чтобы проверить Eval ("Level_ID"), но, похоже, это не работает. Есть мысли?

Ответы [ 2 ]

1 голос
/ 31 июля 2010

Попробуйте это:

<EditItemTemplate>

<asp:DropDownList ID="DropDownListLevel_ID" runat="server"
    DataSourceID="ODSTechLvl" DataTextField="Level_Name"
    DataValueField="Level_ID" SelectedValue='<%# Bind("Level_ID", "{0}") %>'
    Visible='<%# Eval("Level_ID") != "X" %>'>
</asp:DropDownList>

<asp:Label ID="LabelLevel_ID" runat="server" Text='<%# Bind("Level_ID") %>'
    Visible='<%# Eval("Level_ID") == "X" %>'></asp:Label>

</EditItemTemplate>
0 голосов
/ 31 июля 2010

Вот то, что будет работать для ASP.Net.

Вы можете создать событие RowDataBound и скрыть метку или DropDownList

<asp:GridView id="thingsGrid" runat="server" OnRowDataBound="thingsGrid_RowDataBound"

...> ...

и в вашем коде:

protected void thingsGrid_RowDataBound(object sender, GridViewRowEventArgs e)
{

        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            var boundData = e.Row.DataItem;
            ...
            if (boundDataMeetsCondition)
            {
                e.Row.Cells[4].FindControl("editThingDropDownList").Visible = false;
                e.Row.Cells[4].FindControl("editThingLabel").Visible = true;//*
            }
            else
            {
                ...    
            }
        }
}

* обратите внимание, что это далеко не идеально, поскольку он жестко кодирует индекс ячейки, а идентификатор элементов управления - это строка, которая не будет проверяться до времени выполнения. Есть гораздо более элегантные способы решения этой проблемы в asp.net mvc.

OnRowDataBound - это кувалда, которая предоставит вам полный доступ к вашей сетке, методам страницы и всему вашему приложению. В очень простом сценарии вы также можете сделать это встроенным, не задействуя код.

<asp:Label ID="Label1" runat="server" Visible='<%# Convert.ToBoolean(Eval("BooleanPropertyInData"))%>' Text='<%# Eval("PropertyInData") %>'></asp:Label>                           

или

<asp:Label ID="Label1" runat="server" Visible='<%# Eval("PropertyInData").ToString()=="specialValue"%>' Text='<%# Eval("PropertyInData") %>'></asp:Label>  

в первом встроенном подходе ваш источник данных должен предоставлять такое свойство, а во втором вы жестко программируете свою бизнес-логику specialValue в своей презентации, что также уродливо и приведет к проблемам с ремонтопригодностью.

...