2012-02-20 69 views
0

私は、コードビハインドからロードされた列を持つGridViewを持っています。 aspxページで指定したヘッダーCSSクラスIが、これらの列に対してロードされていませんでした。だから私は追加: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

+0

.net 4.0を使用していますか? –

+0

@Zach Greenはい4.0を使用しています。そのために何か変わるべきことはありますか? – Cineno28

答えて

2

あなたがデータソースにリンクされたGridViewのソートに建て使用fは、あなたがマークアップでそれらを定義することができます:あなたがあなた自身のソートを実装すると、データバインディングので

<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

+0

@ Cineno28、はい、独自のデータバインディングとソートを実装しているので、マークアップオプションを使用することはできません。独自のソートを実装する際に、自分の答えをオプションで更新しました。 –

+0

ありがとうございました。あなたのコードをVBに変換して追加しました。ソート後、ソートされた実際の列にスタイルが適用されていませんでしたが、htmlをチェックすると、codebehindではなく実際のマークアップに追加するリンク列の空白のヘッダー列に適用されています。実際にソートされた列の代わりにこの列に移動する理由を知っていますか? GridViewのマークアップを追加しただけです。もう一度あなたの助けをありがとう – Cineno28

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(); 
    } 
関連する問題