在ASP.NET中用C#实现IF、ELSEIF和ELSE条件与EVAL函数的结合

gojuced7  于 2023-04-22  发布在  .NET
关注(0)|答案(1)|浏览(222)

我正在使用ASP.NET C#,我必须做这样的事情:

<asp:TemplateField
        HeaderText="text"
        ItemStyle-HorizontalAlign="Center"
        ItemStyle-CssClass="ddl_Class_new">
        <ItemTemplate>
            <% if (Eval("dOR_4").ToString().Equals("R"))
                { %>
            <asp:ImageButton ID="btn"
                ImageUrl="/Img/bullett/redbul.gif"
                runat="server" />
            <% }
            else if (Eval("dOR_4").ToString().Equals("G"))
            { %>
            <asp:ImageButton ID="btn"
                ImageUrl="/Img/bullett/goldbul.gif"
                runat="server" />
            <% }
            else if (Eval("dOR_4").ToString().Equals("V"))
            { %>
            <asp:ImageButton ID="btn"
                ImageUrl="/Img/bullett/forestbul.gif"
                runat="server" />
            <% } %>
        </ItemTemplate>
    </asp:TemplateField>

但我得到错误"Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control."
我已经尝试使用下面的代码,但我没有看到goldbul.gif

<asp:TemplateField
    HeaderText="text"
    ItemStyle-HorizontalAlign="Center"
    ItemStyle-CssClass="ddl_Class_new">
    <ItemTemplate>
        <asp:ImageButton ID="btn"
            ImageUrl='<%# Eval("dOR_4").ToString().Equals("R") ? 
                           "/Img/bullett/redbul.gif" :
                          Eval("dOR_4).ToString().Equals("G") ? 
                           "/Img/bullett/goldbul.gif" : "/Img/bullett/forestbul.gif" %>'
            runat="server" />
    </ItemTemplate>
</asp:TemplateField>

任何帮助真的很感激
通过使用具有EVAL函数的IF ELSEIF ELSE条件

h5qlskok

h5qlskok1#

实际上,不要尝试在页面标记中编写或包含这些代码。这是一个烂摊子,更糟糕的是,无论如何都会让你的生活变得悲惨。
由于网格视图是一个服务器端控件,因此您有“许多”选择来编写一些干净的代码来处理您的示例用例。
是gridview、listview、repeater还是许多其他数据绑定控件?
它们都有一个行数据绑定事件。因此,该事件不仅简单,而且是您的“go to”代码位,用于格式化,隐藏/显示控件,甚至做突出显示,颜色等事情。
甚至更好?
该事件在绑定事件期间具有FULL数据库行。换句话说,对于您甚至不“显示”或包括在网格视图中的列?您仍然可以使用这些列!因此,您可能有一个税收计算,但不需要或不想显示税率。
或者甚至是一个简单的酒店列表,你有一个布尔的“活跃”列,对于任何活跃的酒店,你可以把那行数据涂成“浅蓝色”或类似的颜色。(但是,真实的的好处是活跃列不必出现在标记中!!!)。
所以,对于这样的目标,使用行数据绑定事件。你会发现它不仅有一百万个用例,而且意味着你不需要将混乱的标记与一些代码混合在一起。
所以,你的案子?
然后我建议使用行数据绑定事件。
所以,说这个标记:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
    DataKeyNames="ID" CssClass="table table-hover" width="45%"
    OnRowDataBound="GridView1_RowDataBound">
    <Columns>
        <asp:BoundField DataField="FirstName" HeaderText="FirstName" />
        <asp:BoundField DataField="LastName" HeaderText="LastName" />
        <asp:BoundField DataField="City" HeaderText="City" />
        <asp:BoundField DataField="HotelName" HeaderText="HotelName" ItemStyle-Width="120px" />
        <asp:BoundField DataField="Description" HeaderText="Description" />

        <asp:TemplateField HeaderText="Status" ItemStyle-HorizontalAlign="Center">
            <ItemTemplate>
                <asp:ImageButton ID="ImageButton1" runat="server" Width="64"
                    OnClick="ImageButton1_Click" />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

我们有一个图像按钮。
我有一个PassedTest列(值2 =好,1 =坏,0 =无状态)。
因此,我在行数据绑定事件中有以下代码:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType== DataControlRowType.DataRow)
    {
        ImageButton Ibtn = (ImageButton)e.Row.FindControl("ImageButton1");

        DataRowView rData = (DataRowView)e.Row.DataItem;

        // passed test (room been cleaned) 2 = yes, 1, rejected, 0 - no status

        switch ((int)rData["PassedTest"])
        {
            case 2:
                Ibtn.ImageUrl = ResolveUrl(@"~/Content/Approved80.png");
                break;
            case 1:
                Ibtn.ImageUrl = ResolveUrl(@"~/Content/Reject80.png");
                break;

            default:
                Ibtn.ImageUrl = ResolveUrl(@"~/Content/Empty80.png");
                break;
        }

    }
}

要加载的代码如下:

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            LoadGrid();
    }

    void LoadGrid()
    {
        string strSQL =
            "SELECT * FROM tblHotelsA ORDER BY HotelName";
        GridView1.DataSource = General.MyRst(strSQL);
        GridView1.DataBind();

    }

结果是这样的:

所以,你没有混乱的标记。
您不必混合代码和标记。
你有一个干净漂亮的行事件可以使用
行事件具有完整的数据库/数据源行。
并且将所有代码都保存在该页面的代码中。

相关问题