Используйте DataItem в Code-behind для установки класса или стиля в Nested Repeater
Я какое-то время оглядывался по этому поводу и не могу этого понять. У меня есть вложенный репитер, который onItemDataBound
событие, которое я хотел бы установить класс и стиль для некоторых <DIV>
,
HTML: <% # DataBinder.Eval (Container.DataItem, "sServer")%>>
КОД-ЗА
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)>*);
}
}
}
Я застрял в выделенном фрагменте кода и хотел бы использовать значение одного из столбцов элемента данных в некоторых выражениях, например, в событии 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 ответа
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
раздел. Это не назначение связанных атрибутов. Еще раз обратите внимание, что это вложенный повторитель, если это имеет значение.
Тип e.Item.DataItem
это тип, который связан с ретранслятором. Так что, если вы связали список Foo
к репитеру, и вы хотите получить доступ к свойствам человека Foo
затем бросить e.Item.DataItem
как тип Foo
,
var myFoo = e.Item.DataItem as Foo
if(myFoo != null && myFoo.Online == "Online")
//Do something