在代码隐藏中使用DataItem在嵌套的Repeater中设置类或样式

时间:2016-03-07 23:53:04

标签: c# html asp.net code-behind nested-repeater

我已经看了一会儿,我无法弄明白这一点。我有一个onItemDataBound事件的嵌套转发器,我想为某些<DIV>设置类和样式。

HTML:                                                                                                                                  &lt;%#DataBinder.Eval(Container.DataItem,&#34; sServer&#34;)%&gt;                                                                                                                                                                                                                                                                       &GT;                                                                                                                                                                                                                                                                                                                                                                                                                                  
                                
                                                                                                 

代码隐藏

 protected void rpDB_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        string _sql = "";
        using(SqlConnection _conn = new SqlConnection(_sql))
        {
            _conn.Open();
            DataTable _dt = new DataTable();
            // Get repeater controls
            Repeater rpDB_item = (Repeater)(e.Item.FindControl("rpDB_item"));
            SqlCommand _cmd = new SqlCommand("", _conn);
            SqlDataAdapter _da = new SqlDataAdapter(_cmd);
            _da.Fill(_dt);
            rpDB_item.DataSource = _dt;
            rpDB_item.DataBind();
        }

    }
}

protected void rpDB_item_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {

        if (<value of dataitem("online")> == "Online")
        {
            ((HtmlGenericControl)e.Item.FindControl("label2")).Attributes.Add("class", "glyphicon glyphicon-file");
            ((HtmlGenericControl)e.Item.FindControl("label2")).Attributes.Add("style", "color: green;");
            ((HtmlGenericControl)e.Item.FindControl("label2")).Attributes.Add("title", *<value of dataitem(sFile)>*);
        }
    }
}

我陷入困境的是在代码隐藏中我想在某些表达式中使用dataitem的一列的值,例如在上面的rpDB_item_ItemDataBound事件中。

IE:

if (e.Item.DataItem("Online") == "Online")
{
   ((HtmlGenericControl)e.Item.FindControl("label2")).Attributes.Add("title", * e.Item.DataItem("sFile").ToString()*);
} 

显然有些问题我确定要从这里开始。理想情况下,我要根据dataitem值或值本身设置标签的类或标题。

也许有更好的方法可以做到这一点,例如在代码中创建<div>,不确定如何做到这一点?任何帮助或建议将不胜感激(NOVICE C#)

编辑: 我已添加此功能,我认为这是正确的

protected void FileExists(string url, RepeaterItemEventArgs e)
{
    Label myLabel = (Label)(e.Item.FindControl("divfile"));
    url = "@" + url;
    if (File.Exists(url))
    {
        myLabel.Attributes.Add("class", "green");
    }
    else { myLabel.Attributes.Add("class", "red"); }
}

以及以下标签

<div class='anj red glyphicon glyphicon-file <%= %> id="dvFile" runat="server" title=<%# DataBinder.Eval(Container.DataItem,"FileName") %>></div>

我该怎么称呼这个功能?我试过了

<%# FileExists(DataBinder.Eval(Container.DataItem,"FileName")) %> 

在类中,但它不是将结果字符串发送到函数。

2 个答案:

答案 0 :(得分:1)

e.Item.DataItem的类型是绑定到转发器的类型。 因此,如果您已将Foo的列表绑定到转发器,并且您想要访问个人Foo的属性,则将e.Item.DataItem转换为Foo类型。

var myFoo = e.Item.DataItem as Foo
if(myFoo != null && myFoo.Online == "Online")
    //Do something

答案 1 :(得分:0)

protected void rpDB_item_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        HtmlGenericControl dbOnline = ((HtmlGenericControl)e.Item.FindControl("dbOnline"));
        HtmlGenericControl sfile = ((HtmlGenericControl)e.Item.FindControl("lblfile"));
        //HtmlGenericControl online = ((HtmlGenericControl)e.Item.FindControl("dbOnline"));
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {

            string sonline = (string)(DataBinder.Eval(e.Item.DataItem, "Online/Offline").ToString());
            string myfile = (string)(DataBinder.Eval(e.Item.DataItem,"FileName"));

            if (sonline == "Online")
            {
                sfile.Attributes.Add("class", "green");
                dbOnline.Attributes.Add("class", "led-green");
            }           
        }
    }

我添加了这个,然后走了过去。似乎在Attributes.Add部分之前做了预期的事情。它没有分配相关的属性。再次注意,如果这有所不同,这是在嵌套的转发器中。