Выборочно применить CSS к строке в виде сетки
Вопрос
Я ищу способ выборочного применения класса CSS к отдельным строкам в GridView
на основе свойства привязанного к данным элемента.
например.:
Источник данных GridView представляет собой общий список SummaryItems
и SummaryItem
имеет собственность ShouldHighlight
.Когда ShouldHighlight == true
CSS для связанной строки должен быть установлен на highlighted
Любые идеи?
Решение
очень просто
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
DataRowView drv = e.Row.DataItem as DataRowView;
if (drv["ShouldHighlight"].ToString().ToLower() == "true")
e.Row.CssClass = "highlighted";
}
}
приведенный выше код работает, если вы используете DataTable как источник данных
изменить на:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
myClass drv = (myClass)e.Row.DataItem;
if (drv.ShouldHighlight)
e.Row.CssClass = "highlighted";
}
}
только для примера выше при использовании дженериков:
public class myClass
{
public Boolean ShouldHighlight
{ get; set; }
}
если вы работаете с Дженерики (Список, словарь и т. д.)
иметь ввиду:
e.Row.dataItem
всегда возвращайте весь объект, которым вы заполняете строку, поэтому отсюда легко манипулировать внешним видом данных на веб-странице.
вам следует использовать событие RowDataBound, которое сработает после того, как данные будут прикреплены к объекту строки, но еще не записан HTML-код на странице. Таким образом, вы можете проверить значение MustHighlight (я преобразовал в строку, потому что не знаю тип , вы можете изменить его, если знаете, что это логическое значение).
этот код работает намного быстрее, чем код megakemp, потому что вы не создаете объект List и не заполняете весь источник данных для каждой строки...
P.S.взять посмотри на этот сайт, вы можете найти несколько руководств для своего проекта, используя объект GridView.
Другие советы
Следует иметь в виду, что установка свойства Row.CssClass в обработчиках событий RowCreated или RowDataBound переопределит любые стили по умолчанию, которые вы могли применить на уровне сетки.GridView предоставляет вам легкий доступ к стилям строк через такие свойства, как:
gvGrid.AlternatingRowStyle.CssClass = ALTROW_CSSCLASS
gvGrid.RowStyle.CssClass = ROW_CSSCLASS
Однако когда вы назначаете значение CssClass определенной строке, как это вам нужно в данном случае, это назначение отменяет любое назначение верхнего уровня на уровне сетки.Назначения не будут «каскадировать», как нам хотелось бы.Поэтому, если вы хотите сохранить назначение класса верхнего уровня, а также создать свой собственный, более конкретный слой, вам нужно будет проверить rowState, чтобы увидеть, с каким типом строки вы имеете дело, и соответствующим образом объединить имена классов.
If(item.ShouldHighlight)
{
If(e.Row.RowState == DataControlRowState.Alternate)
{
e.Row.CssClass = String.Format("{0} {1}", "highlight", ALTROW_CSSCLASS)
}
else
{
e.Row.CssClass = String.Format("{0} {1}", "highlight", ROW_CSSCLASS)
}
}