C# WPF将数据集保存到xml
我已经尝试将xml文件读取/保存到datagrid,我正在使用dataset来完成这项工作。现在我已经成功地将xml文件数据加载到datagrid,代码如下:C# WPF将数据集保存到xml,c#,xml,wpf,datagrid,dataset,C#,Xml,Wpf,Datagrid,Dataset,我已经尝试将xml文件读取/保存到datagrid,我正在使用dataset来完成这项工作。现在我已经成功地将xml文件数据加载到datagrid,代码如下: public class StoreDbDataSet { internal static DataSet ReadDataSet() { DataSet ds = new DataSet(); ds.ReadXmlSchema("store.xsd"); ds.ReadXm
public class StoreDbDataSet
{
internal static DataSet ReadDataSet()
{
DataSet ds = new DataSet();
ds.ReadXmlSchema("store.xsd");
ds.ReadXml("store.xml");
return ds;
}
}
以及:
我的问题是,当我更改datagrid数据时,如何将更改保存到xml?提前感谢
---------------------------更新-------------------------------
private void RefreshProductList()
{
ProductsView = new ListCollectionView(sdb.GetProducts())
{
Filter = obj =>
{
var Product = (Product)obj;
return SelectedProduct != null && Product.ModelNumber == SelectedProduct.ModelNumber;
}
};
}
private Product selectedProduct;
public Product SelectedProduct
{
get { return selectedProduct; }
set
{
if (selectedProduct != value)
{
selectedProduct = value;
NotifyPropertyChanged();
RefreshProductList();
RefreshModule();
RefreshCommunication();
List<Product> productlist = ProductsView.ToList();
File.WriteAllText("store.xml", productlist.ToXML());
}
}
}
private void RefreshProductList()
{
ProductsView=新建ListCollectionView(sdb.GetProducts())
{
过滤器=对象=>
{
var产品=(产品)obj;
返回SelectedProduct!=null&&Product.ModelNumber==SelectedProduct.ModelNumber;
}
};
}
私人产品选择产品;
公共产品精选产品
{
获取{返回selectedProduct;}
设置
{
如果(selectedProduct!=值)
{
所选产品=价值;
NotifyPropertyChanged();
RefreshProductList();
刷新模块();
刷新通信();
List productlist=ProductsView.ToList();
writealText(“store.xml”,productlist.ToXML());
}
}
}
问题在于,您将xml作为数据集读取,而不是将其作为产品读取,并将其另存为产品数组,如下所示
您的xml格式应该如下所示
<ArrayOfProduct>
<Product>
<ModelNumber>abc</ModelNumber>
//remaking properties
</Product>
</ArrayOfProduct>
怎么样?我这样做了,但它只是创建了一个新的空xml文件。您将哪个组件写入xml?如果要将数据绑定到ProductsView,请参见setter方法的更改。如果更改了,则将其写入XML。抱歉,我已更新了正确的代码。当我更改datagrid中的数据时,系统似乎没有在ProductView方法中调用NotifyPropertyChanged。非常感谢您的回复,但我在尝试通过您的代码加载XML数据时出错。
InvalidOperationException:不应出现代码>我的xml文件看起来像:代码>我已为您提供了xml格式尝试以这种方式保存您的xml我看不出这两个xml文件之间的区别NewDataSet不能是列表,如果您序列化列表,您将获得根标记作为产品的数组我将其完全更改为您的,仍然得到错误:InvalidOperationException:不应出现代码>
public ICollectionView ProductsView
{
get { return _ProductsView; }
set
{
_ProductsView = value;
NotifyPropertyChanged();
}
}
private void RefreshProductList()
{
ProductsView = new ListCollectionView(sdb.GetProducts())
{
Filter = obj =>
{
var Product = (Product)obj;
return SelectedProduct != null && Product.ModelNumber == SelectedProduct.ModelNumber;
}
};
}
private Product selectedProduct;
public Product SelectedProduct
{
get { return selectedProduct; }
set
{
if (selectedProduct != value)
{
selectedProduct = value;
NotifyPropertyChanged();
RefreshProductList();
RefreshModule();
RefreshCommunication();
List<Product> productlist = ProductsView.ToList();
File.WriteAllText("store.xml", productlist.ToXML());
}
}
}
<ArrayOfProduct>
<Product>
<ModelNumber>abc</ModelNumber>
//remaking properties
</Product>
</ArrayOfProduct>
public static class ExtensionMethods
{
/// <summary>
/// Converts given class to XML using xml serialization
/// </summary>
/// <typeparam name="T">Type of Class</typeparam>
/// <param name="classObject">Class to be serialized</param>
/// <returns>Xml string</returns>
public static string ToXML<T>(this T classObject) where T : class
{
XmlSerializer xmls = new XmlSerializer(typeof(T));
using (MemoryStream ms = new MemoryStream())
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = new UTF8Encoding(false);
settings.Indent = true;
settings.IndentChars = "\t";
settings.NewLineChars = Environment.NewLine;
settings.OmitXmlDeclaration = true;
settings.ConformanceLevel = ConformanceLevel.Document;
using (XmlWriter writer = XmlTextWriter.Create(ms, settings))
{
xmls.Serialize(writer, classObject);
}
string xml = Encoding.UTF8.GetString(ms.ToArray());
return xml;
}
}
/// <summary>
/// Converts given XML string to class of type T
/// </summary>
/// <typeparam name="T">Type to be converted</typeparam>
/// <param name="XmlData">xml string</param>
/// <returns>class of Type T</returns>
public static T ToClass<T>(this string XmlData)
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
T newClass;
using (XmlTextReader reader = new XmlTextReader(new StringReader(XmlData)))
{
//reader.Namespaces = false;
newClass = (T)serializer.Deserialize(reader);
}
return newClass;
}
}
public class StoreDb
{
public ObservableCollection<Product> GetProducts()
{
string StoreData = string.Empty;
using(StreamReader sr = new StreamReader("store.xml"))
{
StoreData = sr.ReadToEnd();
}
ObservableCollection<Product> products = new ObservableCollection<Product>(StoreData.ToClass<List<Product>());
return products;
}
}
private ObservableCollection<Product> _ProductsView;
public ObservableCollection<Product> ProductsView
{
get { return _ProductsView; }
set
{
_ProductsView = value;
NotifyPropertyChanged();
}
}
File.WriteAllText("store.xml",ProductsView.ToList().ToXml());