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