myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Gemeinschaft » .NET-Komponenten und C#-Snippets » Verzögertes Laden von Daten im TreeView
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Verzögertes Laden von Daten im TreeView

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Programmierhans
myCSharp.de-Poweruser/ Experte

avatar-1651.gif


Dabei seit: 05.04.2005
Beiträge: 4.221
Entwicklungsumgebung: VS2003-VS2013 / SAP WebIDE
Herkunft: Zentralschweiz


Programmierhans ist offline

Verzögertes Laden von Daten im TreeView

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Mit ganz wenig Code kann man sich selber einen TreeView ableiten und diesem ganz neue Funktionalitäten einbauen.

Mal angenommen wir haben einen mehrstufigen Baum zur Navigation.

-Name
+-Meier
++-Hauptstrasse 17
++-Irgendwo

+-Huber
...
...
usw.

Dann wäre es doch praktisch wenn man von Meier nur den Namen holen muss ohne alle ChildNodes reinzuhauen obwohl gar nie jemand Meier expandet.

Zudem sind ja Daten eh nur kurzlebig.... also macht es eventuell Sinn die Daten beim Collapse wieder wegzuwerfen.

Kurzum: man will (braucht) ja das + vor dem Node.... also hängt man Fake-Nodes rein.

der Code des TreeView

C#-Code:
using System;
using System.Windows.Forms;

namespace TreeTest
{

    public class LoadOnDemandTreeView:TreeView
    {
        private bool _blnFakeNodes=true;
        public LoadOnDemandTreeView()
        {
        }

        public bool FakeNodes
        {
            get{return this._blnFakeNodes;}
            set{this._blnFakeNodes=value;}
        }

        public bool FakeNode(TreeNode pTreeNodeToFake)
        {
            bool ret=false;

            if (pTreeNodeToFake!=null && !pTreeNodeToFake.IsExpanded && pTreeNodeToFake.Nodes.Count==0)
            {
                TreeNode ndFake=new TreeNode("fake");
                ndFake.Tag="fake";
                pTreeNodeToFake.Nodes.Add(ndFake);
                ret=true;
            }
            return ret;
        }

        protected override void OnBeforeExpand(TreeViewCancelEventArgs e)
        {
            if(_blnFakeNodes && e.Node.Nodes.Count>0 && e.Node.Nodes[0].Tag!=null && e.Node.Nodes[0].Tag.ToString()=="fake"  )
            {
                e.Node.Nodes.Clear();
                this.OnLoadData(e);
            }
            base.OnBeforeExpand (e);
        }
        protected override void OnAfterCollapse(TreeViewEventArgs e)
        {
            base.OnAfterCollapse (e);
            if (_blnFakeNodes)
            {
                e.Node.Nodes.Clear();
                TreeNode ndFake=new TreeNode("fake");
                ndFake.Tag="fake";
                e.Node.Nodes.Add(ndFake);
            }
        }


        private void OnLoadData(TreeViewCancelEventArgs e)
        {
            if (this.LoadData!=null)
            {
                this.LoadData(this,e);
            }
        }
        public event TreeViewCancelEventHandler LoadData;
    }
}

Code auf dem TestForm:

C#-Code:
private void treeView1_LoadData(object sender, System.Windows.Forms.TreeViewCancelEventArgs e)
        {
            e.Node.Nodes.Add(new TreeNode(DateTime.Now.ToShortTimeString()));
        }

        private void Form1_Load(object sender, System.EventArgs e)
        {
            TreeNode ndTest=new TreeNode("Test");
            this.treeView1.Nodes.Add(ndTest);
            this.treeView1.FakeNode(ndTest);
        }

-Beim Laden des TestForms wird ein Node reingehängt (Test)
-dieser wird gefaket mit this.treeView1.FakeNode(ndTest);
er erhält also einen fake Node (dadurch erscheint das +)

Wenn nun jemand den TestNode expanden will wird der LoadData Event geworfen. In diesem hängt man dann die nächste Stufe rein (und faket gegebenenfalls auch dessen ChildNodes)

Zudem ist es so angedacht, dass die Nodes beim Collapsen wieder gelöscht und dafür ein neues faking eingeleitet wird.

Beim nächsten LoadData sind die ChildNodes dann nicht mehr da und werden neu geladen... (Daten sind aktueller)

Die verwendeten Nodes-Klassen sind frei... man muss auch kein Interface implementieren...

Das ganze habe ich einfach mal so hingepinselt weil mich das Thema interessiert hat... was meint Ihr zu so einem Ansatz ?

Stichworte: lazy loading, on demand


mycsharp.de  Moderationshinweis von herbivore (17.07.2013 16:54):

Siehe auch  FileTreeView
 
22.06.2005 00:08 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
RIDI2oo5 RIDI2oo5 ist männlich
myCSharp.de-Mitglied

avatar-1677.jpg


Dabei seit: 13.06.2005
Beiträge: 140
Entwicklungsumgebung: Visual Studio .NET
Herkunft: Graubünden, Schweiz


RIDI2oo5 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

also ich finde die idee sehr gut, und vor allem bei treeview's mit sehr vielen nodes/subnodes ist auf diese weise sehr viel rauszuholen.
ich verwende im geschäft hauptsächlich den treeview der infragistic netAdvantage tools (componenten-library). dieses treeview hat diese funktion bereits eingebaut. ich hab' mal einen kleinen performance-test gemacht, und der unterschied ist beträchtlich. allerdings muss man gut abschätzen, ob es wirklich notwendig ist. wenn man natürlich einen treeview hat, der nicht sehr gross ist, macht es wenig sinn wenn bei jedem klick auf ein node wieder geladen werden muss.
aber grundsätzlich: TOP!
Daumen hoch
22.06.2005 09:38 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegt mehr als ein Jahr.
TNDAri TNDAri ist männlich
myCSharp.de-Mitglied

avatar-2507.jpg


Dabei seit: 30.09.2006
Beiträge: 139
Entwicklungsumgebung: VS2005 Express, VS2008 Express
Herkunft: Bremen


TNDAri ist offline Füge TNDAri Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hab mal eine MP3 Datenabnk in Delphi (Ja ich weiss Augenzwinkern ) geschrieben und das gleiche prinzip benutzt. Es bringt echt extrem viel speed ab einer grossen anzahl von datensätzen.

Also Daumen hoch Daumen hoch großes Grinsen
02.10.2006 16:58 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 15 Jahre.
Der letzte Beitrag ist älter als 13 Jahre.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 25.09.2020 02:12