Announcement

Collapse
No announcement yet.

Problem mit TreeView

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem mit TreeView

    Hallo alle zusammen..!

    Ich habe eine Klasse erstellt (cl-treefuellen.cs), die wie folgt aussieht:
    Code:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace Baum-test
    {
        class cl_treefuellen
        {
            public string bezeichnung;
            public int id;
    
            public cl_treefuellen(int nr, string name)
            {
                id = nr;
                bezeichnung = name;
            }
    
            public override string ToString()
            {
                return bezeichnung;
            }
        }
    }
    nun lege ich in meinem Hauptprogramm mithilfe der Klasse Objekte an und speichere diese nun im TreeView. Das klappt bisher ohne Probleme (hier fett hinterlegt):
    Code:
    private void treefuellen()
            {
    
                sql.CommandText =
                    "SELECT * FROM DatenartUeBegr;";
                reader = sql.ExecuteReader();
                
                while (reader.Read())
                    treeView1.Nodes.Add(reader["Datenart-UeBegr"].ToString());
                reader.Close();
                
         
                for (int i = 1; i < treeView1.GetNodeCount(false) + 1; i++)
                {
                    sql.CommandText =
                        "SELECT * FROM Datenart WHERE DatenArtNr = " + i + ";";
                    reader = sql.ExecuteReader();
                    while (reader.Read())
                    {
                        cl_treefuellen t = new cl_treefuellen(
                            Convert.ToInt32(reader["Nr"]),
                            "" + reader["Art"]
                            );
                        n = treeView1.Nodes[i - 1].Nodes.Add(t.ToString());
                    }
                    reader.Close();
                }

    Nun habe ich das Problem, die id der Nodes abzufragen. Ist dies überhaupt möglich? Ich hätte dies wie folgt gelöst:
    Code:
    cl_treefuellen neu = (cl_treefuellen)treeView1.SelectedNode;
    Jedoch tritt stets eine Exeption auf, die wie folgt lautet:

    Eine Konvertierung vom Typ "System.Windows.Forms.TreeNode" in "Baum-test.cl_treefuellen" ist nicht möglich.
    Weiß jemand, wo der Fehler liegt oder ob mein Vorhaben überhaupt möglich ist?
    Vielen Dank für eure Hilfe, b8x!

  • #2
    Hallo,

    die Fehlermeldung sagt doch ausdrücklich, dass es nicht möglich. Der SelectedNode ist ein TreeNode - basta. Du könntest allenfalls deine Klasse cl_treefuellen von TreeNode ableiten; aber ich befürchte, dass es auch damit schwierig wird, zumindest solange, wie du bei Nodes.Add einen String hinzufügst und nicht ausdrücklich eine cl_treefuellen-Instanz.

    Wenn du nur die "Nr" registrieren willst, dann benutze dafür die Tag-Eigenschaft des TreeNode.

    Übrigens ist "fuellen" eine seltsame Bezeichnung für eine Klasse, denn das beschreibt einen Vorgang, aber keinesfalls ein Objekt. Namen wie TreeView1 oder TextBox23 gehören verboten; zu beidem siehe NET Richtlinien für Namen.

    Außerdem sollten variable Inhalte in einen SQL-Befehl nicht per String-Verknüpfung eingebaut werden, sondern unbedingt mit Parametern:
    [highlight=c#]using(SqlCommand cmd = new SqlCommand() ) {
    cmd.CommandText = "SELECT * FROM Datenart WHERE DatenArtNr = @ID;";
    cmd.Parameters.Add("@ID", SqlDbType.Int);
    for (int i = 1; i < treeView1.GetNodeCount(false) + 1; i++) {
    cmd.Parameters["@ID"].Value = i;
    reader = cmd.ExecuteReader();
    while (reader.Read()) {
    TreeNode t = new TreeNode( (string)reader["Art"] );
    t.Tag = (int)reader["Nr"];
    myTreeView.Nodes[i-1].Nodes.Add(t);
    }
    reader.Close();
    }
    }[/highlight]
    Mehr dazu siehe [Artikelserie] Parameter von SQL Befehlen. Außerdem sollen DbConnections immer nur kurzfristig gültig sein, damit gilt das auch für DbCommands. Nach deinen Bezeichnungen befürchte ich, dass du vehement dagegen verstößt, siehe [Artikel] Ressourcen schonen - Datenbanken richtig öffnen und schließen. In deiner Situation ist es zulässig, eine gemeinsame DbConnection innerhalb der treefuellen-Methode für den einleitenden SQL-Select und für die Selects in der Schleife zu nutzen; aber danach muss sie geschlossen und aufgelöst werden.

    Bist du sicher, dass Nodes.Nodes.Add gemeint ist? Das ist denkbar (ich kenne mich mit TreeView nicht näher aus), aber ich möchte zumindest darauf hinweisen.

    Frohe Weihnachten! Jürgen

    Comment


    • #3
      Danke, Du hast mir mit deinem Tipp sehr viel weitergeholfen..!
      Habs jetzt mit dem TAG gemacht und es funktioniert!


      Comment

      Working...
      X