3

2 を含む asp.net 2.0 ページがありますUpdatePanels

最初のパネルにはコントロールが含まれていTreeViewます。3 つのビュー コントロールでノードを選択すると、2 番目のパネルUpdatePanelのみの更新がトリガーされます。これだけ正しく動作しています。

更新パネルの外側のページには 2 つのボタンがあります (前/次)。これらのボタンは、両方のパネルの更新をトリガーします。ボタンの動作は、ツリー内の隣接するノードを選択することです。これらのボタンのいずれかを初めてクリックすると、期待どおりの動作が得られ、隣接するノードが選択され、両方のパネルが更新されてこの変更が反映されます。

これらのボタンのいずれかをもう一度クリックすると、問題が発生します。ツリービューの選択されたノードは、以前に選択されたノードを覚えているようで、ボタンはこのノードで動作します。したがって、前/次のボタンの動作は、何もしないか、2 つ戻ることです。

編集- 私の問題を示すサンプルコード

マークアップ

 <asp:UpdatePanel ID="myTreeViewPanel" runat="server">
    <ContentTemplate>
       <asp:TreeView runat="server" ID="myTreeView" OnSelectedNodeChanged="myTreeView_SelectedNodeChanged">
          <SelectedNodeStyle BackColor="#FF8000" />
       </asp:TreeView>
    </ContentTemplate>
    <Triggers>
       <asp:AsyncPostBackTrigger ControlID="myButton" EventName="Click" />
    </Triggers>
 </asp:UpdatePanel>
 <asp:UpdatePanel ID="myLabelPanel" runat="server">
    <ContentTemplate>
       <asp:Label runat="server" ID="myLabel" Text="myLabel"></asp:Label>
    </ContentTemplate>
    <Triggers>
       <asp:AsyncPostBackTrigger ControlID="myTreeView" EventName="SelectedNodeChanged" />
       <asp:AsyncPostBackTrigger ControlID="myButton" EventName="Click" />
    </Triggers>
 </asp:UpdatePanel>
 <asp:Button runat="server" ID="myButton" Text="myButton" OnClick="myButton_Click" />

コードビハインド

   protected void Page_Load ( object sender, EventArgs e )
   {
      if ( !IsPostBack )
      {
         myTreeView.Nodes.Add( new TreeNode( "Test 1", "Test One" ) );
         myTreeView.Nodes.Add( new TreeNode( "Test 2", "Test two" ) );
         myTreeView.Nodes.Add( new TreeNode( "Test 3", "Test three" ) );
         myTreeView.Nodes.Add( new TreeNode( "Test 4", "Test four" ) );
         myTreeView.Nodes.Add( new TreeNode( "Test 5", "Test five" ) );
         myTreeView.Nodes.Add( new TreeNode( "Test 6", "Test size" ) );
      }
   }
   protected void myTreeView_SelectedNodeChanged ( object sender, EventArgs e )
   {
      UpdateLabel( );
   }
   protected void myButton_Click ( object sender, EventArgs e )
   {
      // here we just select the next node in the three
      int index = myTreeView.Nodes.IndexOf( myTreeView.SelectedNode );
      myTreeView.Nodes[ index + 1 ].Select( );
      UpdateLabel( );
   }
   private void UpdateLabel ( )
   {
      myLabel.Text = myTreeView.SelectedNode.Value;
   }

ツリーのビューステートが保存されていないようですか?

4

4 に答える 4

4

UpdatePanelコントロールの概要[asp.net]から

UpdatePanelコントロールと互換性のないコントロール

次のASP.NETコントロールは、ページの一部の更新と互換性がないため、UpdatePanelコントロール内ではサポートされていません。

  • TreeViewおよびMenuコントロール。
  • ..。
于 2008-10-20T00:52:06.250 に答える
0

私はほぼ同様の問題に直面しています。CheckedNodesコレクションを失います。同じテクニックで問題が解決するかどうかは疑問です。何か案が?

更新:問題を大幅に解決し、いくつかの回避策を使用しました。詳細はこちらをご覧ください:UpdatePanel内のTreeViewの問題-ノードのチェックボックスのチェックとチェック解除のポストバック、およびAJAXUpdatePanel内でのTreeViewの使用

于 2009-07-07T09:53:01.283 に答える
0

これら 2 つの関数を追加するだけで、選択したノードをページ独自のビュー ステートに保存して復元することで、この問題を解決できます。

protected override object SaveViewState()
{
   ViewState["SelectedNodePath"] = myTreeView.SelectedNode.ValuePath;
   return base.SaveViewState();
}

protected void Page_PreLoad(object sender, EventArgs e)
{
   if (ViewState["SelectedNodePath"] != null)
   {
      TreeNode node = myTreeView.FindNode(ViewState["SelectedNodePath"].ToString());
      if (node != null)
         node.Select();
   }
}

その時点でツリーにノードがないため、選択したノードを LoadViewState() 内にロードできません。だから私はPreLoadでそれを行います。

私がこれをしなければならないのは間違っていると感じています。何か不足していますか?

于 2008-10-15T19:28:47.543 に答える
0

非表示の入力__ViewStateを更新しないというAJAX部分ページポストバックについては、あなたが正しいと思います。

ユーザーが Web サイトのアプリケーション フォームのページに戻ると、更新パネルでも同じことが起こります。通常の入力はビューステートを更新したため、値が再入力されますが、AJAX で更新されたコントロールの状態は記録されないため、既定の状態に戻ります。

于 2008-10-15T16:43:30.873 に答える