Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   C# Objekt in Treeviewknoten speichern (https://www.delphipraxis.net/113529-objekt-treeviewknoten-speichern.html)

Luckie 9. Mai 2008 09:48


Objekt in Treeviewknoten speichern
 
Ich habe einen Treeview und würde da gerne zusätzlich in den Knoten noch ein Objekt ablegen. Allerdings kann ich keine Methode wie zum Beispiel AddObject finden in der Hilfe.

Und wo wir schon dabei sin, wüsste ich auch gerne, wie ich an das Objekt wieder dran komme.

Motzi 9. Mai 2008 10:03

Re: Objekt in Treeviewknoten speichern
 
Die Klasse TreeNode kennt die Eigenschaft Tag welche vom Typ "Object" ist, da passt also alles rein. Du kannst deine TreeNode-Instanz entweder vorher erzeugen und diese dann per Add zum TreeView hinzufügen, oder aber du verwendest eine der anderen Add-Methoden die diverse String und Int32 Parameter nehmen. Alle diese Add-Methoden geben die erzeugte TreeNode-Instanz zurück, sodass du bei dieser dann die Tag-Eigenschaft setzen kannst.

LG, Manuel

Kalfany 9. Mai 2008 10:22

Re: Objekt in Treeviewknoten speichern
 
ah son mist hab übersehn das es C# sein soll :(

Luckie 9. Mai 2008 10:29

Re: Objekt in Treeviewknoten speichern
 
Zitat:

Zitat von Motzi
Die Klasse TreeNode kennt die Eigenschaft Tag welche vom Typ "Object" ist,

Oh, das habe ich nicht gesehen. Danke.

Sieht jetzt so aus:
Code:
 for (int i = 0; i < catalog.Categories.Count; i++)
                {
                    treeCatalog.Nodes.Add("2", catalog.Categories[i].Name, 0, 0);
                    for (int j = 0; j < catalog.Categories[i].ProductList.Count; j++)
                    {
                        TreeNode prodNode = new TreeNode();
                        prodNode.Text = catalog.Categories[i].ProductList[j].Name;
                        prodNode.Tag = catalog.Categories[i].ProductList[j];
                        treeCatalog.Nodes[i].Nodes.Add(prodNode);                      
                    }
                }
Ich habe jetzt noch das Problem, wie ich da wieder drankomme:
Code:
string s;
s = (ProductItem)treeCatalog.SelectedNode.Tag
Der Cast scheint nicht zu funktionieren.

OregonGhost 9. Mai 2008 10:52

Re: Objekt in Treeviewknoten speichern
 
Was heißt denn, er scheint nicht zu funktionieren? Wenn der C-style Cast nicht geht, wirft er eine Exception. Ich für meinen Teil neige dazu, wenn ich schonmal was in einer Tag-Eigenschaft speichere, diese dann mit is oder as (je nach Verwendung) zu testen bzw. zu casten. Hatte eigentlich bisher keine Probleme. Der Debugger verrät dir aber sonst auch sehr gerne, welchen Typ das Objekt in der Tag-Eigenschaft hat.

Luckie 9. Mai 2008 11:04

Re: Objekt in Treeviewknoten speichern
 
Zitat:

Zitat von Luckie
Ich habe jetzt noch das Problem, wie ich da wieder drankomme:
Code:
string s;
s = (ProductItem)treeCatalog.SelectedNode.Tag
Der Cast scheint nicht zu funktionieren.

Damit meinte ich, dass die IDE mir, wenn ich den Punkt setze, nicht die Objekteigenschaften anzeigt.

Ich werde es mal mit dem as Operator probieren.

So geht's:
Code:
private void treeCatalog_AfterSelect(object sender, TreeViewEventArgs e)
        {           
            if (treeCatalog.SelectedNode.Tag != null)
            {
                ProductItem prodItem;
                prodItem = (treeCatalog.SelectedNode.Tag as ProductItem);
                textProdInfo.Text = prodItem.Name + Environment.NewLine;
                textProdInfo.Text += prodItem.ShortDescription + Environment.NewLine;
                textProdInfo.Text += prodItem.LongDescription + Environment.NewLine;
                textProdInfo.Text += prodItem.ItemIdentifier + Environment.NewLine;
            }
        }

OregonGhost 9. Mai 2008 12:03

Re: Objekt in Treeviewknoten speichern
 
Kleiner ergänzender Tipp aus meiner Gewohnheit: Statt
Code:
            if (treeCatalog.SelectedNode.Tag != null)
            {
                ProductItem prodItem;
                prodItem = (treeCatalog.SelectedNode.Tag as ProductItem);
kannst du auch eine der folgenden Möglichkeiten wählen:
Code:
if (treeCatalog.SelectedNode.Tag is ProductItem) {
    ProductItem prodItem = treeCatalog.SelectedNode.Tag as ProductItem;
    ...
}
oder
Code:
ProductItem prodItem = treeCatalog.SelectedNode.Tag as ProductItem;
if (prodItem != null) {
    ...
}
Ist in meinen Augen übersichtlicher, weil schneller ersichtlich wird, was man vorhat. Wenn du C# 3.0 verwenden kannst macht var das natürlich noch kürzer, der Compiler kann aus dem as-Cast den Typ ermitteln. Geht übrigens auch, wenn man .NET-Framework 2.0 als Target hat.

Luckie 9. Mai 2008 12:05

Re: Objekt in Treeviewknoten speichern
 
Danke für den Tipp. Komme eben eher so aus der Delphi Welt. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz