簡體   English   中英

C#xmldataprovider插入節點

[英]C# xmldataprovider insert node

我正在嘗試為xml配置文件編寫編輯器。 我將xml文件綁定到列表視圖並選擇一個元素,然后單擊“編輯”使您可以編輯元素。 當用戶單擊“保存”時,將調用一個委托,該委托將更新xml文檔中的元素。 我試圖以各種方式進行更新,包括appendnode,prependnode,insertafter和replace child。 我已經使它們全部正常工作,沒有任何編譯時或運行時錯誤,但是它們不會更新xmldataprovider或listview。 我可能想念的只是簡單的事情,但是我很難弄清楚它是什么。 有人可以幫忙嗎?

謝謝,布萊恩

如果有幫助,這是我的主要表單的源代碼(帶有listview的源代碼)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Xml;
using System.IO;

namespace g2config
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>

    public partial class MainWindow : Window
    {
        public XmlDataProvider dp;
        string cfgfile;
        public managecmpnts manage_components;
        public delegate void managecmpnts(int id, XmlElement component);


        public MainWindow()
        {
            InitializeComponent();
            dp = this.FindResource("configfile") as XmlDataProvider;

            cfgfile = "C:\\Users\\briansvgs\\Desktop\\g2config\\g2config\\bin\\Debug\\g2config.pxml";

            if(Environment.GetCommandLineArgs().Count() > 1)
            {
                string path = Environment.GetCommandLineArgs().ElementAt(1);
                //MessageBox.Show("Path: " + path);
                cfgfile = path;
            }

            if (File.Exists(cfgfile))
            {
                dp.Source = new Uri(cfgfile, UriKind.RelativeOrAbsolute);
            }
            else
            {
                MessageBox.Show("config file not found");
            }

            this.Title = this.Title + " (" + cfgfile + ") ";
        }

        public void browsedir( object sender, EventArgs e)
        {
              System.Windows.Forms.OpenFileDialog ofd = new System.Windows.Forms.OpenFileDialog();
            ofd.Filter = "PXML Files (*.pxml)|*.pxml"; ;

            //http://www.kirupa.com/net/using_open_file_dialog_pg4.htm
            if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK) //how to browse dirs instead of files?????
            {
                 startpath.Text = ofd.FileName;
            }
        }

        public void newcomponent(object sender, RoutedEventArgs e)
        {            
            componentsettings new_cmpnt = new componentsettings();
            new_cmpnt.Title = "Add Component";
            new_cmpnt.ShowDialog();         
        }

        public void editcomponent(object sender, RoutedEventArgs e)
        {
            int selected = components.SelectedIndex;
            XmlElement current = (XmlElement)components.Items.CurrentItem;
            componentsettings edit_cmpnt = new componentsettings(current);
            edit_cmpnt.cmpnt_mgr.manage_components += new manager.mngcmpnts(test);
            edit_cmpnt.Title = "Edit Component";
            edit_cmpnt.ShowDialog();
        }

        private void browsedir(object sender, RoutedEventArgs e)
        {
            System.Windows.Forms.FolderBrowserDialog directory;
            directory = new System.Windows.Forms.FolderBrowserDialog();
            directory.Description = "Please select the folder containing your g2 configuration (pxml) files. Default is C:\\Program Files\\Exacom, Inc.";
            directory.ShowDialog();
            startpath.Text = directory.SelectedPath;
        }

        private void save(object sender, RoutedEventArgs e)
         {
             MessageBox.Show(dp.Source.ToString());

            if(File.Exists(cfgfile + ".old"))
            {
                File.Delete(cfgfile + ".old");
            }

             File.Move(cfgfile, cfgfile + ".old");
             dp.Document.Save(cfgfile);
         }

        private void remove(object sender, RoutedEventArgs e)
        {
            XmlNode component = dp.Document.DocumentElement["Components"].ChildNodes[components.SelectedIndex];
            dp.Document.DocumentElement["Components"].RemoveChild(component);
        }

        private void temp(object sender, RoutedEventArgs e)
        {
            MessageBox.Show(dp.Document.DocumentElement["Components"].ChildNodes[components.SelectedIndex].InnerText.ToString()); //will this give me trouble????? Probably not since it's my config, but...
        }
        private void test(int id, XmlElement testelement)
        {

            //dp.Document.DocumentElement["Components"].ChildNodes[id] = testelement;
            //XmlNode testnode = dp.Document.DocumentElement["Components"].ChildNodes[id + 1];
            //XmlNode testnode = testelement;
            MessageBox.Show(testelement.OuterXml.ToString());
            //dp.Document.DocumentElement["Components"].InsertAfter(dp.Document.DocumentElement["Components"].ChildNodes[0], testelement);
            //dp.Document.DocumentElement["Components"].RemoveChild(testelement);
            //dp.Document.DocumentElement["Components"].ReplaceChild(testnode, dp.Document.DocumentElement["Components"].ChildNodes[id]);
            dp.Document.DocumentElement["Components"].PrependChild(testelement);

            //dp.Document.NodeChanged();

            //dp.Document.DocumentElement["Components"].CloneNode(true);
            dp.Document.DocumentElement["Components"].AppendChild(testelement);
            //dp.Document.
            //MessageBox.Show(dp.Document.OuterXml.ToString());
            //MessageBox.Show(dp.Document.DocumentElement["Components"].FirstChild.AppendChild(testelement).OuterXml.ToString());
        }


    }
}

JMSA。 感謝您的建議。 我今天在玩它,並且找到了解決方案。 有點混亂,但是可以。 我復制當前節點之一,然后清除所有值。 如果有人感興趣,這里是代碼。

private void add(object sender, RoutedEventArgs e)
{
    System.Xml.XmlNode test = configfile.Document.DocumentElement["Components"].FirstChild;
    System.Xml.XmlNode testclone = test.Clone();
    for (int i = 0; i < testclone.ChildNodes.Count; i++)
    {
        testclone.ChildNodes[i].RemoveAll();
    }

    configfile.Document.DocumentElement["Components"].AppendChild(testclone);
    components.SelectedItem = components.Items.Count + 1;
}

我的建議是通過使用復合模式為每個元素創建一個類,將XML文檔延遲加載到該類中,然后根據需要執行操作。 然后再次保存。 雖然不少。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM