2008-10-16 10 views
16

Poszukuję sposobu selektywnego zastosowania klasy CSS do poszczególnych wierszy w GridView na podstawie właściwości elementu związanego z danymi.Selektywnie zastosuj css do wiersza w widoku siatki

np .:

źródło danych GridView to ogólna lista SummaryItems i SummaryItem ma właściwość ShouldHighlight. Kiedy ShouldHighlight == true CSS dla powiązanego wiersza powinien być ustawiony na highlighted

jakieś pomysły?

Odpowiedz

24

bardzo łatwy

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

powyższy kod działa, jeśli używasz DataTable jako źródła danych

zmiana:

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

tylko na powyższym przykładzie przy użyciu rodzajowych:

public class myClass 
{ 
    public Boolean ShouldHighlight 
    { get; set; } 
} 

jeśli pracujesz z Generics (lista, słownik, itp)

pamiętać:

e.Row.dataItem 

zawsze zwraca całego obiektu, które są podczas wypełniania wiersza z, więc łatwo stąd, aby manipulować wyglądem danych na stronie.

powinieneś użyć zdarzenia RowDataBound, które uruchomi się po dołączeniu danych do obiektu wiersza, ale jeszcze nie zapisało kodu HTML na stronie, w ten sposób możesz sprawdzić wartość ShouldHighlight (przekonwertowałem na ciąg, ponieważ robię nie znasz typu, możesz go zmienić, jeśli wiesz, że jest to wartość boolowska).

ten kod działa znacznie szybciej niż kod megakemp bo nie tworzysz obiekt listy i zaludnionych z całego źródła danych dla każdego wiersza ...

PS: wziąć look at this website, można znaleźć kilka tutoriali dla projektu za pomocą GridView obiektowi

+0

Dzięki za to!Dałem tę myśl, ale rozproszyłem ją, ponieważ zakładałem, że HTML już został wygenerowany (przypuśćmy, że powinienem był go naprawdę wypróbować). –

+0

to mój najlepszy sposób na archiwizowanie modyfikacji w dataGridView, pamiętaj, że zawsze możesz uzyskać już umieścił obiekty w szablonie za pomocą (jeśli masz etykietę 1 w ItemTemplate) z: (Etykieta) e.Row.FindControl ("Label1"). Text = dvr.myPropertyText; – balexandre

+0

to nie działa dla mnie = | Podczas debugowania widzę, że klasa jest przypisana, ale nie istnieje w renderowanym HTML – AlfeG

7

Jedną z rzeczy, które chcesz mieć na uwadze to, że ustawienie właściwości Row.CssClass w obsługi zdarzeń RowCreated lub RowDataBound zastąpi wszelkie style domyślne ty może mieć zastosowanie na poziomie siatki. GridView daje łatwy dostęp do rzędzie stylów poprzez właściwości, takie jak:

gvGrid.AlternatingRowStyle.CssClass = ALTROW_CSSCLASS 
gvGrid.RowStyle.CssClass = ROW_CSSCLASS 

Jeśli jednak przypisać wartość CssClass do określonego wiersza, jak to ma swoje potrzeby w tym przypadku, przypisanie overrrules żadnego zadania najwyższego poziomu na poziomie siatki. Zadania nie będą "kaskadować", jak byśmy sobie tego życzyli. Jeśli więc chcesz zachować przypisanie klasy najwyższego poziomu, a także utworzyć warstwę na własnej, bardziej szczegółowej, musisz sprawdzić stan wiersza, aby zobaczyć, z którym wierszem masz do czynienia i połączyć odpowiednio nazwy klas.

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


} 
+0

To bardzo stare pytanie, ale miałem podobny problem i ta odpowiedź pomogła. Dzięki! – Misiu

Powiązane problemy