0

からのデータの保存に問題がありますTreeViewTreeViewからにデータを保存する方法について多くのトピックをグーグル検索しましたがXML、それを作成する方法をいくつか見ました。しかし、それらはすべて を使用してWindowsForms applicationおり、誰も -を使用していませんWPFでした。これらの例を に変換しようとしましWPFたが、どれも正しく動作しません。それを作る方法はありますか?私が移植しようとした方法の1つ:

    void SaveToXml(TreeView tw)
    {
        XmlDocument d = new XmlDocument();
        XmlNode n = d.CreateNode(XmlNodeType.Element, "root", "");
        foreach (TreeViewItem t in tw.Items)
        {
            n.AppendChild(getXmlNode(t, d));
        }
        d.AppendChild(n);
        d.Save(AppDomain.CurrentDomain.BaseDirectory + "out.xml");
    }
    private XmlNode getXmlNode(TreeViewItem tnode, XmlDocument d)
    {
        XmlNode n = d.CreateNode(XmlNodeType.Element, tnode.Name, " ");

        foreach (TreeViewItem t in tnode.Items)
        {
            n.AppendChild(getXmlNode(t, d));
        }
        return n;
    }

ArgumentException「ローカル要素と属性の名前を空にすることはできません」とスローされます。D:\コードを使用して、ドライブ上のファイルに関する情報を保存しようとしています:

  private void ListDirectory(TreeView treeView, string path)
    {
        var rootDirectoryInfo = new DirectoryInfo(path);
        treeView.Items.Add(CreateDirectoryNode(rootDirectoryInfo));
    }

    private static TreeViewItem CreateDirectoryNode(DirectoryInfo directoryInfo)
    {
        var directoryNode = new TreeViewItem();
        directoryNode.Header = directoryInfo.Name;
        try
        {
            foreach (var directory in directoryInfo.GetDirectories())
                directoryNode.Items.Add(CreateDirectoryNode(directory));
            foreach (var file in directoryInfo.GetFiles())
                directoryNode.Items.Add(new TreeViewItem { Header = file.Name });
        }
        catch (UnauthorizedAccessException e)
        { }
        return directoryNode;
    }

正常に動作し、TreeViewすべてのフォルダーとファイルが表示されます。TreeViewからまでのデータを保存する方法を教えてくださいXML。ありがとう。

これを試しました:

  public void exportToXml(TreeView tv, string filename)
    {
        sr = new StreamWriter(filename, false, System.Text.Encoding.UTF8);
        //Write the header
        sr.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\" ?>");
        //Write our root node
        sr.WriteLine("<ROOT>");
        foreach (TreeViewItem node in tv.Items)
        {
            saveNode(node.Items);
        }
        //Close the root node
        sr.WriteLine("</ROOT>");
        sr.Close();
    }

    private void saveNode(TreeViewItem[] tnc)
    {
        foreach (TreeViewItem node in tnc)
        {
            //If we have child nodes, we'll write 
            //a parent node, then iterrate through
            //the children
            if (node.Items.Count > 0)
            {
                sr.WriteLine("<" + node.Name + ">");
                saveNode(node.Items);
                sr.WriteLine("</" + node.Name + ">");
            }
            else //No child nodes, so we just write the text
                sr.WriteLine(node.Name);
        }
    }

でもsaveNode(node.Items);と で型が違うとnode.ItemsのことなTreeViewItem[]ので を試してみList<TreeViewItem>ましたが、エラーは同じです。

4

1 に答える 1

0

これは本当の答えではないと思いますが、次の行を置き換えてみてください:

saveNode(node.Items); 

これで:

saveNode(node.Items.OfType<TreeViewItem>().ToArray()); 

これが役立つことを願って、


xml doc からインデントされた文字列を取得する例:

public static String ToString(XmlDocument doc)
{
    StringBuilder sb = new StringBuilder();
    XmlTextWriter mywriter = new XmlTextWriter(new StringWriter(sb));
    mywriter.Formatting = Formatting.Indented;
    doc.WriteTo( mywriter );
    mywriter.Flush();
    return(sb.ToString());
}
于 2013-01-29T08:49:26.067 に答える