2008-10-16 10 views
16

데이터 바인딩 된 항목의 속성을 기반으로 GridView의 개별 행에 선택적으로 CSS 클래스를 적용 할 방법을 찾고 있습니다.선택적으로 CSS를 gridview의 행에 적용하십시오.

예컨대 :

의 GridView의 데이터 소스가 SummaryItemsSummaryItem의 일반적인 목록은 속성 ShouldHighlight 있습니다. ShouldHighlight == true 관련 행에 대한 CSS는 highlighted

으로 설정해야합니다.

답변

24

매우 쉽게

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 

항상 당신이 행을 채우기하는 전체 개체를 반환, 쉽게 그래서 여기에서 웹 페이지의 데이터 모양을 조작합니다.

데이터가 행 개체에 연결되었지만 페이지에 아직 HTML 코드가 기록되지 않은 후에 트리거하는 RowDataBound 이벤트를 사용해야합니다. 이렇게하면 ShouldHighlight 값을 확인할 수 있습니다 (내가 문자열 원인으로 변환 됨). 유형을 모르는 경우 부울 값인 경우 변경할 수 있습니다.

이 코드는 훨씬 더 빨리 당신이 목록 객체를 생성하고 각 행의 전체 데이터 소스로 채워하지 않는 원인 megakemp의 코드보다 실행

...

P.S. 당신은 RowCreated 또는 RowDataBound 이벤트 핸들러에서 Row.CssClass 속성을 설정하면 모든 기본 스타일을 재정의 할 것이라는의 GridView 객체에게 당신이 염두에 두어야 할

+0

고마워요!나는 그 생각을 주었지만, html이 이미 생성되었다고 가정 할 때이를 무시했다. (실제로 시도해야한다고 가정) –

+0

dataGridView에서 수정 사항을 아카이브하는 것이 가장 좋은 방법이다. 언제나 이미 (ItemTemplate에 Label1이있는 경우) (레이블) e.Row.FindControl ("Label1")을 사용하여 템플릿에 개체를 배치합니다. 텍스트 = dvr.myPropertyText; – balexandre

+0

그것은 나를 위해 작동하지 않습니다 = | 디버깅하는 동안 그 클래스가 할당되어 있지만 렌더링 된 HTML에 존재하지 않는 것을 볼 수 있습니다 – AlfeG

7

한 가지입니다 사용하여 프로젝트에 대한 몇 가지 자습서를 찾을 수 있습니다하는 look at this website 걸릴 당신 그리드 수준에서 적용했을 수 있습니다. 의 GridView는 당신에게 다음과 같은 속성을 통해 스타일을 행에 쉽게 액세스 할 수 있습니다 :이 경우에 필요하다 당신이, 특정 행에 CssClass 값을 할당 할 때

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

를, 할당은 최상위 할당을 overrrules 그리드 수준에서. 과제는 우리가 좋아할 수있는 것처럼 "계단식"되지 않습니다. 따라서 최상위 클래스 할당을 유지하고 더 구체적인 클래스를 유지하려는 경우 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) 
    } 


} 
+0

이것은 아주 오래된 질문이지만 비슷한 문제가있어이 대답이 도움이되었습니다. 감사! – Misiu

관련 문제