我有一个asp.net 2.0网页,包括2 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;
   }

它就像是视图状态的树是不救吗?

有帮助吗?

解决方案

UpdatePanel控制概述asp.net]

控制不兼容的UpdatePanel控制

下ASP.NET 控制是不兼容的部分的页面更新,因此不支持内部UpdatePanel控制:

  • 树视图和菜单的控制。
  • ...

其他提示

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

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

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

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中做到了。

我必须这样做才感觉不对。我错过了什么吗?

我面临着类似的问题。我丢失了CheckedNodes集合。我怀疑同样的技术会解决我的问题。有什么想法吗?

更新:我在很大程度上解决了这个问题并使用了一些解决方法。请在此处查看详细信息: UpdatePanel内部的TreeView问题 - 检查和取消选中节点的复选框的回发和在AJAX UpdatePanel中使用TreeView

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top