question

LooBi avatar image
0 Votes"
LooBi asked JeanineZhang-MSFT edited

How to edit treeview xml file and save in Winforms?

I'm trying to make a XML Editor.
My Code wroks. I choose a file and it is shown to Application.
How to edit a node by double-clicking it and save it by pressing Crtl+S?
Thank you for your help!

     private void button1_Click(object sender, EventArgs e)
     {
         OpenFileDialog dlg = new OpenFileDialog();
         dlg.Title = "Open XML Document";
         dlg.Filter = "XML Files (*.xml)|*.xml";

         if (dlg.ShowDialog() == DialogResult.OK)
         {
             try
             {
                 this.Cursor = Cursors.WaitCursor;

                 XmlDocument xDoc = new XmlDocument();
                 xDoc.Load(dlg.FileName);
                 tvLabel.Nodes.Clear();
                 tvLabel.Nodes.Add(new TreeNode(xDoc.DocumentElement.Name));
                 TreeNode tNode = new TreeNode();
                 tNode = (TreeNode)tvLabel.Nodes[0];

                 addTreeNode(xDoc.DocumentElement, tNode);

                 tvLabel.ExpandAll();
             }
             catch (Exception ex)
             {
                 MessageBox.Show(ex.Message);
             }
             finally
             {
                 this.Cursor = Cursors.Default;
             }
         }
     }

     private void addTreeNode(XmlNode xmlNode, TreeNode treeNode)
     {
         XmlNode xNode;
         TreeNode tNode;
         XmlNodeList xNodeList;

         if (xmlNode.HasChildNodes)
         {
             xNodeList = xmlNode.ChildNodes;

             for (int x = 0; x <= xNodeList.Count - 1; x++)
             {
                 xNode = xmlNode.ChildNodes[x];
                 treeNode.Nodes.Add(new TreeNode(xNode.Name));
                 tNode = treeNode.Nodes[x];
                 addTreeNode(xNode, tNode);
             }
         }
         else
             treeNode.Text = xmlNode.OuterXml.Trim();
     }

192201-image.png


dotnet-csharpwindows-forms
image.png (1.7 KiB)
5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

1 Answer

JackJJun-MSFT avatar image
1 Vote"
JackJJun-MSFT answered JeanineZhang-MSFT edited

@LooBi,Welcome to Microsoft Q&A, you could override ProcessCmdKey method and use NodeMouseDoubleClick event to get what you wanted.
Here is a code example you could refer to.

Code:


  public string FileName { get; set; }    
             private void button1_Click(object sender, EventArgs e)
             {
                 OpenFileDialog dlg = new OpenFileDialog();
                 dlg.Title = "Open XML Document";
                 dlg.Filter = "XML Files (*.xml)|*.xml";
                 if (dlg.ShowDialog() == DialogResult.OK)
                 {
                     try
                     { 
                         FileName = dlg.FileName;
                         this.Cursor = Cursors.WaitCursor;
                         XmlDocument xDoc = new XmlDocument();
                         xDoc.Load(dlg.FileName);
                         tvLabel.Nodes.Clear();
                         tvLabel.Nodes.Add(new TreeNode(xDoc.DocumentElement.Name));
                         TreeNode tNode = new TreeNode();
                         tNode = (TreeNode)tvLabel.Nodes[0];
                         addTreeNode(xDoc.DocumentElement, tNode);
                         tvLabel.ExpandAll();
                     }
                     catch (Exception ex)
                     {
                         MessageBox.Show(ex.Message);
                     }
                     finally
                     {
                         this.Cursor = Cursors.Default;
                     }
                 }
             }
        
             private void addTreeNode(XmlNode xmlNode, TreeNode treeNode)
             {
                 XmlNode xNode;
                 TreeNode tNode;
                 XmlNodeList xNodeList;
                 if (xmlNode.HasChildNodes)
                 {
                     xNodeList = xmlNode.ChildNodes;
                     for (int x = 0; x <= xNodeList.Count - 1; x++)
                     {
                         xNode = xmlNode.ChildNodes[x];
                         treeNode.Nodes.Add(new TreeNode(xNode.Name));
                         tNode = treeNode.Nodes[x];
                         addTreeNode(xNode, tNode);
                     }
                 }
                 else
                     treeNode.Text = xmlNode.OuterXml.Trim();
             }
        
             private void tvLabel_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
             {
                 tvLabel.LabelEdit = true;
                 tvLabel.SelectedNode.BeginEdit();
           
                
             }
        
             protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
             {
                 if (keyData == (Keys.Control | Keys.S))
                 {
                     exportToXml(tvLabel, FileName);
                     return true;
                 }
                 return base.ProcessCmdKey(ref msg, keyData);    
             }
             StreamWriter sr = null;
             public void exportToXml(TreeView tv, string filename)
             {
                 sr = new StreamWriter(filename, false, System.Text.Encoding.UTF8);
                 sr.WriteLine("<" + tv.Nodes[0].Text + ">");
                 foreach (TreeNode node in tv.Nodes)
                 {
                     saveNode(node.Nodes);
                 }
                 //Close the root node
                 sr.WriteLine("</" + tv.Nodes[0].Text + ">");
                 sr.Close();
             }
             private void saveNode(TreeNodeCollection tnc)
             {
                 foreach (TreeNode node in tnc)
                 {
        
                     if (node.Nodes.Count > 0)
                     {
                         sr.Write("<" + node.Text + ">");
                         saveNode(node.Nodes);
                         sr.WriteLine("</" + node.Text + ">");
                     }
                     else
                         sr.Write(node.Text);
                 }
             }

Best Regards,
Jack


If the answer is the right solution, please click "Accept Answer" and upvote it.If you have extra questions about this answer, please click "Comment".

Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.






5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.