문제

2가 포함 된 ASP.NET 2.0 페이지가 있습니다 UpdatePanels.

첫 번째 패널에는 a가 포함되어 있습니다 TreeView 컨트롤, 세 뷰에서 노드를 선택하면 제어 컨트롤이 두 번째 업데이트를 트리거합니다. UpdatePanel 뿐. 이 많은 것이 올바르게 행동하고 있습니다.

업데이트 패널 (이전/Next) 외부 페이지에 두 개의 버튼이 있습니다. 이 버튼은 두 패널의 업데이트를 트리거합니다. 버튼의 동작은 트리의 인접한 노드를 선택하는 것입니다. 이 버튼 중 하나를 처음 클릭하면 예상 동작이 나타나고 인접한 노드가 선택되고 두 패널 이이 변경 사항을 반영하도록 업데이트됩니다.

이 버튼을 다시 클릭하면 문제가 발생합니다. TreeView의 선택된 노드는 이전에 선택한 노드를 기억하고 버튼은이 노드에서 작용합니다. 따라서 이전/다음 버튼의 동작은 아무것도하지 않거나 두 가지를 다시 뛰어 넘는 것입니다.

편집하다 - 내 문제를 보여주는 샘플 코드

마크 업

 <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 Control 개요 [ASP.NET

UpdatePanel 컨트롤과 호환되지 않는 컨트롤

다음 ASP.NET 컨트롤은 부분 페이지 업데이트와 호환되지 않으므로 UpdatePanel 컨트롤 내부에서 지원되지 않습니다.

  • TreeView 및 메뉴 컨트롤.
  • ...

다른 팁

나는 당신이 숨겨진 입력 __viewstate를 업데이트하지 않는 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 () 내부에로드 할 수 없습니다. 그래서 나는 예압으로한다.

내가 이것을해야한다는 것은 잘못된 느낌입니다. 내가 뭔가를 놓치고 있습니까?

나는 거의 비슷한 문제에 직면하고 있습니다. CheckedNodes 컬렉션을 잃습니다. 나는 같은 기술이 내 문제를 해결할 것이라고 의심합니다. 아이디어가 있습니까?

업데이트 :이 문제를 크게 해결하고 일부 해결 방법을 사용했습니다. 자세한 내용을 참조하십시오. Inside UpdatePanel Issue 내부의 TreeView -Node의 확인란 확인 및 선택 취소중인 Postbacks 그리고 Ajax UpdatePanel 내부에서 TreeView를 사용합니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top