Frage

Ich habe eine asp.net 2.0-Seite, die 2 UpdatePanels enthält.

Die erste Platte enthält eine TreeView Steuerung, wenn ich einen Knoten in der Dreiseitenansichts-Steuerung auszuwählen löst eine Aktualisierung des zweiten UpdatePanel nur. So viel verhält richtig.

Es gibt zwei Tasten auf der Seite außerhalb eines Update-Panel (Zurück / Weiter). Diese Tasten lösen eine Aktualisierung beiden Platten. Das Verhalten der Knöpfe ist, die benachbarten Knoten in der Baumstruktur auszuwählen. Das erste Mal, dass ich auf eine dieser Schaltflächen klicken ich das erwartete Verhalten zu bekommen, und benachbarten Knoten ausgewählt, und die beiden Platten werden aktualisiert, um diese Änderung widerzuspiegeln.

Das Problem tritt auf, wenn ich wieder eine dieser Schaltflächen klicken. Der ausgewählte Knoten der Baumstruktur scheint den zuvor ausgewählten Knoten und die Tasten wirken auf diesen Knoten zu erinnern. So ist das Verhalten der vorherigen / nächsten Tasten ist, nichts zu tun oder wieder zwei springen.

Bearbeiten - Beispielcode, der mein Problem zeigt

Das Markup

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

Der Code hinter

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

Es ist wie der Ansichtszustand des Baumes nicht gespeichert wird?

War es hilfreich?

Lösung

Updatekontrolle Übersicht [asp.net]

  

Steuerelemente, die nicht kompatibel mit Update Kontrollen ist

     

Der folgende ASP.NET-Steuerelemente ist nicht kompatibel mit Teilaktualisierungen von Seiten und ist daher nicht in einer Updatesteuerung unterstützt:

     
      
  • TreeView und Menüsteuerung.
  •   
  • ...
  •   

Andere Tipps

Ich glaube, dass Sie sich über den AJAX Teil Seite Postbacks sind, dass es nicht den versteckten Eingang __VIEWSTATE nicht aktualisiert.

Ich habe das gleiche mit meinem Update-Panels, wenn ein Benutzer auf die Seiten in meiner Website Antragsformular navigiert zurück. Die normalen Eingänge haben den Ansichtszustand aktualisiert und so sind ihre Werte neu besiedelt, aber der Zustand der Steuerelemente, die mit AJAX aktualisiert wurde nicht aufgezeichnet und damit sie wieder auf den Standardzustand.

Ich kann dieses Problem beheben, indem Sie Speichern und Wiederherstellen der ausgewählten Knoten auf den Seiten eigene Sicht Zustand, nur um diese beiden Funktionen hinzugefügt.

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

Ich kann nicht den Knoten innerhalb Loadviewstate ausgewählt laden (), weil der Baum keine Knoten an diesem Punkt hat. So mache ich es in PreLoad.

Es fühlt sich einfach falsch, dass ich dies zu tun. Bin ich etwas fehlt?

Ich bin vor fast ein ähnliches Problem. Ich verliere die CheckedNodes Sammlung. Ich bezweifle, dass die gleiche Technik, meine Probleme zu lösen. Jede Idee?

Update: Ich habe das Problem zu einem großen Teil gelöst und einige Abhilfen verwendet. Details hierzu finden Sie hier: Verwendung von TreeView innerhalb AJAX Update

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top