Announcement

Collapse
No announcement yet.

Mehrer Nodes aus TreeView löschen

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

  • Mehrer Nodes aus TreeView löschen

    Hallo zusammen,

    ich habe mal wieder ein Problem:

    Ich habe ein TreeView, in das ich ein XML-Dokument einlese.
    Das XML-Dokument sieht in etwa so aus:
    Code:
    <Stamm>
      <Ast>
        <Zweig1>Text</Zweig1>
        <Zweig2>Text</Zweig2>
      </Ast>
      <Ast>
        <Zweig1>Text</Zweig1>
        <Zweig2>Text</Zweig2>
      </Ast>
    </Stamm>
    Nun habe ich 2 Löschen-Button.
    Mit dem ersten, lösche ich den markierten Node.(z.B.: Zweig1 des 1. Astes)
    Das mache ich so:
    Code:
    treeView1.Nodes.Remove(treeView1.SelectedNode);
    Mit dem 2. Button möchte ich das komplette XML-Dokument prüfen und jeden
    Node, der Zweig1 heißt löschen, sodass mein XML-Dokument nach dem
    löschen so aussieht:
    Code:
    <Stamm>
      <Ast>
        <Zweig2>Text</Zweig2>
      </Ast>
      <Ast>
        <Zweig2>Text</Zweig2>
      </Ast>
    </Stamm>
    Ich hoffe mir kann jemand helfen!
    Vielen Dank schon mal!

  • #2
    wo genau ist denn das Problem? Das XML?

    Comment


    • #3
      Mein Problem liegt darin:

      Ich markiere den Node mit Namen Zweig1. Nun möchte ich, wenn ich auf den
      2. Button klick, das alle Nodes mit dem Namen Zweig1 gelöscht werden.

      Ich hoffe, dass es soweit verständlich ist.

      Comment


      • #4
        Ich verstehe es immer noch nicht so ganz =)

        Ich gehe einfach davon aus, dass jedes Element in der XML Datei durch einen TreeNode dargestellt wird.

        Also hättest du praktisch:

        Code:
        Stamm
        +- Ast1
           +- Zweig1
           +- Zweig2
        +- Ast2
           +- Zweig1
           +- Zweig2
        Und Du löschst jetzt den Zweig1. Dieser soll nun in beiden Ästen weggelöscht werden.

        Ich würde den Zweig dann gar nicht erst selbst im TreeView löschen, sondern den Zweig einfach nur aus der XML Datei löschen und dann den Baum neu erzeugen.

        Ich hab nur leider ziemlich wenig Ahnung von XML. Beim TreeView hätte ich Dir bestimmt weiterhelfen können.

        Comment


        • #5
          Hallo

          Ich würde den Zweig dann gar nicht erst selbst im TreeView löschen, sondern den Zweig einfach nur aus der XML Datei löschen und dann den Baum neu erzeugen.
          Ich hab das ganze jetzt mal so probiert:

          Code:
          string resultAnfang = treeXML.SelectedNode.Text;
          string resultEnde = treeXML.SelectedNode.Text;
          string resultText = treeXML.SelectedNode.Text; ;
                      
          string file = lAktuellgeladeneDatei.Text;
          XmlTextReader r = new XmlTextReader(file);
          
          while (r.Read())
          {
              //Anfangs-Tag
              if (r.NodeType == XmlNodeType.Element)
              {
                  if(r.Name.Trim().IndexOf(resultAnfang) != -1)
                  {
                         treeXML.Nodes.Remove(treeXML.SelectedNode);
                   }
              }
               //Inhalt
              if (r.NodeType == XmlNodeType.Text)
              {
                   if (treeXML.SelectedNode.Text == resultText)
                   {
                       treeXML.SelectedNode.Text.Remove(0);
                   }
              }
               //End-Tag
               if (r.NodeType == XmlNodeType.EndElement)
              {
                   if (r.Name.Trim().IndexOf(resultEnde) != -1)
                  {
                       treeXML.Nodes.Remove(treeXML.SelectedNode);
                  }
              }
          }
          r.Close();
          Ich lese die Datei ein und suche nach dem markierten Node, welches ich löschen möchte. Das lösche ich, dann suche ich weiter in der Datei und wenn ein Node mit dem selben Namen noch existiert dann soll er es auch löschen.
          Aber irgendwie funktioniert das nicht so richtig.

          Kann mir vll. jemand helfen - wo mein Fehler liegt?
          Danke schonmal!

          Comment


          • #6
            Also wenn Du wirklich nur die Nodes aus dem Baum löschen willst verstehe ich nicht was Du da oben mit der XML Datei machst?
            Ich gehe davon aus, dass Du aus der XML Datei den Baum generierst.

            Also so kannst Du alle Nodes mit einem bestimmten Titel in deinem TreeView löschen:

            Code:
            TreeNode[] nodes = treeView1.Nodes.Find("Knoten2", true);
            
            foreach (TreeNode node in nodes)
              treeView1.Nodes.Remove(node);
            Bedingung hierfür ist aber, dass die Property "Name" des TreeNodes auch Knoten2 ist.

            Das heisst wenn Du dem Baum einen neuen Knoten hinzufügst nicht

            Code:
            treeView1.Nodes.Add("Knoten2");
            aufrufen, sondern

            Code:
            treeView1.Nodes.Add("Knoten2", "Knoten2");
            Dann löscht er Dir alle Knoten die als Key "Knoten2" haben.

            Comment


            • #7
              Hallo fanderlf,

              vielen Dank für die Antwort! Sie hat mir sehr weitergeholfen.
              Nun bleibt nur noch ein letztes:

              Ich lese meine xml-Datei wie folgt ein:
              Code:
              private void FillTreeView(TreeNodeCollection c, XmlNodeList l)
                      {
                          if (l == null)
                              return;
              
                          foreach (XmlNode e in l)
                          {
                              XmlNodeTree n = new XmlNodeTree(e);                
                              //hier müsste normal das auskommentierte stehn,
                               //damit dein Code alle Nodes mit gleichem Namen löscht.
                              //string nNeu = n.Text;                
                              //c.Add(nNeu, nNeu);                
                              c.Add(n);
                              FillTreeView(n.Nodes, e.ChildNodes);
                          }
                      }
              
              public class XmlNodeTree : TreeNode
                      {
                          private XmlNode mNode;
                          public XmlNode Node
                          {
                              get { return mNode; }
                          }
                          public XmlNodeTree(XmlNode node)
                          {
                              mNode = node;
                              if (node.NodeType == XmlNodeType.Text)
                                  Text = node.InnerText;
                              else
                                  Text = node.Name;
                              //Attribute anzeigen
                              //if (node.Attributes != null)
                              //{
                              //    foreach (XmlAttribute a in node.Attributes)
                              //    {
                              //        Text += " " + a.OuterXml;
                              //    }
                              //}
                          }
                      }
              Sobald ich aber den auskommentierten Teil (Fett) benutze, zeigt er mir im TreeView nur 2 Knoten an.
              So zeigt er es an:
              Code:
              Stamm
              - Ast1
              - Ast2
              Und so sollte es eigentlich sein:
              Code:
              Stamm
              +- Ast1
                 +- Zweig1
                 +- Zweig2
              +- Ast2
                 +- Zweig1
                 +- Zweig2
              Irgendeine Idee, wie ich das Problem lösen könnte?

              Comment


              • #8
                Versuch mal in Deinem Konstruktor von XmlTreeNode folgende Zeile am Ende hinzuzufügen:

                Code:
                public XmlNodeTree(XmlNode node)
                {
                  mNode = node;
                  if (node.NodeType == XmlNodeType.Text)
                    Text = node.InnerText;
                  else
                    Text = node.Name;
                
                  this.Name = this.Text
                }
                Dann sollte auch das mit dem Löschen funktionieren

                Comment


                • #9
                  SUPER!!!
                  Es funktioniert!!

                  Vielen Vielen Dank!!

                  Comment


                  • #10
                    gern geschehen

                    Comment

                    Working...
                    X