3

我有一个包含 2 的 asp.net 2.0 页面UpdatePanels

第一个面板包含一个TreeView控件,当我在三视图控件中选择一个节点时,它只会触发第二个的更新UpdatePanel。这是正确的行为。

更新面板之外的页面上有两个按钮(上一个/下一个)。这些按钮触发两个面板的更新。按钮的行为是选择树中的相邻节点。第一次单击其中一个按钮时,我得到了预期的行为,并且选择了相邻节点,并且两个面板都被更新以反映此更改。

当我再次单击这些按钮中的任何一个时,就会出现问题。树视图的选定节点似乎记住了先前选定的节点,并且按钮作用于该节点。所以上一个/下一个按钮的行为是什么都不做或跳回两个。

编辑- 演示我的问题的示例代码

标记

 <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 和菜单控件。
  • ...
于 2008-10-20T00:52:06.250 回答
0

我认为您对 AJAX 部分页面回发是正确的,它不会更新隐藏的输入 __ViewState。

当用户导航回我的网站申请表中的页面时,我的更新面板也有同样的情况。正常输入已更新视图状态,因此它们的值被重新填充,但使用 AJAX 更新的控件的状态未记录,因此它们恢复为默认状态。

于 2008-10-15T16:43:30.873 回答
0

我可以通过在页面自己的视图状态下保存和恢复所选节点来解决这个问题,只需添加这两个功能。

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

我面临着几乎类似的问题。我丢失了 CheckedNodes 集合。我怀疑同样的技术能否解决我的问题。任何的想法?

更新:我在很大程度上解决了这个问题并使用了一些解决方法。在此处查看详细信息:TreeView inside UpdatePanel issue - postbacks on check and uncheck of the node's Checkbox and Using TreeView inside AJAX UpdatePanel

于 2009-07-07T09:53:01.283 回答