Laden...

TreeView Zustand merken

Erstellt von Chris06 vor 17 Jahren Letzter Beitrag vor 17 Jahren 4.213 Views
C
Chris06 Themenstarter:in
130 Beiträge seit 2006
vor 17 Jahren
TreeView Zustand merken

Hi Leute,

ich habe in meiner masterpage einen treeview.

Wenn ich durch meine Seite navigiere, wird der TreeView bei jedem neuen Seitenaufruf neu geladen. Das heisst er ist immer wieder zugeklappt.

Wie kann ich es hinbekommen, den Status des Tree´s zu speichern und diesen dann auf der neuen Page wieder herzustellen?

1.665 Beiträge seit 2006
vor 17 Jahren

Schau mal ob es in der TreeView eine Methode o. Ä. gibt wie: SaveState, -Layout

C
Chris06 Themenstarter:in
130 Beiträge seit 2006
vor 17 Jahren

nein gibt es leider nicht.

Habe alle [TreeView.] Möglichkeiten durchgeschaut.

C
Chris06 Themenstarter:in
130 Beiträge seit 2006
vor 17 Jahren

Gibt es vllt. eine Möglichkeit, der masterpage zu sagen, sie soll nur den contentbereich neu laden, und den rest so belassen?

Soweit ich weis wird ja jedesmal die masterpage mit der contentpage zusammen geladen.

T
94 Beiträge seit 2006
vor 17 Jahren

wenn du die knoten bearbeitest, sag doch grad, dass expanded true sein soll und schon ist immer der knoten expanded! das ist ja das was du haben willst, wenn ich dich richtig verstanden habe..

mfg

If you don't like me for who I am, then you don't like me for who I am, but all you're gonna get, is who I am.

1.665 Beiträge seit 2006
vor 17 Jahren

Original von thejudge
wenn du die knoten bearbeitest, sag doch grad, dass expanded true sein soll und schon ist immer der knoten expanded! das ist ja das was du haben willst, wenn ich dich richtig verstanden habe..

mfg

das allein wird nicht reichen und ist sicher komplizierter als das was mir gerade eingefallen ist:

Original von Chris06
Gibt es vllt. eine Möglichkeit, der masterpage zu sagen, sie soll nur den contentbereich neu laden, und den rest so belassen?

Soweit ich weis wird ja jedesmal die masterpage mit der contentpage zusammen geladen.

Soweit ich weiß, kannst du auch nur einzelne ContentPages neu laden lassen. Und wenn ich mich recht entsinne, gibts dazu einen Thread der erst kürzlich behandelt und gelöst wurde. Such dich also hier im Forum einfach mal durch 🙂

C
Chris06 Themenstarter:in
130 Beiträge seit 2006
vor 17 Jahren

Wenn du diesen Artikel meintest:
Nur einen Teil der Seite laden....

Der bringt mich nicht wirklich weiter, ich arbeite ja nicht mit frames.
Deswegen habe ich ja die masterpage.

Hatte nach contentpage gesucht.......aber nichts brauchbares gefunden

C
Chris06 Themenstarter:in
130 Beiträge seit 2006
vor 17 Jahren

Original von thejudge
wenn du die knoten bearbeitest, sag doch grad, dass expanded true sein soll und schon ist immer der knoten expanded! das ist ja das was du haben willst, wenn ich dich richtig verstanden habe..

mfg

Ich bearbeite die Knoten aber nicht.
Das einzigste was passiert ist, dass beim click auf der untersten Tree-Ebene eine neue Seite geöffnet wird.

Der Tree wird ja ausserdem auf jeder Seite neu geladen, gezeichnet usw.

T
94 Beiträge seit 2006
vor 17 Jahren

also wenn du die treeview erstellst kannst du doch im property window auf Nodes klicken und an nem knotenpunkt die eigenschaft expanded auf true stellen und dann bleibt das teil die ganze zeit geöffnet, so wie dus willst.

solltest du die treeview erst später erstellen, kannste ja immernoch die property ändern.

mfg

If you don't like me for who I am, then you don't like me for who I am, but all you're gonna get, is who I am.

T
243 Beiträge seit 2006
vor 17 Jahren

Um einen Teil/nur den Inhalt der Seite neu zu laden, musst du AJAX/ATLAS verwenden. Das mache ich auch und es funktioniert super. Stichwort: UpdatePanel

C
Chris06 Themenstarter:in
130 Beiträge seit 2006
vor 17 Jahren

Original von thejudge
also wenn du die treeview erstellst kannst du doch im property window auf Nodes klicken und an nem knotenpunkt die eigenschaft expanded auf true stellen und dann bleibt das teil die ganze zeit geöffnet, so wie dus willst.

solltest du die treeview erst später erstellen, kannste ja immernoch die property ändern.

mfg

Der Tree soll am Anfang erstmal komplett zu sein.
Jetzt expanded der User ein paar nodes (es wird keine von mir erstellte exception geworfen, nur beim untersten node)

