2012-02-20 51 views
0

我有一個GridView,它的列從代碼隱藏加載。我在aspx頁面中指定的標題CSS類,但它沒有加載這些列。所以我在代碼隱藏後添加了:GridView1.HeaderRow.CssClass =「HeaderStyle」,然後加載。我不知道如何爲排序列樣式做到這一點。Gridview排序的頭文件css無法加載

這裏是代碼隱藏。任何想法我需要輸入樣式的排序列和它應該被添加?我可以在任何地方爲排序列指定「SortedAscendingHeaderStyle」和「SortedDescendingHeaderStyle」嗎?

Sub Page_load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load 
    If Not Page.IsPostBack Then 
     CreateGridColumns() 
     BindGrid() 
    End If 
End Sub 

Public Property SortExpression As String 
    Get 
     If ViewState("SortExpression") Is Nothing Then 
      ViewState("SortExpression") = "LastName ASC" 
     End If 
     Return ViewState("SortExpression").ToString 
    End Get 
    Set(ByVal value As String) 
     ViewState("SortExpression") = value 
    End Set 
End Property 

Private Sub CreateGridColumns() 
    Dim curLastName As New BoundField 
    curLastName.HeaderText = "Last Name" 
    curLastName.DataField = "LastName" 
    curLastName.SortExpression = "LastName" 

    GridView1.Columns.Insert(0, curLastName) 


    Dim curFirstName As New BoundField 
    curFirstName.HeaderText = "First Name" 
    curFirstName.DataField = "FirstName" 
    curFirstName.SortExpression = "FirstName" 

    GridView1.Columns.Insert(1, curFirstName) 

End Sub 

Private Sub BindGrid() 
    Try 
     Dim tblData = New DataTable 
     Using sqlCon As New SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings("dbConnectionString").ConnectionString.ToString()) 
      Dim sql As String = "SELECT * FROM EmployeeList ORDER BY {0}" 
      Dim sqlCmd = New SqlClient.SqlCommand() 
      sqlCmd.CommandText = String.Format(sql, Me.SortExpression) 
      sqlCmd.Connection = sqlCon 
      Using objAdapter As New SqlClient.SqlDataAdapter(sqlCmd) 
       objAdapter.Fill(tblData) 
      End Using 
     End Using 
     GridView1.DataSource = tblData 
     GridView1.DataBind() 

     GridView1.HeaderRow.CssClass = "HeaderStyle" 

    Catch ex As Exception 
     ' TODO: log error ' 
     Throw 
    End Try 
End Sub 
Private Sub GridView1_PageIndexChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles GridView1.PageIndexChanging 
    Me.GridView1.PageIndex = e.NewPageIndex 
    BindGrid() 
End Sub 

Private Sub GridView1_Sorting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles GridView1.Sorting 
    Dim currentSortColumn, currentSortDirection As String 
    currentSortColumn = Me.SortExpression.Split(" "c)(0) 
    currentSortDirection = Me.SortExpression.Split(" "c)(1) 
    If e.SortExpression.Equals(currentSortColumn) Then 
     ' switch sort direction ' 
     Select Case currentSortDirection.ToUpper 
      Case "ASC" 
       Me.SortExpression = currentSortColumn & " DESC" 
      Case "DESC" 
       Me.SortExpression = currentSortColumn & " ASC" 
     End Select 
    Else 
     Me.SortExpression = e.SortExpression & " ASC" 
    End If 
    BindGrid() 

End Sub 

這裏的GridView的標記:

<asp:GridView ID="GridView1" runat="server" AllowSorting="True" AutoGenerateColumns="False" 
EmptyDataText="There are no data records to display." AllowPaging="True" 
CssClass="GridViewStyle" GridLines="None" Width="100%"> 

<Columns> 

    <asp:BoundField DataField="Dept" HeaderText="Dept" SortExpression="Dept" /> 
    <asp:HyperLinkField DataNavigateUrlFields="EmplID" 
     DataNavigateUrlFormatString="EmployeeProfile.aspx?EmplID={0}" 
     DataTextField="EmplID" 
     DataTextFormatString= "<img src='Images/icons/document-search-result.png' alt='View'/> <u>View</u>" > 
     <ControlStyle CssClass="titleLinksB" /> 
    <ItemStyle Wrap="False" /> 
    </asp:HyperLinkField> 

    </Columns> 
    <RowStyle CssClass="RowStyle" /> 
     <EmptyDataRowStyle CssClass="EmptyRowStyle" /> 
     <PagerSettings Mode="NumericFirstLast" PageButtonCount="5" /> 
     <PagerStyle CssClass="PagerStyle" /> 
     <SelectedRowStyle CssClass="SelectedRowStyle" /> 
     <HeaderStyle CssClass="HeaderStyle" /> 
     <EditRowStyle CssClass="EditRowStyle" /> 
     <AlternatingRowStyle CssClass="AltRowStyle" /> 
     <SortedAscendingHeaderStyle CssClass="sortasc"></SortedAscendingHeaderStyle> 
     <SortedDescendingHeaderStyle CssClass="sortdesc"></SortedDescendingHeaderStyle> 

