【问题标题】:How to save a file by using serialize xml如何使用序列化 xml 保存文件
【发布时间】:2016-05-09 10:02:30
【问题描述】:

我正在尝试使用一个按钮从 DataGrid 中保存一个文件,但我不知道如何让它保存该文件,并且用户可以选择保存位置。代码也有问题。

    private void Button_Click_4(object sender, RoutedEventArgs e)
    {
        var path = @"C:\\Users\\Tiago\\Documents\\Teste\\Save.xml";

            if (serializableObject == null) { return; }

            try
            {
                XmlDocument xmlDocument = new XmlDocument();
                XmlSerializer serializer = new XmlSerializer(serializableObject.GetType());
                using (MemoryStream stream = new MemoryStream())
                {
                    serializer.Serialize(stream, serializableObject);
                    stream.Position = 0;
                    xmlDocument.Load(stream);
                    xmlDocument.Save(path);
                    stream.Close();
                }
            }
            catch (Exception ex)
            {

            }


    }

这是我现在得到的。

【问题讨论】:

标签: c# xml wpf file save


【解决方案1】:

如果您想允许用户选择文件的位置和名称,可以使用 SaveFileDialog 选项。

以下是一些可以帮助您完成此任务的链接:
MSDN Link_1
MSDN Link_2
Link_3

【讨论】:

    【解决方案2】:

    using (FileStream fs = new FileStream(path, FileMode.Create) 缺少)

    【讨论】:

    • @Tiago 如果这是错误,请标记这是答案。 :)
    • 错误仍然存​​在 xD 但你解决了其中一个问题@Cologler
    【解决方案3】:

    要选择保存位置,您可以使用System.Windows.Forms.FolderBrowserDialogclass。但这是一个 WinForm 库,所以你需要在你的项目引用中添加System.Windows.Forms

    var dialog = new System.Windows.Forms.FolderBrowserDialog();
    System.Windows.Forms.DialogResult result = dialog.ShowDialog();
    

    【讨论】:

    • 也可以使用SaveFileDialog类来选择直接文件路径。这只会给出一个文件夹路径。确保将文件名附加到文件夹路径字符串的末尾。
    • 需要在代码顶部包含using Microsoft.Win32;
    • 已完成,但现在可序列化对象出现问题
    【解决方案4】:

    首先,您的代码末尾缺少} 花括号。这可能会解决一些问题。

    其次,确保serializableObject 可以通过Button_Click_4 事件访问。将serializableObject 设置为字段或属性以访问它。

    选择保存位置使用FileSaveDialog 让用户选择保存位置。

    创建一个:

    var fileSaveDialog = new FileSaveDialog();
    

    然后显示它:

    fileSaveDialog.ShowDialog();
    

    然后,您可以使用单击“保存”时FileSaveDialog 对象提供的文件名。

    这是一个字符串 - 将您的 path 变量设置为它。

    像这样:

    var path = fileSaveDialog.FileName;
    

    请参阅 http://www.wpf-tutorial.com/dialogs/the-savefiledialog/,了解有关使用 FileSaveDialog 的优秀教程。

    示例:(在您的 Button_Click_4 事件处理程序中使用它)

    var saveFileDialog = new SaveFileDialog(); // Create it
    
    System.Windows.Forms.DialogResult result = saveFileDialog.ShowDialog(); // Show the dialog and set a result (bool) to whether the user clicks "Save" or exits out of the dialog
    
    if (result == DialogResult.OK) // If the user clicked "Save"
    {
        var path = saveFileDialog.FileName; // Set the path to save to
    
        // Use the path variable to save the file to disk using your own code
    }
    

    希望这会有所帮助!

    编辑:
    不要忘记在代码顶部使用using Microsoft.Win32;

    另一个编辑:
    我已更新代码以将 result 分配为 System.Windows.Forms.DialogResult 以比较 result == DialogResult.OK
    见:DialogResult.OK on SaveFileDialog not work

    【讨论】:

    • 我不明白你在说什么/问什么......?
    • 当我保存并关闭程序时,我保存它的文件不存在
    • 这是因为您的FileStream fs 对象正在锁定文件。您不需要将using (FileStream fs = new ...) 语句包裹在try {} catch {} 块周围,因为XmlDocument.Save 方法会将其保存到磁盘。它无法执行此操作,因为您的 fs 当前正在使用该文件。
    • 单步调试您的调试器(在您显示saveFileDialog 的位置放置一个断点)。看看result 是什么,看看savedialog.FileName 是否有正确的值,它是否被分配给你的path 在你保存文件和你的其余代码之前:)
    • 结果为空
    猜你喜欢
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 2013-04-01
    • 1970-01-01
    • 2011-08-11
    • 2017-10-23
    • 2014-04-11
    相关资源
    最近更新 更多