【问题标题】:Why WriteXml create a new xml file为什么WriteXml创建一个新的xml文件
【发布时间】:2017-11-17 08:38:18
【问题描述】:

我尝试使用ReadXmlWriteXmldatagrid 中加载/保存一个xml 文件,但是WriteXml 方法只是创建一个新的空文件而不是保存对旧文件的更改。详情:[链接][1]

----------------------更新------------ ----------------------------------------

    private void RefreshModule()
    {
        ModulesView = new ListCollectionView(sdb.GetModules())
        {
            Filter = obj =>
            {
                var Module = (Module)obj;
                return SelectedProduct != null && SelectedProduct.ModelNumber == Module.ModelNumber;
            }
        };
    }

    private Product selectedProduct;
    public Product SelectedProduct
    {

        get { return selectedProduct; }
        set
        {
            if (selectedProduct != value)
            {
                selectedProduct = value;
                NotifyPropertyChanged();
                RefreshModule();
             }
         }
     }

【问题讨论】:

  • 不要重复同一个问题。在您最初的问题中,我没有看到使用 WriteXml 的尝试,您可能没有正确使用它。
  • 对不起,我真的需要解决这个问题。我尝试在StoreDbDataSet sdb = new StoreDbDataSet(); sdb.WriteXml("store.xml");Button_Click 事件中创建一个新的空store.xml 文件。
  • 如何设置 ModulesView 属性?
  • @mm8 感谢您的回复,我更新了ModulesView的用法

标签: xml wpf datagrid


【解决方案1】:

StoreDbDataSet 类的SaveDataSet 方法应采用DataSet 参数并将其序列化到文件中。

public void SaveDataSet(DatatSet ds)
{
    ds.WriteXmlSchema(DatabaseConstructorName);
    ds.WriteXml(DatabaseFileName);
    ds.AcceptChanges();
}

但是,如果您将DataGridItemsSource 属性设置为ObservableCollection,您应该如何序列化DataSet

从您的GetModules 方法返回DataSet

public DataSet GetModules()
{
    return StoreDbDataSet.ReadDataSet();
}

并绑定到DataTableDataView。像这样的:

private DataSet _ds;
private void RefreshModule()
{
    _ds = sdb.GetModules();
    ModulesView = new ListCollectionView(ds.Tables["Modules"].DefaultView)
    {
        Filter = obj =>
        {
            var Module = obj as DataRowView;
            return SelectedProduct != null && SelectedProduct.ModelNumber == Module["ModelNumber"].ToString(); //ModuleNumber is the column name in the DataTable
        }
    };
}

private void Writecfg_Button_Click(object sender, RoutedEventArgs e)
{
    StoreDbDataSet sdb = new StoreDbDataSet();
    sdb.SaveDataSet(_ds);
}

【讨论】:

  • 抱歉回复晚了。在我尝试了您的代码后,DataTable Modules 不会填充任何内容,并且您的代码中会出现警告 Possible unintended reference comparison
  • Product 类的 ModelNumber 属性是 int 还是 string?
  • string 类型。
  • 感谢您的修改,在尝试了您的最新代码后,sdb.SaveDataSet() 确实调用了,但没有保存对 xml 文件的更改。顺便说一句,RefreshModuleWritecfg_Button_Click 方法中的 ds 应该是 _ds 吗?
  • 是的。所以在 SaveDataSet 方法中下一个断点,看看 DataSet 和表在保存时的样子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-13
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
  • 1970-01-01
  • 2019-05-28
相关资源
最近更新 更多