【问题标题】:Load the result of LINQ XML file to datagrid将 LINQ XML 文件的结果加载到数据网格
【发布时间】:2021-04-16 03:33:19
【问题描述】:

我有一个 xml 文件。我只想加载“Project1”的内容并排序到“TaskID”。

我的 XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<Contents>
  <Project Project="Project1">
    <TaskV>Hello</TaskV>
    <TaskE>Goodbye</TaskE>
    <taskID>1</taskID>
  </Project>
  <Project Project="Project1">
    <TaskV>Nice to meet you</TaskV>
    <TaskE>Let's go</TaskE>
    <taskID>2</taskID>
  </Project>
  <Project Project="Project2">
    <TaskV>This is my book</TaskV>
    <TaskE>This is my pen</TaskE>
    <taskID>1</taskID>
  </Project>
  <Project Project="Project2">
    <TaskV>Look for a cat</TaskV>
    <TaskE>Near the library</TaskE>
    <taskID>2</taskID>
  </Project>
<Contents>

我的代码:

private void loaddata()
        {
            XDocument doc = XDocument.Load(System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments) + @"\result.xml");
            var query = from project in doc.Descendants("Contents")
                        where (string)project.Element("Project") == "Project1"
                        select new 
                        {
                            V = project.Element("TasKV").Value,
                            E = project.Element("TaskE").Value
                        };
          dataGrid.ItemsSource = query;
        }   

我的xml:

<Window x:Class="XML.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:XML"
        mc:Ignorable="d"
        Title="MainWindow" Height="420" Width="1327.471">
    <Grid>
        <DataGrid x:Name="dataGrid" HorizontalAlignment="Left" Margin="24,64,0,0" VerticalAlignment="Top" Height="300" Width="1268" ItemsSource="{Binding}"/>

    </Grid>
</Window>

我可以将 XML 文件中的所有数据加载到数据网格中,但是当我使用 linq 只获取数据“Project1”时,它不起作用。

任何人都可以帮助我解决这个问题。对不起,如果我的英语很糟糕。

【问题讨论】:

  • 使用dataGrid.DataContext = query; 设置dataGrid 的数据上下文或从xaml 中移除ItemsSource="{Binding}" 的覆盖。
  • 我尝试像你说的那样使用 datagGrid.DataContext=query,但它不起作用。

标签: c# xml wpf linq


【解决方案1】:

几点说明:

您的 XML 文件未正确关闭。最后一个元素应该是&lt;/Contents&gt; 而不是&lt;Contents&gt;

在这一行中V = project.Element("TasKV").Value 有一个拼写错误的TaskV(k 应该是小写)。

private void loaddata() 应该是 LoadData 根据 official guidelines

解决办法:

var query = from project in doc.Root.Elements("Project")
            where project.Value == "Project1"
            select new
            {
                V = project.Element("TaskV").Value,
                E = project.Element("TaskE").Value
            };

【讨论】:

  • 非常感谢。错误是“TaskKV”。正确的是“TaskV”。
【解决方案2】:
XDocument doc = XDocument.Load(System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments) + @"\result.xml");
var query = doc.Root.Elements("Project")
                .Where(x => x.Attribute("Project").Value == "Project1")
                .Select(x => new
                {
                    V = x.Element("TaskV").Value,
                    E = x.Element("TaskE").Value
                });
dataGrid.ItemsSource = query;

【讨论】:

  • 在“... });”之后有错误。错误是“在 XML.exe 中发生‘System.NullReferenceException’类型的异常,但未在用户代码中处理”。附加信息:对象引用未设置为对象的实例。
  • 更新:你的代码是完美的。我在代码中有拼写错误。 “TaskV”不是“TaskV”。非常感谢
【解决方案3】:

使用这个:

DataSet dataSet = new DataSet();
dataSet.ReadXml(your xml file or data);
DataView dataView = new DataView(dataSet.Tables[0]);
dataGrid.ItemsSource = dataView

【讨论】:

  • 感谢您的回复。但我只想加载“Project1”的数据。您的代码将加载所有 Project1 和 Project2...
猜你喜欢
  • 2016-09-11
  • 2018-10-02
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多