C#ASP.Net - DataList动态改变图像

时间:2015-11-19 14:32:56

标签: c# asp.net image datalist

我有一个简单的DataList,它从数据库中的一个字段获取文本数据,并在lblProductName标签中水平显示。这非常有效。在我的数据库中,我有4条记录,它在DataList的表中显示1行,包含4列数据。完善。

更难的部分。基于另一个查询/逻辑,我想在DataList中的lblProductName标签下显示一个图像;要么是switchon.jpg,要么是switchoff.jpg。我不知道怎么做,因为我将DataList与原始查询绑定到数据库。

这是我的Datalist。

    <asp:DataList ID="dlstProductDataList" runat="server" RepeatColumns = "5" CellPadding = "10" HorizontalAlign ="Center" RepeatDirection="Horizontal" Width="100%">
        <ItemTemplate>
            <div class="ProductLinks">
                <asp:Label ID="lblProductName" runat="server" Text='<%# Eval("ProductName") %>' /><br />
                <asp:Image ID="imgProductStatus" runat="server"></asp:Image>
            </div>
        </ItemTemplate>
    </asp:DataList>

这是我将数据加载到DataList中的代码。

    var cnnString = ConfigurationManager.ConnectionStrings["TaktBoardsConnectionString"].ConnectionString;
    SqlConnection conn = new SqlConnection(cnnString);
    SqlCommand cmd = new SqlCommand();

    string sql = "SELECT [ProductID], [ProductName] FROM [Product] WHERE [ProductID] <> 1 ORDER BY [ProductID]";
    cmd.CommandText = sql;
    cmd.CommandType = CommandType.Text;
    cmd.Connection = conn;

    cmd.Connection.Open();
    dlstProductDataList.DataSource = cmd.ExecuteReader();
    dlstProductDataList.DataBind();

    cmd.Connection.Close();
    cmd.Connection.Dispose();

获取图像的代码/逻辑看起来像这样......

不知何故,对于在DataList中绑定的每个lblProductName,我必须执行以下查询。如果下面的查询在ProductCount中返回0,那么我将imgProductStatus设置为switchoff.jpg。如果是> 0然后它将被设置为switchon.jpg。对于每个lblProductName,我知道ProductID(根据上面的第一个查询)。

    sql = "SELECT COUNT([ProductID]) AS ProductCount FROM TaktBoard WHERE [ProductID] = ??????? AND CONVERT (date, [BoardDate]) = CONVERT (date, GETDATE())";

如果有人能指引我朝着正确的方向前进,我们将非常感激!!

安迪

1 个答案:

答案 0 :(得分:2)

您可以调整查询以包含计数。

你也需要在SQL中包含它,有几种方法可以做到这一点,例如使用连接,但是如果没有看到完整的模式,你可能会有更多的运气来使用子查询

string sql = "SELECT [ProductID], [ProductName], (select COUNT([ProductID]) FROM TaktBoard tb WHERE tb.[ProductID] = [Product].[ProductID] AND CONVERT (date, [BoardDate]) = CONVERT (date, GETDATE())) as [ProductCount] FROM [Product] WHERE [ProductID] <> 1 ORDER BY [ProductID]";

格式化了一点以查看

SELECT [ProductID], [ProductName],
(
    select COUNT([ProductID])
    FROM TaktBoard tb
    WHERE tb.[ProductID] = [Product].[ProductID]
    AND CONVERT (date, [BoardDate]) = CONVERT (date, GETDATE())
) as [ProductCount]

FROM [Product]
WHERE [ProductID] <> 1 
ORDER BY [ProductID]

然后在你的图像中使用它。

<asp:Image ID="imgProductStatus" runat="server" ImageUrl='<%# (Convert.ToInt32(Eval("ProductCount")) == 0) ? "~/Images/switchoff.jpg" : "~/Images/switchon.jpg" %>'></asp:Image>