如何以编程方式确定在EditItemTemplate中使用哪个控件? (ASP.NET)

时间:2010-07-30 15:21:04

标签: asp.net gridview drop-down-menu edititemtemplate

在我的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。

我尝试在DropDownList之前嵌入一个if语句来检查Eval(“Level_ID”),但这似乎不起作用。有什么想法吗?

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

以下是适用于ASP.Net的内容。

您可以创建RowDataBound事件并隐藏标签或DropDownList

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

...&gt; ...

并在您的代码中:

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业务逻辑硬编码到您的演示文稿中,这也是丑陋的并且会导致可维护性问题。