Wenn der User auf eine neue Seite kommt, wird der tree neu geladen, woher soll ich jetzt wissen, welche nodes ich auf expanded stellen muss?

C
Chris06 Themenstarter:in
130 Beiträge seit 2006
vor 17 Jahren

Original von typhos
Um einen Teil/nur den Inhalt der Seite neu zu laden, musst du AJAX/ATLAS verwenden. Das mache ich auch und es funktioniert super. Stichwort: UpdatePanel

Ist das nicht kompliziert? Ich kenne AJAX jetzt nicht genau, aber was ich so gehört habe, scheint das recht mächtig zu sein.
Und mir fehlt leider die Zeit mich noch großartig in was neues einzuarbeiten.

C
Chris06 Themenstarter:in
130 Beiträge seit 2006
vor 17 Jahren

Hi typhos,

ich habe mir das AJAX mal angeschaut und auch ausprobiert.

Habe in meiner masterpage den contentplaceholder in einen updatepanel gepackt.

Laufen tut das sogar, nur geändert hat sich überhaupt nichts...

Was ich rausgefunden habe
(aus Artikel asp.net ajax (Atlas))
Das kann so wohl nicht funktionieren, da ich ja viele verschiedene aspx Sites habe.
Und jede dieser Sites läd die masterpage neu.

Ideen???

C
Chris06 Themenstarter:in
130 Beiträge seit 2006
vor 17 Jahren

Ich habe eine Lösung gefunden (dank joerg.uth)

Falls es noch jemanden interessiert, hier ist der Code.

using System;
using System.Web.UI.WebControls;
using System.Collections.Generic;

public partial class Site_master : System.Web.UI.MasterPage {
    protected void Page_Load(object sender, EventArgs e) {
        // Disable ExpandDepth if the TreeView’s expanded/collapsed
        // state is stored in session.
        if (Session["TreeViewState"] != null)
            TreeView1.ExpandDepth = -1;
}

    protected void TreeView1_DataBound(object sender, EventArgs e)
    {
        if (Session["TreeViewState"] == null)
        {
            // Record the TreeView’s current expanded/collapsed state.
            List<string> list = new List<string>(16);
            SaveTreeViewState(TreeView1.Nodes, list);
            Session["TreeViewState"] = list;
        }
        else
        {
            // Apply the recorded expanded/collapsed state to
            // the TreeView.
            List<string> list = (List<string>)Session["TreeViewState"];
            RestoreTreeViewState(TreeView1.Nodes, list);
        }
    }

    protected void TreeView1_TreeNodeCollapsed(
        object sender, TreeNodeEventArgs e)
    {
        if (IsPostBack) {
            List<string> list = new List<string>(16);
            SaveTreeViewState(TreeView1.Nodes, list);
            Session["TreeViewState"] = list;
        }
    }

     protected void TreeView1_TreeNodeExpanded(
        object sender, TreeNodeEventArgs e)
    {
        if (IsPostBack) {
            List<string> list = new List<string>(16);
            SaveTreeViewState(TreeView1.Nodes, list);
            Session["TreeViewState"] = list;
        }
    }

    private void SaveTreeViewState(
            TreeNodeCollection nodes, List<string> list) {
        // Recursively record all expanded nodes in the List.
        foreach (TreeNode node in nodes)
        {
            if (node.ChildNodes != null && node.ChildNodes.Count != 0) {
                if (node.Expanded.HasValue && node.Expanded == true &&
                    !String.IsNullOrEmpty(node.Text))
                        list.Add(node.Text);
                SaveTreeViewState(node.ChildNodes, list);
            }
        }
    }

    private void RestoreTreeViewState(
            TreeNodeCollection nodes, List<string> list) {
        foreach (TreeNode node in nodes)
        {
            // Restore the state of one node.
            if (list.Contains(node.Text)) {
                if (node.ChildNodes != null &&
                    node.ChildNodes.Count != 0 &&
                    node.Expanded.HasValue &&
                    node.Expanded == false)
                    node.Expand();
            }
            else if (node.ChildNodes != null &&
                    node.ChildNodes.Count != 0 &&
                    node.Expanded.HasValue &&
                    node.Expanded == true)
            {
                    node.Collapse();
            }

            // If the node has child nodes, restore their states, too.
            if (node.ChildNodes != null && node.ChildNodes.Count != 0)
                RestoreTreeViewState(node.ChildNodes, list);
        }
    }
}
T
243 Beiträge seit 2006
vor 17 Jahren

Original von Chris06
Laufen tut das sogar, nur geändert hat sich überhaupt nichts...

Was ich rausgefunden habe
(aus Artikel
>
)
Das kann so wohl nicht funktionieren, da ich ja viele verschiedene aspx Sites habe.
Und jede dieser Sites läd die masterpage neu.

Ich meinte damit ja auch, dass Du nur eine aspx Seite haben solltest, in der dann nur der Inhalt (im UpdatePanel) geändert wird, wenn Du auf eine andere Seite springst, wird natürlich die Masterpage auch neu geladen...

1.130 Beiträge seit 2005
vor 17 Jahren