Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Treeview Sortierung nach Tag - Object Member
Pedro_15
myCSharp.de - Member



Dabei seit:
Beiträge: 375
Herkunft: In der Nähe von Berlin

Themenstarter:

Treeview Sortierung nach Tag - Object Member

beantworten | zitieren | melden

Hallo,

wie kann ich ein Treeview Sortieren nach einem Wert aus dem Tag-Object.


treeview1.tag = testObject;

testObject.SortName;

Gibt es eine Möglichleit den Treeview nach dem Sortname zu sortieren?

Danke!

Pedro
private Nachricht | Beiträge des Benutzers
Afrokalypse
myCSharp.de - Member



Dabei seit:
Beiträge: 452

beantworten | zitieren | melden

kommt drauf an was du sortieren möchtest. aber grundsätzlich gehts. wenn ich mich nicht irre gibts für zahlen zB einen algorythmus der sich bubblesort nennt.
kannst ja mal im forum danach suchen. oder suchst nach 'treeview sortieren'. woher du die werte zum sortieren nimmst ist ja im endeffekt egal
Signatur:
Die Signatur wird unter Ihren Beiträgen dargestellt.

:O ?( 8) ;( 8o :] =) X( :rolleyes: :baby: :evil: :tongue:
Smilies find ich doof =]
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Afrokalypse,

mit BubbleSort kann man alles sortieren, was man überhaupt sortieren kann, nicht nur Zahlen. Allerdings ist Bubblesort ein sehr schlechtes (ineffizientes) Sortierverfahren. Man sollte es nicht benutzen. Davon abgesehen muss man gar kein Sortierverfahren selber schreiben, sondern das ist schon durch TreeView.Sort vorgegeben. Man muss nur den TreeViewNodeSorter schreiben also eine Vergleichsroutine für Knoten.

Hallo Pedro_15,

und an dieser Stelle setzt jetzt auch die Antwort auf eine Frage an. Was man im eigenen TreeViewNodeSorter zum Vergleich von zwei Nodes für Informationen heranzieht, kann man selbst bestimmen. Natürlich auch TreeNode.Tag.

herbivore
private Nachricht | Beiträge des Benutzers
Pedro_15
myCSharp.de - Member



Dabei seit:
Beiträge: 375
Herkunft: In der Nähe von Berlin

Themenstarter:

beantworten | zitieren | melden

Laut Microsoft soll das so gehen, aber treeView1.TreeViewNodeSorter gibt es bei mir nicht?????


private void button1_Click(object sender, EventArgs e)
{
    treeView1.TreeViewNodeSorter = new NodeSorter();
}

// Create a node sorter that implements the IComparer interface.
public class NodeSorter : IComparer
{
    // Compare the length of the strings, or the strings
    // themselves, if they are the same length.
    public int Compare(object x, object y)
    {
        TreeNode tx = x as TreeNode;
        TreeNode ty = y as TreeNode;

        // Compare the length of the strings, returning the difference.
        if (tx.Text.Length != ty.Text.Length)
            return tx.Text.Length - ty.Text.Length;

        // If they are the same length, call Compare.
        return string.Compare(ty.Text, tx.Text);
    }
}

private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Pedro_15,

gibt es erst ab 2.0. Wie es unter 1.1 geht habe ich nicht parat. Aber da es auch TreeView.Sort erst am 2.0 gibt, denke ich mal, dass du auf 2.0 Umsteigen oder es doch von Hand tun musst.

herbivore
private Nachricht | Beiträge des Benutzers
Pedro_15
myCSharp.de - Member



Dabei seit:
Beiträge: 375
Herkunft: In der Nähe von Berlin

Themenstarter:

beantworten | zitieren | melden

Na auf 2.0 umsteigen ist leider nicht möglich.
TreeView.Sort gibt es schon in 1.1

Aber vielleicht kann ja jemand weiter helfen.

So geht es auch nicht sortieren tut er nicht, sondern er verdoppelt nur den Hauptknoten mit allen Unterknoten.

Hat jemand eine Idee?


public class NodeSorter : IComparer
{
	// Compare the length of the strings, or the strings
	// themselves, if they are the same length.
	public int Compare(object x, object y)
	{
		TreeNode tx = x as TreeNode;
		TreeNode ty = y as TreeNode;

		return tx.Text.CompareTo(ty.Text); 

	}
}


private void SortNodes(TreeNodeCollection nodes) 
{ 
	ArrayList arl = ArrayList.Adapter(nodes); 
	arl.Sort(new NodeSorter()); 
} 


protected delegate void MethodTreeSort (TreeNodeCollection pNodes);

treeView1.Invoke (new MethodTreeSort (SortNodes),
	new Object [] { treeView1.Nodes});

private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Pedro_15,

dann ist die SDK-Doku an diesem Puntkt falsch. TreeView.Sort: Supported in: .NET Framework 2.0

Aber ich will nicht von deiner Frage ablenken.

herbivore
private Nachricht | Beiträge des Benutzers
Pedro_15
myCSharp.de - Member



Dabei seit:
Beiträge: 375
Herkunft: In der Nähe von Berlin

Themenstarter:

beantworten | zitieren | melden

Hallo,

ich bekomme bei treeView1.Nodes immer nur ein NodeElement. Bekomme ich immer nur die erste Ebene ?

Pedro

PS: Das Problem ist nicht das sortieren, sondern das er in der Collection nur die erste Ebene bekommt.

Wie bekommt man alle Nodes.
private Nachricht | Beiträge des Benutzers
AlfameisterT
myCSharp.de - Member



Dabei seit:
Beiträge: 154

beantworten | zitieren | melden

Also das der nur die oberste Ebene durchsucht liegt daran das du die Elemente auf Unterelemente abfragen musst.
z.B. 'nodes.Nodes.Count > 0'

