2017-02-22 12 views
3

Я хочу добавить дополнительный класс в GridView программно. Я знаю, что могу сделать это, используя следующий код:Добавление второго класса в строку gridview в RowDataBound

public void RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    DataRow row = ((DataRowView)e.Row.DataItem).Row; 
    if (!row.Field<Boolean>("IsActive")) 
    { 
     e.Row.Attributes["class"] += "InActive"; 
    } 
} 

и он отлично работает. Класс «IsActive» добавляется, однако, на чередующихся строк я в конечном итоге с этим HTML:

<tr class="gvAlternatingStyle" class="InActive" 
    onmouseover="gvMouseOver(this)" 
    onmouseout="gvMouseOut(this)" style="cursor:pointer;"> 

Два определения класса не то, что я хочу. Я бы предпочел иметь что-то вроде этого:

<tr class="gvAlternatingStyle InActive" 
    onmouseover="gvMouseOver(this)" 
    onmouseout="gvMouseOut(this)" style="cursor:pointer;"> 

который, конечно, более действителен.

Я не могу понять, где/как настроить этот html. Возможно, в OnPreRender(), но я не вижу, где. Может ли кто-нибудь дать мне указатель?

ответ

1

После неразберихи с этим некоторое время и с помощью VDWWD я работал, как сделать это с комбинацией выше и OnPreRender():

public void RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
      DataRow row = ((DataRowView)e.Row.DataItem).Row; 
      if (!row.Field<Boolean>("IsActive"))    { 
       e.Row.Attributes["class"] += "InActive";     
    } 


    protected void PreRender(object sender, EventArgs e) 
    { 
     foreach(GridViewRow row in GridView1.Rows) 
     { 
      if ((row.Attributes["class"] == "InActive")&& 
       (row.RowState == DataControlRowState.Alternate)){ 
       row.RowState = DataControlRowState.Normal; 
       row.Attributes["class"] = "gvAlternatingStyle InActive"; 

      } 

     } 
    } 
1

Вы можете позаботиться обо всем остальном: AlternatingRowStyle-CssClass и добавьте дополнительный класс по необходимости. Конечно, вам нужно будет удалить его из заголовка GridView.

string AlternatingRowStyleCssClass; 

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    //check if the row is a datarow 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     string myClass = string.Empty; 

     //get the AlternatingRowStyle-CssClass for reference into a variable and delete from the gridview itself 
     if (e.Row.RowIndex == 0) 
     { 
      AlternatingRowStyleCssClass = GridView1.AlternatingRowStyle.CssClass; 
      GridView1.AlternatingRowStyle.CssClass = ""; 
     } 

     //check if the row is alternate, if so set the alternating class 
     if (e.Row.RowIndex % 2 == 1) 
     { 
      myClass = AlternatingRowStyleCssClass; 
     } 

     //check if you need to add the extra class 
     DataRow row = ((DataRowView)e.Row.DataItem).Row; 
     if (!row.Field<Boolean>("IsActive")) 
     { 
      myClass += " Inactive"; 
     } 

     //add all the classes to the row 
     e.Row.Attributes["class"] = myClass.Trim(); 
    } 

    //add the class to the gridview again (maybe relevant for postback) 
    if (e.Row.RowType == DataControlRowType.Footer) 
    { 
     GridView1.AlternatingRowStyle.CssClass = AlternatingRowStyleCssClass; 
    } 
} 
+0

Я на самом деле просто реализовать что-то подобное (произошло для меня, когда я набрал этот вопрос), но мне все еще было интересно узнать, есть ли способ сделать это, не программируя вручную посторонний стиль :). Спасибо за быстрый ответ!! Я буду отмечать ваше мнение как ответ, если никто не придумает прямое решение вышеизложенного. –

+1

Я думаю, что класс, определенный в 'AlternatingRowStyle-CssClass', добавляется позже, что происходит в событии' OnRowDataBound'. Я сделал быстрый тест с 'e.Row.Attributes.Remove (« class »);», а затем снова добавив новый класс, но это не сработало, класс по-прежнему добавлен. – VDWWD

+0

Да, согласен. Все еще экспериментирует. Я посмотрел на него в OnPreRender, но классов еще нет. –