2010-07-30 2 views
1

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

Вот мой 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»), но это не работает. Есть предположения?

ответ

0

Вот что будет работать для 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 - это кувалда, который даст вам полный доступ к вашей сетке, методам страниц и всему вашему приложению. В очень простом сценарии вы также можете сделать это inline без привлечения кода.

<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 в презентацию, которая также уродливый и приведет к проблемам с ремонтопригодностью.

1

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

<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> 
Смежные вопросы