Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在WPF应用程序中将DataGrid导出为XML?_C#_Xml_Wpf_Datagrid_Export - Fatal编程技术网

C# 如何在WPF应用程序中将DataGrid导出为XML?

C# 如何在WPF应用程序中将DataGrid导出为XML?,c#,xml,wpf,datagrid,export,C#,Xml,Wpf,Datagrid,Export,我有一个名为GokartDataGrid的DataGrid。它有一些列和行,我想将表导出到XML文件中,但我发现的方法给了我一个例外。我的代码如下所示,在DataTable实例化处显示System.InvalidCastException private void Xml_export() { DataTable dt = (DataTable)GokartDataGrid.ItemsSource; SaveFileDialog savefile = new SaveFileD

我有一个名为GokartDataGrid的
DataGrid
。它有一些列和行,我想将表导出到XML文件中,但我发现的方法给了我一个例外。我的代码如下所示,在DataTable实例化处显示
System.InvalidCastException

private void Xml_export() 
{
    DataTable dt = (DataTable)GokartDataGrid.ItemsSource;
    SaveFileDialog savefile = new SaveFileDialog();
    savefile.Filter = "XML |*.xml";
    savefile.ShowDialog();
    savefile.CheckFileExists = true;
    savefile.CheckPathExists = true;
    dt.WriteXml(savefile.FileName);         
}
我会在它工作后制作一个try-catch部分,但现在我不知道我能做什么。
我该怎么做才能让它工作? 好的,这是数据网格的上传

    public void DataGridUpload(string filepath)
    {
        if (filepath != null) 
        { 
        Gokart_container minden = new Gokart_container(filepath);
        GokartDataGrid.ItemsSource = minden.GetGokartlist();
        }
    }

Gokart_容器在一个列表中包含Gokart对象,Gokart对象中有一些数据,如最佳圈数和其他列表中的所有圈数。还有一些字符串,比如racer name

datagrid.Columns可以为您提供列标题顺序。以及datagrid.Items.SourceCollection中的行值。你从那里开始

我不确定它是什么,但那个错误是说您没有数据表作为itemssource。
这是双重事实

您的ItemsSource不能是datatable。
如果尝试将datagrid的itemssource设置为1,则会出现以下错误:

无法将类型“System.Data.DataTable”隐式转换为“System.Collections.IEnumerable”。存在显式转换(是否缺少强制转换?)

所以我不知道GetGokartlist()返回什么,但它不是一个数据表。 您可能正在使用datatable的defaultview。因为这是可行的:

dg.ItemsSource = dt.DefaultView;
如果我然后执行gettype来检查这是什么:

Type isType = dg.ItemsSource.GetType();
它是一个数据视图,而不是一个数据表

也许您可以转换到dataview并使用它。但无论如何,这可能不是你所拥有的

但是你说Gokart是列表中的对象。
听起来像是一个列表。
所以你可以投名单

但是,当您首先向datagrid提供数据时,将从前端获取的一些数据进行转换是一种不同寻常的工作方式

使用MVVM处理wpf更为常见。
像这样:

使用MVVM,您将拥有一个viewmodel,其中保留对GoKart集合的引用。这通常是一个可观察的集合,而不是列表。当您添加或删除有用的项时,observablecollection会引发更改的集合,如果您绑定到列表,datagrid会丢失一些功能

无论如何,这样您就可以引用数据集合并直接使用它。
列表中的xml怎么样?
通常,要序列化的不仅仅是一个属性,还有一大堆属性。
您可以创建一个具有一个属性的类,一个列表,并使用Linq和.ToList()从observablecollection中填充该属性。
然后,您只需序列化该类,就可以将所有数据都转换为xml。
只需将类公开,属性公开,并使用datacontractserialiser

下面是一段示例代码,它序列化到磁盘并反序列化回磁盘:

    public static void SaveScenario(string fileURL, Scenario scenario)
    {
        scenario.ScenarioFile = fileURL;
        using (FileStream writer = new FileStream(fileURL, FileMode.Create))
        {
            DataContractSerializer ser = new DataContractSerializer(typeof(Scenario));
            ser.WriteObject(writer, scenario);
        } 
    }
    public static Scenario ReadScenario(string fileURL)
    {
        FileStream fs = new FileStream(fileURL, FileMode.Open);
        XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas());
        DataContractSerializer ser = new DataContractSerializer(typeof(Scenario));
        Scenario deserializedScenario = (Scenario)ser.ReadObject(reader, true);
        reader.Close();
        fs.Close();
        return deserializedScenario;
    }
}   

请参见,首先必须创建一个列数与ItemsSource相同的DataTable。填充数据表。这不是“实例化”的意思。这是一个演员阵容,显然是无效的。谷歌可以帮助解决这些问题。区别很重要。请编辑您的问题并添加填充数据网格的代码(C#或XML或两者兼有)。@Andy ItemsSource可以是数据表。当然,它也可能是许多其他的东西,就像在这个例子中一样。@EdPlunkett我只是在用scool学习编程,课程并没有深刻地包含wpf,我只是在这类事情上的courius。