Dann würde das Sortieren ansich funktionieren. Nur soweit ich mich noch erinnern kann musst du beim TreeNode die Elemente per Hand vertauschen um ein Sortieren zu ermöglichen.
z.B.
Remove(node1)
Remove(node2)
Insert(0, node2)
Insert(1, node1)

Also doch wieder alles selber machen...


.
private Nachricht | Beiträge des Benutzers
Pedro_15
myCSharp.de - Member



Dabei seit:
Beiträge: 375
Herkunft: In der Nähe von Berlin

Themenstarter:

beantworten | zitieren | melden

Danke für die Hilfe,

ich habe das Problem ein wenig verschoben und sortiere schon vor dem Insert in den Tree. Ist einfacher, muss ich nicht immer löschen und anlegen.

Pedro

PS: Zum Sortieren noch Link...
http://www.microsoft.com/germany/msdn/library/net/vbnet/TreeViewKnotenSortieren.mspx
private Nachricht | Beiträge des Benutzers
qwert_a
myCSharp.de - Member

Avatar #avatar-1911.gif


Dabei seit:
Beiträge: 57

beantworten | zitieren | melden

Zitat
Original von Pedro_15
Na auf 2.0 umsteigen ist leider nicht möglich.
TreeView.Sort gibt es schon in 1.1

Aber vielleicht kann ja jemand weiter helfen.

So geht es auch nicht sortieren tut er nicht, sondern er verdoppelt nur den Hauptknoten mit allen Unterknoten.

Ich hab fast dasselber Problem. Die Knoten werden soriert. nur auf dem TreeView sieht man noch die alte unsortierte Nodes. z.B:

So ist der zu sortierender TreeView:
-Counters
|_AAA
|_BBB
|_CCC

So muss es nach Sortierung aussehen
-Counters
|_CCC
|_BBB
|_AAA

So sieht es aber bei mir aus.
-Counters
|_CCC
|_BBB
|_AAA
|_AAA
|_BBB
|_CCC

Man kann glauben nach der Sortierung gibt es in TreeView 6 Objekten von Typ TreeNode. Es ist aber nicht der Fall. Gibts nur 3. Oberster Knot CCC zeigt auf derselber Objekt wie unterer CCC.

Ich kann immer noch nicht verstehen wieso. Das Beispiel habe ich in Visual C# buch von Addison-Wesley entdekt. Es ist schwer zu glauben, dass da ein Fehler auftreten könnte. Doch es läuft nicht
private Nachricht | Beiträge des Benutzers
qwert_a
myCSharp.de - Member

Avatar #avatar-1911.gif


Dabei seit:
Beiträge: 57

beantworten | zitieren | melden

hab jetzt eine händische Lösung. Die sortiert die Knoten innerhalb des ausgewälten Knotes rückwärts.


		private void button3_Click(object sender, System.EventArgs e)
		{
			TreeNode sortRootNode = treeView2.SelectedNode;

			int nodeCount = sortRootNode.Nodes.Count;
			
			for (int j = 0; j < nodeCount-1; j++)
			for (int i= 0; i< nodeCount-j-1; i++)
			{
				if(String.Compare(sortRootNode.Nodes[i].Text, sortRootNode.Nodes[i+1].Text)<0)
				{
					TreeNode tmpnode = sortRootNode.Nodes[i];
					int index1 = sortRootNode.Nodes[i].Index;
					TreeNode tmpnode2 = sortRootNode.Nodes[i+1];
					sortRootNode.Nodes.Remove(sortRootNode.Nodes[i]);

					
					sortRootNode.Nodes.Remove(sortRootNode.Nodes[i]);
                    sortRootNode.Nodes.Insert(index1,tmpnode2);
					sortRootNode.Nodes.Insert(index1+1,tmpnode);
				}

			}
		}

private Nachricht | Beiträge des Benutzers
Zup
myCSharp.de - Member



Dabei seit:
Beiträge: 124
Herkunft: NRW

beantworten | zitieren | melden

Ich möchte dieses Thema nochmal aufgreifen, da ich mich derzeit ebenfalls mit einer eigenen Nodesortierung herumschlage.

Laut SDK-Doku soll folgender Code im 2.0er Framework funktionieren:


this.mytreeview.TreeViewNodeSorter = new NodeSorter();

    public class NodeSorter : IComparer
    {
        // Compare the length of the strings, or the strings
        // themselves, if they are the same length.
        public int Compare(object x, object y)
        {
            TreeNode tx = x as TreeNode;
            TreeNode ty = y as TreeNode;

            // Compare the length of the strings, returning the difference.
            if (tx.Text.Length != ty.Text.Length)
                return tx.Text.Length - ty.Text.Length;

            // If they are the same length, call Compare.
            return string.Compare(ty.Text, tx.Text);
        }
    }

Wenn ich das allerdings so kompilieren will, bekomme ich folgende Fehlermeldung:

Die Verwendung von Typ "System.Collections.Generic.IComparer<T>" (generisch) macht das 1-Typargument erforderlich.

Da ich bisher noch nicht intensiv mit Interfaces gearbeitet habe, sagt mir diese Fehlermeldung nicht sonderlich viel. Kann mir jemand einen Tipp geben, wo da der Fehler in der Doku ist ?


Gruss und Danke
Zup
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Zup,

in der Doku gar nicht, sondern vermutlich hast du ein using System.Collections.Generic verwendet. Für den Code darfst du aber nur System.Collections verwenden.

herbivore
private Nachricht | Beiträge des Benutzers
Zup
myCSharp.de - Member



Dabei seit:
Beiträge: 124
Herkunft: NRW

beantworten | zitieren | melden

Vielen Dank
private Nachricht | Beiträge des Benutzers