Laden...

Treeview Sortierung nach Tag - Object Member

Erstellt von Pedro_15 vor 18 Jahren Letzter Beitrag vor 17 Jahren 4.402 Views
P
Pedro_15 Themenstarter:in
375 Beiträge seit 2005
vor 18 Jahren
Treeview Sortierung nach Tag - Object Member

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

A
452 Beiträge seit 2005
vor 18 Jahren

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.

😁 😮 ?( 8) 😭 8o :] 🙁 =) X( 🙂 😜 😉 :rolleyes: 👶 :evil: 👅
Smilies find ich doof =]

49.485 Beiträge seit 2005
vor 18 Jahren

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

P
Pedro_15 Themenstarter:in
375 Beiträge seit 2005
vor 18 Jahren

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


49.485 Beiträge seit 2005
vor 18 Jahren

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

P
Pedro_15 Themenstarter:in
375 Beiträge seit 2005
vor 18 Jahren

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


49.485 Beiträge seit 2005
vor 18 Jahren

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

P
Pedro_15 Themenstarter:in
375 Beiträge seit 2005
vor 18 Jahren

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.

A
154 Beiträge seit 2005
vor 18 Jahren

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...

.

P
Pedro_15 Themenstarter:in
375 Beiträge seit 2005
vor 18 Jahren

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

57 Beiträge seit 2005
vor 18 Jahren

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 🙁

57 Beiträge seit 2005
vor 18 Jahren

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

			}
		}


Z
124 Beiträge seit 2005
vor 17 Jahren

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

49.485 Beiträge seit 2005
vor 17 Jahren

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

Z
124 Beiträge seit 2005
vor 17 Jahren

Vielen Dank 🙂