6

私はグリッドビューを持っています。内部には、ボタンを含む CollapsiblePanelExtender があります。ボタンを押すと、ポストバックが発生し、CollapsiblePanelExtender が閉じます。ポストバック後にCollapsiblePanelExtenderを開いたままにするソリューションを作成しようとしています。これは私がこれまでに試みたことです:

function pageLoad(sender, args) {
   var objExtender;                
   var retval="";               

   if (document.getElementById(GridView1)) {
      retval = document.getElementById(GridView1);
   }
   var CollapsiblePanelExtender1 = retval.getElementsByTagName("CollapsiblePanelExtender1");

   if(CollapsiblePanelExtender1.get_Collapsed()) {
      CollapsiblePanelExtender1.set_Collapsed(true);
   }
   else {
      CollapsiblePanelExtender1.set_Collapsed(false);
   }
}
4

3 に答える 3

1

基本的に、CollapsiblePanelExtender はポストバック中に状態を保持します。しかし、ポストバック中に、データバインドを実行すると思います(実行したと思います)。データバインディング中にすべてのコントロールが再作成されるため、内部状態が失われます。

問題を解決するには、データバインディングを実行する前に CollapsiblePanelExtender の状態を保存してから、この状態を復元することをお勧めします。これはサーバー側で実行できます。これは、アニメーションが有効になっている場合に UI のちらつきを防ぐのにも役立ちます。

したがって、CollapsiblePanelExtender の状態を取得するには、クライアント状態の値を覚えておくだけです。その後、この値を復元できます。たとえば、これはサーバー側で CollapsiblePanelExtender を展開/折りたたむために使用できるコードです。

// To collapse panel.
this.CollapsiblePanelExtender1.ClientState = "true";

// To Expand panel.
this.CollapsiblePanelExtender1.ClientState = "false";

クライアント側で CollapsiblePanelExtender を折りたたみ/展開したい場合は、次のようなコードが必要です。

Sys.Application.add_load(function() {
    var extender = $find('<%= this.CollapsiblePanelExtender1.ClientID  %>');

    extender.expandPanel();

    extender.collapsePanel();
});

編集 クリックハンドラーで状態を復元しようとするため、これは役に立ちません。グリッド ビュー コントロールのデータバインドを呼び出すと、行はすぐには再作成されません。そのため、折りたたみ可能なエクステンダー コントロールの状態を設定 (復元) したい場合は、グリッドの RowCreated イベント ハンドラーで行うことをお勧めします。

たとえば、次のようなコードを使用できます。

    protected void GridView_OnRowCreated(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow && SomeValueToIdentifyThatThisPanelShouldBeExpanded)
        {
            CollapsiblePanelExtender extender =
                e.Row.FindControl("CollapsiblePanelExtender1") as CollapsiblePanelExtender;
            extender.ClientState = "false";
        }
    }
于 2013-10-21T14:17:23.203 に答える