2011-02-08 13 views
2

私はRowDataBoundイベントを使用して、私のGridViewのデータに条件付き書式の変更を作っています:これは動作しますAsp.net Gridview - なぜDataRowBoundの変更ソートで失われますか?

void gvReg_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 

     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 

      DateTime lastUpdate DateTime.Parse(DataBinder.Eval (e.Row.DataItem, "LAST_UPDATE"); 

      if (lastUpdate < DateTime.Today.AddMonths(-1)) 
      { 

      Hyperlink hypLastUpdate = (Hyperlink)e.Row.FindControl("hypLastUpdate"; 
      hypLastUpdate.CssClass = "Error"; 
      hypLastUpdate.NavigateUrl = "http://www.someExampleErrorPage.com"; 

      } 

     } 

    } 

、および(それ大胆な赤の耳障りな日陰になる)ハイパーリンクに適切なのCssClassを設定しますが、グリッドビューがソートされると(ユーザーが列見出しをクリックすると)、cssクラスはhypLastUpdateでリセットされ、スタイルと関連付けられたNavigateUrlプロパティの両方が失われます。

コントロールhypLastUpdateは、gridviewのテンプレートフィールドに含まれています。テキスト値は、 "LAST_UPDATE"というフィールドにバインドされたデータです。

これは計画された動作ですか(RowDataBoundイベントで実行される条件付き書式を解除するためにソートされていますか)、または間違って何かを実行していないことを確認するためのチェックがありますか?

コードビハインドのどこでもDataBindメソッドを使用していません。問題のgridviewのviewstateがオンになっています。

--EDIT--

これは、イベント処理に間違いことになりました。ページのloadイベントの内部

gvReg.Sorted += {SomeEventHandler} 

が、それはポストバックではなかったときにのみ:

私がやっていました。この関数は、グリッドビューがソートされた後にgvReg.DataBindと呼ばれました。私は、ハンドラのワイヤを削除し、代わりにイベントハンドラ関数をOnSortedイベントに追加しました。私は、グリッドビューへの代理人の割り当てはコールバック間でViewStateに保存されないと思いますか?

+1

です。つまり、データセットをソートするか、 'pSortExpression = e.SortExpression;'と 'pSortDirection =(pSortDirection == SortDirection.Ascending?SortDirection.Descending:SortDirectionに基づいてデータベースを再クエリすることによって、データソースを再バインドする必要があるということです。 .escending); 'on' protected void gvReg_Sorting(オブジェクト送信者、GridViewSortEventArgs e) 'イベントで、' gvReg_RowDataBound'が再度呼び出されるようにします。これを行う前に 'e.SortExpression.Length> 0'をチェックする必要があります。 –

+1

@wllmsaccnt :RowDataBoundイベントハンドラにブレークポイントを設定します。ソート後にこのイベントハンドラに到達しますか? –

+0

@Scott Mitchell:並べ替えの後にRowDataBoundに到達していません。私のテンプレートフィールド項目のViewStateは、RowDataBoundイベントの後で(ソート操作の後など)条件付き書式を保存してはいけませんか? – wllmsaccnt

答えて

4

こんにちは、ここで私のコメントに何を意味したかの簡単な例です。これは、私が考えることができる唯一の方法です:グリッドビューの並べ替えイベントで、データ `gvReg.DataBind();`を再バインドする必要があるのは、

protected void gvReg_Sorting(object sender, GridViewSortEventArgs e) 
    { 
     GridView gridView = (GridView)sender; 

     if (e.SortExpression.Length > 0) 
     { 
      foreach (DataControlField field in gridView.Columns) 
      { 
       if (field.SortExpression == e.SortExpression) 
       { 
        cellIndex = gridView.Columns.IndexOf(field); 
        break; 
       } 
      } 

      if (pSortExpression != e.SortExpression) 
      { 
       pSortDirection = SortDirection.Ascending; 
      } 
      else 
      { 
       pSortDirection = (pSortDirection == SortDirection.Ascending ? SortDirection.Descending : SortDirection.Ascending); 
      } 
      pSortExpression = e.SortExpression; 
     } 

     //Retrieve the table from the database 
     pSortOrder = pSortDirection == SortDirection.Ascending ? "ASC" : "DESC"; 
     List<Partners> partnerList = GetPartnerList(); 

     gvReg.DataSource = partnerList; 
     gvReg.DataBind(); 

    } 
+0

+1のレスポンスですが、私はそれが答えではないと思います(私は追加の回答が表示されない場合は1とマークします)。私のソートはソート機能では提供されません。私はsqldatasourceで組み込みのソートを使用しています。 – wllmsaccnt

関連する問題