2017-06-13 95 views
0

我试图读取/保存xml文件到datagrid,我使用数据集来做到这一点。现在,我已经成功将XML文件中的数据加载到数据网格,代码如下:WPF将数据集保存到xml

public class StoreDbDataSet 
{ 
    internal static DataSet ReadDataSet() 
    { 
     DataSet ds = new DataSet(); 
     ds.ReadXmlSchema("store.xsd"); 
     ds.ReadXml("store.xml"); 
     return ds; 
    } 

} 

和:

public class StoreDb 
{ 
    public ObservableCollection<Product> GetProducts() 
    { 
     DataSet ds = StoreDbDataSet.ReadDataSet(); 

     ObservableCollection<Product> products = new ObservableCollection<Product>(); 
     foreach (DataRow productRow in ds.Tables["Products"].Rows) 
     { 
      products.Add(new Product((string)productRow["ModelNumber"], 
       (string)productRow["ModelName"], (string)productRow["InputAddress"], 
       (string)productRow["OutputAddress"], (string)productRow["DiagAddress"], 
       (string)productRow["Description"], (byte)productRow["CategoryID"], 
       (string)productRow["CategoryName"], (string)productRow["ProductImage"])); 
     } 
     return products; 
    } 
} 

XAML文件:

<DataGrid Name="dgBasicInfo" ItemsSource="{Binding ProductsView, Mode=TwoWay}" CanUserResizeColumns="False" AutoGenerateColumns="False" Margin="10,10,10,15" BorderThickness="5" FontSize="14" Background="White"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="SlaveId" Binding="{Binding CategoryID}" /> 
     <DataGridTextColumn Header="ModelName" Binding="{Binding ModelName}"/> 
     <DataGridTextColumn Header="CategoryName" Binding="{Binding CategoryName}" /> 
     <DataGridTextColumn Header="InputAddress" Binding="{Binding InputAddress}" /> 
     <DataGridTextColumn Header="OutputAddress" Binding="{Binding OutputAddress}" /> 
     <DataGridTextColumn Header="DiagAddress" Binding="{Binding DiagAddress}" /> 
     <DataGridTextColumn Header="Specification" Binding="{Binding Description}" /> 
    </DataGrid.Columns> 
</DataGrid> 

视图模型:

public ICollectionView ProductsView 
    { 
     get { return _ProductsView; } 
     set 
     { 
      _ProductsView = value; 
      NotifyPropertyChanged(); 
     } 
    } 

我的问题是当我改变了数据网格数据,我怎样才能保存更改为XML?提前致谢!

--------------------------- update ------------------ -------------

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()); 
      } 
     } 
    } 
+0

如何[中WriteXML ](https://msdn.microsoft.com/en-us/library/system.data.datase t.writexml(V = vs.110)的.aspx)? – CodingYoshi

+0

我这样做了,但它只是创建一个新的空XML文件。 –

+0

你写给xml的哪个组件? 您将您的数据绑定到ProductsView, 请参阅setter方法的更改。如果发生更改,则将其写入XML。 –

回答

0

问题是你正在阅读XML作为数据集,而不是把它读作产品,并将其作为产品的阵列除下文

你的XML格式应该是这样的

<ArrayOfProduct> 
<Product> 
<ModelNumber>abc</ModelNumber> 
//remaking properties 
</Product> 
</ArrayOfProduct> 

创建一个扩展方法类,这帮助你转换XML列出反之亦然

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; 
    } 
} 

变化productsView到的ObservableCollection

private ObservableCollection<Product> _ProductsView; 
public ObservableCollection<Product> ProductsView 
    { 
     get { return _ProductsView; } 
     set 
     { 
      _ProductsView = value; 
      NotifyPropertyChanged(); 
     } 
    } 

现在,经过更改保存XML如下

File.WriteAllText("store.xml",ProductsView.ToList().ToXml()); 
+0

非常感谢您的回复,但是当我尝试通过代码加载xml数据时出现错误。'InvalidOperationException:不是预期的。 ' 我的XML文件的样子: '<?XML版本= “1.0” 独立= “是”> .... ' –

+0

我给你的XML格式尝试保存这样 – Krishna

+0

XML我看不出区别这两个XML文件之间 –