Подтвердить что ты не робот

Выборочно применять css к строке в gridview

Я ищу способ выборочного применения класса CSS к отдельным строкам в GridView на основе свойства связанного с данными элемента.

например:.

Источник данных GridView - это общий список SummaryItems и SummaryItem имеет свойство ShouldHighlight. Когда ShouldHighlight == true CSS для соответствующей строки должен быть установлен на highlighted

любые идеи?

4b9b3361

Ответ 1

очень легко

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 как DataSource

измените на:

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; }
}

если вы работаете с Generics (List, Dictionary и т.д.)

помните:

e.Row.dataItem

всегда возвращает весь объект, в который вы заполняете строку, поэтому отсюда легко манипулировать внешним видом данных на веб-странице.

вы должны использовать событие RowDataBound, которое будет запускаться после того, как данные будут привязаны к объекту строки, но еще не написали код HTML на странице, таким образом вы можете проверить значение ShouldHighlight (я преобразовал в строку, потому что я не знаете тип, вы можете изменить его, если вы знаете его логическое значение).

этот код работает намного быстрее, чем код megakemp, потому что вы не создаете объект List и заполняете весь источник данных для каждой строки...

P.S. возьмите посмотреть на этом веб-сайте, вы можете найти несколько руководств для своего проекта, используя объект GridView

Ответ 2

Одна вещь, которую вы хотите иметь в виду, заключается в том, что настройка свойства 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)
    }


}