1

在我的 ASP.NET 应用程序中,我有一个 GridView。对于此 GridView 中的特定字段,我添加了带有 DropDownList 的 EditItemTemplate。但是,如果该字段的值为“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 语句来检查 Eval("Level_ID"),但这似乎不起作用。有什么想法吗?

4

2 回答 2

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>
于 2010-07-30T20:22:00.487 回答
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
            {
                ...    
            }
        }
}

*请注意,这不太理想,因为它对单元格索引进行了硬编码,并且控件的 ID 是一个直到运行时才会检查的字符串。在 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 业务逻辑硬编码到您的演示文稿中,这也很丑陋,并且会导致可维护性问题。

于 2010-07-30T20:11:45.843 回答