</asp:GridView> 

感謝您的幫助!

+0

我見過的代碼。 – Cineno28 2012-02-20 16:07:28

+0

你使用的是.net 4.0嗎? – 2012-02-20 18:23:40

+0

@Zach Green是的,我正在使用4.0。有什麼我應該因此而改變? – Cineno28 2012-02-20 19:09:57

回答

2

F你使用內置的鏈接到數據源的GridView的排序,你可以標記定義它們:

<asp:GridView ID="GridView1" runat="server" AllowSorting="True" CellPadding="4"> 
    <SortedAscendingCellStyle CssClass="SortedAscendingCellStyle" /> 
    <SortedAscendingHeaderStyle CssClass="SortedAscendingHeaderStyle" /> 
    <SortedDescendingCellStyle CssClass="SortedDescendingCellStyle" /> 
    <SortedDescendingHeaderStyle CssClass="SortedDescendingHeaderStyle " /> 
</asp:GridView> 

既然你實現自己的排序和數據綁定,您還需要在RowDataBound事件中自己設置排序列樣式。

protected void gdv_RowDataBound(object sender, GridViewRowEventArgs e) { 
     GridView gridView = (GridView)sender; 
     string sortColumn, sortDirection; 
     sortColumn = this.SortExpression.Split(' ')[0]; 
     sortDirection = this.SortExpression.Split(' ')[1]; 

     if (e.Row.RowType == DataControlRowType.Header) { 
      int cellIndex = -1; 
      foreach (DataControlField field in gridView.Columns) { 
       if (field.SortExpression == sortColumn) { 
        cellIndex = gridView.Columns.IndexOf(field); 
       } 
      } 

      if (cellIndex > -1) { 
       // this is a header row, set the sort style 
       e.Row.Cells[cellIndex].CssClass = sortDirection == "ASC" ? "sortasc" : "sortdesc"; 
      } 
     } 
    } 
+0

感謝您的建議。我實際上確實有他們在標記。如果GridView由SQLDataSource填充,它工作正常,但是當我在代碼隱藏中創建列時,它不會獲得排序後的類。我還在標記中添加了HeaderStyle,並且代碼隱藏創建的列可以很好地獲取該類,而不是排序後的頭類。任何想法,我在這裏失蹤? – Cineno28 2012-02-20 18:55:57

+0

@ Cineno28,是的,因爲你正在實現你自己的數據綁定和排序,你不能使用標記選項。我在實施自己的分揀時使用了一個選項更新了我的答案。 – 2012-02-20 19:16:42

+0

非常感謝您的幫助。我添加了你的代碼(轉換成VB後)。在排序後,我沒有看到應用於實際排序列的樣式,但檢查了html,我發現它被應用於來自鏈接列的空白標題列,我添加了實際標記而不是代碼隱藏。你知道爲什麼它會去這個列而不是實際的排序列嗎?如果有幫助,我只是在上面添加了GridView標記。再次感謝您的幫助 – Cineno28 2012-02-20 19:51:27

2

嘗試使用SortedAscendingHeaderStyle所以我在BindGrind(試過GridView1.SortedAscendingHeaderStyle.CssClass = 「sortasc」),但是這不是爲我工作這

protected void grid_RowSorting(object sender, GridViewSortEventArgs e) 
    { 
     string sortExpression = e.SortExpression; 
     string sortDirection = GetSortDirection(sortExpression); 
     //.. Fill Grid & Sort Grid 
     SetHeaderSortCss((GridView)sender, sortExpression, sortDirection, "defaultCss"); 
    } 

    private void SetHeaderSortCss(GridView grid, string columnName, string direction, string defaultCss) 
    {   
     for (int i = 0; i < grid.Columns.Count; i++) 
     { 
      if (grid.Columns[i].SortExpression.ToLower().Trim() == columnName.ToLower().Trim()) 
      { 
       grid.Columns[i].HeaderStyle.CssClass = "sort"+direction; //Set sorted Css 
      } 
      else 
      { 
       grid.Columns[i].HeaderStyle.CssClass = defaultCss; //Clear Others Css 
      } 
     } 
    } 

    private string GetSortDirection(string SortExpression) 
    { 
     if (ViewState[SortExpression] == null) 
      ViewState[SortExpression] = "Desc"; 
     else 
      ViewState[SortExpression] = ViewState[SortExpression].ToString() == "Desc" ? "Asc" : "Desc"; 

     return ViewState[SortExpression].ToString(); 
    }