私は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に保存されないと思いますか?
です。つまり、データセットをソートするか、 'pSortExpression = e.SortExpression;'と 'pSortDirection =(pSortDirection == SortDirection.Ascending?SortDirection.Descending:SortDirectionに基づいてデータベースを再クエリすることによって、データソースを再バインドする必要があるということです。 .escending); 'on' protected void gvReg_Sorting(オブジェクト送信者、GridViewSortEventArgs e) 'イベントで、' gvReg_RowDataBound'が再度呼び出されるようにします。これを行う前に 'e.SortExpression.Length> 0'をチェックする必要があります。 –
@wllmsaccnt :RowDataBoundイベントハンドラにブレークポイントを設定します。ソート後にこのイベントハンドラに到達しますか? –
@Scott Mitchell:並べ替えの後にRowDataBoundに到達していません。私のテンプレートフィールド項目のViewStateは、RowDataBoundイベントの後で(ソート操作の後など)条件付き書式を保存してはいけませんか? – wllmsaccnt