每行的asp.net转发器

时间:2014-07-11 09:15:38

标签: c# asp.net sql

我有一个从我的数据库中检索数据的转发器。 由于以下原因,某些结果在特定列中获取空值 一个连接查询及其罚款。

我想查看每一行,如果结果为null,则具体为null 我想要改变这一行的CSS。

现在代码:

<asp:Repeater ID="repRequests" OnItemDataBound="repRequests_ItemDataBound" runat="server">
    <ItemTemplate>
        <asp:Label ID="lbltest" runat="server" Text='<%#Eval("val_name") %>'></asp:Label>
    </ItemTemplate>
</asp:Repeater>

C#:

if (!IsPostBack)
{
    using (SqlConnection con = new SqlConnection(CS))
    {
        SqlCommand cmd = new SqlCommand("check_accepted", con);
        cmd.CommandType = System.Data.CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@val_name", Session["valName"].ToString());
        con.Open();
        SqlDataReader dr = cmd.ExecuteReader();

        repRequests.DataSource = dr;
        repRequests.DataBind();
    }
}

如何写这个?

protected void repRequests_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || 
        e.Item.ItemType == ListItemType.AlternatingItem)
    {
        **//what i want to get:**

        if (dr["accepted_id"] == Null) // a column from the db table
        {
            repRequests.attribute["class"] = "Some Class"
        }
    }
}

感谢帮助者!

3 个答案:

答案 0 :(得分:1)

您可以尝试以下操作。如果数据源是DataReader对象,则必须将e.Item.DataItem转换为DBDataRecord类型(来自System.Data.Common)

protected void repRequests_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item ||
        e.Item.ItemType == ListItemType.AlternatingItem)
    {
        System.Data.Common.DbDataRecord dataRow = e.Item.DataItem as System.Data.Common.DbDataRecord;
        if (dataRow["accepted_id"] == DBNull.Value || dataRow["accepted_id"] == null) // a column from the db table
        {
          // I am not sure how to you get repRequests. but you can find the control using e.Row.Item.FindControl() function
           repRequests.attribute["class"] = "Some Class";
        }
    }
}

修改 除了您的问题之外,如果您想要更改特定行的css,如果某个值为null,则无法直接将css设置为转发器或转发器项。您需要做的是将一个顶级面板添加到ItemTemplate中,如下所示

<ItemTemplate>
    <asp:Panel runat="server" ID="panelRow">
        <asp:Label ID="lbltest" runat="server" Text='<%#Eval("val_name") %>'></asp:Label>
        </asp:Panel>
</ItemTemplate>

然后你可以改变面板的css,如下所示

protected void repRequests_ItemDataBound(object sender, RepeaterItemEventArgs e)
            {
                if (e.Item.ItemType == ListItemType.Item ||
                    e.Item.ItemType == ListItemType.AlternatingItem)
                {
                    System.Data.Common.DbDataRecord dataRow = e.Item.DataItem as System.Data.Common.DbDataRecord;

                    if (dataRow["accepted_id"] == DBNull.Value || dataRow["accepted_id"] == null) // a column from the db table
                    {
                        Panel panelRow = e.Item.FindControl("panelRow") as Panel;
                        panelRow.CssClass = "yourcssclass";

                    }
                }
            }

答案 1 :(得分:1)

当您使用sqldatareader绑定转发器控件时,这是DbDataRecord的{​​{1}}示例。

另请注意repRequests.attribute["class"] = "Some Class"这意味着您将CSS Class应用于转发器控件。您需要更改用作转发器控件项的CssClass标签。

protected void repRequests_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || 
         e.Item.ItemType == ListItemType.AlternatingItem)
    {
         DbDataRecord dbr = (DbDataRecord)e.Item.DataItem;
         if( Convert.ToString(DataBinder.Eval(dbr, "accepted_id")) == null )
             ((Label)e.Item.FindControl("lbltest")).CssClass = "Some Class";
    }
}

答案 2 :(得分:1)

如果没有,您可以在查询中使用IsNull。

SqlCommand cmd = new SqlCommand("select IsNull(something,zero) from sometable",connectionstring)
SqlDatareader dr = cmd.ExecuteReader();
while(dr.Read())
{
   if(dr.GetString(0)=="zero")
   {
        repRequests.attribute["class"] = "Some Class";
   }
}