Pergunta

Eu tenho uma página asp.net 2.0 que contém 2 UpdatePanels.

O primeiro painel contém um controle TreeView, quando eu seleciono um nó no controle três vista ele dispara uma atualização de apenas o segundo UpdatePanel. Esta muito está se comportando corretamente.

Há dois botões do lado de fora página de um painel de atualização (anterior / seguinte). Estes botões desencadear uma atualização de ambos os painéis. O comportamento dos botões é selecionar o nó adjacente na árvore. A primeira vez que eu clicar em um desses botões I obter o comportamento esperado, e nó adjacente é selecionado e os dois painéis são atualizados para refletir essa mudança.

O problema acontece quando clico em qualquer um destes botões novamente. O nó selecionado do treeview parece lembrar o nó selecionado anteriormente e os botões de agir sobre esse nó. Assim, o comportamento dos seguintes botões anterior / é não fazer nada ou saltar para trás dois.

Editar - código de exemplo que demonstra o meu problema

A marcação

 <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" />

O atrás de código

   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;
   }

É como o viewstate da árvore não está sendo salvo?

Foi útil?

Solução

A partir UpdatePanel Controle Overview [asp.net]

Os controles que não são compatíveis com controles UpdatePanel

Os seguintes controlos ASP.NET não são compatíveis com as actualizações de página parcial, e portanto não são suportadas no interior de um controle UpdatePanel:

  • controles TreeView e menu.
  • ...

Outras dicas

Eu acho que você está certo sobre a página de AJAX postback parcial que não atualizar o __VIEWSTATE entrada escondida.

Eu tenho a mesma coisa com os meus painéis de atualização quando um usuário navega de volta para as páginas no meu formulário de inscrição website. As entradas normais atualizou o viewstate e assim os seus valores são repovoada mas o estado dos controles que foram atualizados com AJAX não é registrada e, assim, reverter para o estado padrão.

posso corrigir este problema, salvar e restaurar o nó selecionado nas páginas estado próprio ponto de vista, por apenas acrescentou estas duas funções.

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();
   }
}

Eu não posso carregar o selecionado o nó dentro LoadViewState () porque a árvore não tem quaisquer nós nesse ponto. Então eu fazê-lo na pré-carga.

Ele só se sente mal que eu tenho que fazer isso. Estou faltando alguma coisa?

Estou enfrentando quase um problema semelhante. Eu perco a coleção CheckedNodes. Duvido a mesma técnica vai resolver meus problemas. Alguma idéia?

Update: Eu resolvi o problema, em grande medida e usado algumas soluções. Veja os detalhes aqui: TreeView dentro UpdatePanel questão - postbacks em marcar e desmarcar da Caixa de seleção do nó e Usando TreeView dentro AJAX UpdatePanel

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top