来自XML的DataSet显示在DataGridView中

时间:2011-07-27 16:56:55

标签: c# .net xml dataset

我一直在寻找答案: 我有一个格式如下的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属性的值。

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

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

2 个答案:

答案 0 :(得分:2)

如果您使用的是Windows窗体应用程序,则应该进行下一步:

  1. 将DataSource中的DataGridView从DataSource拖放到Form上。这样BindingNavigator和BindingSource就是自动定义的。
  2. 然后,您可以通过单击箭头(在表单上查看)来编辑DataGridView,这将打开DataGridView任务。在这里,您可以编辑和添加列,并执行许多其他操作(预览数据等)。
  3. 如果DataGridView没有显示适当的列,则检查当前绑定到DataSource的DataGridView属性。如果你想操纵列,必须正确定义。

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

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

答案 1 :(得分:0)

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

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());

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

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

对于我草率的写作,我很抱歉。