【问题标题】:DataSet from XML displayed in DataGridViewDataGridView 中显示的 XML 中的数据集
【发布时间】:2011-07-27 16:56:55
【问题描述】:

我一直在寻找这个问题的答案: 我有一个格式如下的 XML 文件:

<root>
    <string id = "STRING_ID">
        <node1> Some data </node1>
        <node2>
            <type>data</type>
        </node2>
        <Translations>
           <language name="ARABIC">
               <value>Some data</value>
               <date_last_changed>7-4-2011</date_last_changed>
           </language>
           <language name="CHINESE">
            ...
            ...
        </Translations>
    </string>

    <string id = "...">
       ...
       ...
</root>

我使用来自 XML 文件的信息加载了一个 DataSet。 然后我通过

将 DataSet 绑定到 DataGridView
DataGridView1.DataSource = dataSet1;

然后使用

DataGridView1.DataMember = "string";

目前datagridview显示节点1的内容,以及每个字符串元素的id属性值。

我的问题是:如何使用语言名称 = "ENGLISH""ARABIC" 等的每个 &lt;string&gt;&lt;language&gt; 的所有 &lt;value&gt; 元素中包含的数据填充列?听起来像是对我的询问,但我不知道该怎么做。

基本上,我希望一列始终显示与我的 datagridview 中相应字符串 ID 对应的每个英文字符串,然后再一列显示我使用 ComboBox 中的列表选择的语言的每个字符串。

【问题讨论】:

  • 看起来对于 Linq to XML 来说是一项完美的工作。 [见这里][1] [1]:stackoverflow.com/questions/670563/linq-to-read-xml-c
  • 您在使用 Windows 窗体应用程序吗?
  • @Icarus -- 感谢您的回复。您链接到我的内容有所帮助,但我仍然对如何优雅地将这些值添加到我的 DataGridView 感到困惑。

标签: c# .net xml dataset


【解决方案1】:

如果您使用的是 Windows 窗体应用程序,您应该执行以下操作:

  1. 将已定义表的 DataGridView 从 DataSource 拖放到 Form 上。这样 BindingNavigator 和 BindingSource 是自动定义的。
  2. 然后您可以通过单击箭头(查看窗体)来编辑 DataGridView,这将打开 DataGridView 任务。在这里,您可以编辑和添加列以及执行许多其他操作(预览数据等)。

如果 DataGridView 不会显示适当的列,请在 DataGridView 属性下检查 DataSource 当前绑定到哪个。如果要操作列,则必须正确定义。

这是一个 DataSource 示例,然后可以将其拖放到 Windows 窗体应用程序上。如您所见,属性可以作为各种控件删除。在您的示例中,您应该将语言设置为 ComboBox。在本例中,您可以看到表 Model 下的属性 Oznaka 定义为 ComboBox:

最后,这一切都取决于如何从 XML 构造 DataSet(您可以使用哪些属性)。因此,如果您没有为您的问题定义正确的属性,那么您应该返回并设计正确的 DataSet。

【讨论】:

  • 您好 Jernej,感谢您的回复。我不确定如何将我的数据集定义为数据源。我有一个使用我的 Windows 窗体应用程序的设计器视图定义的数据集,然后我在代码中将它定义为我的 DataGridView 的数据源。有什么想法吗?
  • 您可能使用 Add -> New Item -> DataSet 将空 DataSet 添加到项目中,然后以编程方式用 xml 文件填充它?如果是这样,我认为您应该从您的 XML 中创建一个 xml 方案(.xsd 文件)(网上有很多链接如何做到这一点),然后使用 .xsd 文件来创建 DataSet。这样,您将在 Data Sources DataSet 下看到,它已根据您的 xsd(或 xml)定义了表和属性。
  • 哦,好吧。实际上,在此之前我已经编写了一个 XSD 以供将来使用。我的项目中也已经添加了架构。
【解决方案2】:

肖恩,这样的事情怎么样:

XDocument xdoc = XDocument.Load("<path_to_your_xml_file>");
        var myLittleObjects = (from y in
                                   (from c in xdoc.Descendants("string")
                                    select c).ToList()

                               select new
                               {
                                   Nodes = (from p in
                                                (from h in y.Descendants()
                                                 where h.Name.LocalName.Contains("node")
                                                 select h).ToList()
                                            select new { NodeValue = p.Value, NodeType = (from t in p.Descendants("type").ToList() select t.Value).ToList() }).ToList(),

                                    //Translations = ...  //same logic as for nodes

                               }

                               ).ToList();


        Console.WriteLine(myLittleObjects.Count());

现在您可以使用业务对象了。这将允许您将“myLittleObjects”变量的特定对象属性绑定到您的数据网格。

请注意,这个简单的语句会将整个 XML 文件转换为一个对象列表,这些对象又将具有“节点”和“翻译”属性,而这些属性又将是具有各自属性的自己的类 (在 Node 的情况下,将是 NodeValue 和 NodeType,而 NodeType 又是一个 List)

我为我的草率写作感到抱歉。

【讨论】:

    猜你喜欢
    • 2018-04-05
    • 2014-10-28
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 2021-04-17
    • 2016-11-11
    相关资源
    最近更新 更多