2009-05-27 41 views
9

我想將一個CSS類附加到RowDataBound上的一行上。我對GridView使用交替的css類屬性,所以我假設這是應用在RowDataBound上的。如果您在RowDataBound事件中以編程方式將CSS類指派給行的CssClass屬性,則不應用交替的行樣式css類,即使附加了CSS類,也應該使用在RowDataBound上添加CSS類

下面是我得到了什麼:

Protected Sub gvGeneral_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gvGeneral.RowDataBound 
    If e.Row.RowType = DataControlRowType.DataRow Then 
     If previousExpenseType <> e.Row.Cells(2).Text And previousExpenseType.Length > 0 Then 
     e.Row.CssClass += "bottom-border" 
     End If 

     previousExpenseType = e.Row.Cells(2).Text 
    End If 
    End Sub 

previousExpenseType就是我正在做的比較反對的字符串。如果費用類型發生變化,那麼我希望將邊框應用於<tr>元素的底部。

任何想法如何解決這個問題?看起來在RowDataBound之後有一個事件將交替的行樣式css類應用到行中。

回答

2

你可能想要嘗試的另一項工作是,在所有行都是數據綁定後執行檢查和CSS類操作,方法是使用後面的gridview事件之一併自行循環遍歷行。我知道這會增加一些額外的處理時間,但取決於您顯示的數據集的大小,這可能是值得的。

+0

是的,這就是我希望不聽,但它似乎是目前最可行的解決方案。 – Kezzer 2009-05-27 13:15:27

+0

我明白。絕對不是理想,但如果你所說的是對覆蓋你正在做的事情的一個可能的隱藏事件是真實的,我不能想出很多方法來規避這種情況,而沒有任何一個)去除任何項目風格和替代的規則行風格(不需要)或b)在事實之後走動並做需要做的事情。 – TheTXI 2009-05-27 13:26:02

-1

Gridview rowdatabound僅允許您在TR內操縱HTML,因此您可能沒有選擇使用gridView執行您想要的操作。相反,我會建議使用Repeater,它可以讓你更好地控制你生成的HTML。這裏是你可以與中繼器

<table> 
    <thead> 
     <tr><td>Head1</td><td>Head2</td></tr> 
    </thead> 
    <asp:Repeater ID="rptTaskItems" runat="server"> 
     <ItemTemplate> 
      <tr><td>column 1 data</td> 
       <td>column 1 data</td> 
      </tr> 
      <asp:PlaceHolder ID="PHBar" runat="server" visible="false"> 
      <tr><td colspan="2"><hr/></td> 
      </tr> 
      </asp:PlaceHolder> 
     </ItemTemplate> 
    </asp:Repeater> 
</table> 

在的ItemDataBound做什麼,你只能當你的條件爲真這就是它使這個佔位符[PHBar]可見。

希望這會有所幫助。

+0

我不知道,你的立場與此是。 CssClass屬性確實工作,我的問題是在RowDataBound之後發生的隱藏事件不會附加交替的CSS類。我正在應用CSS類,因此我正在操縱HTML。 – Kezzer 2009-05-27 11:50:21

+0

似乎有點苛刻的凱茲;) – Chris 2017-07-29 01:27:41

13

試試這個在您的RowDataBound事件處理程序...

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    GridView grid = GridView1; 
    GridViewRow row = e.Row; 
    if (row.RowType == DataControlRowType.DataRow) 
    { 
     bool isAlternating = row.RowState == DataControlRowState.Alternate; 

     List<string> classes = new List<string>(); 

     /* Setting the CssClass of a row overwrites any CssClass declared in the 
     * markup, so lets save the value that is in the markup and add to it. 
     */ 
     if (isAlternating) { classes.Add(grid.AlternatingRowStyle.CssClass); } 
     else { classes.Add(grid.RowStyle.CssClass); } 

     // 
     //logic for adding other css classes to the row... 
     // 

     //set the CssClass property of the row to the combined css classes value 
     row.CssClass = string.Join(" ", classes.ToArray()); 

     // 
     //more row processing... 
     // 
    } 
} 
+0

您可能希望執行'row.RowState.HasFlag(DataControlRowState.Alternate)',因爲'DataControlRowState'是'Flags enum'。自那時以來,.NET框架可能已經發生了變化,至少在VS2010/.net 4中添加了'HasFlag'。 – Andrew 2016-07-28 08:40:14