Por que o meu asp: TreeView selecionado redefinição nó quando em um UpdatePanel?
-
03-07-2019 - |
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?
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