从子项具有多个元素的“数据集”行创建ListViewItem

本文关键字:数据集 ListViewItem 创建 元素 | 更新日期: 2023-09-27 18:25:20

我正在使用c#将XML数据库读取到Visual Studio中的数据集中。一旦我有了数据集,我就会从数据集中的每一行创建一个listviewitem,并将其放在listview中。但是,XML文档看起来像这个

<?xml version="1.0" encoding="utf-8"?>
<movielist>
<movie>
    <title>Adventures of Casanova </title>
    <year>1948</year>
    <length>83 min</length>
    <certification>Approved</certification>
    <director>Roberto Gavaldn</director>
    <rating>1</rating>
    <genre>Action</genre>
    <genre>Adventure</genre>
    <genre>History</genre>
    <genre>Romance</genre>
    <genre>War</genre>
    <actor>Arturo de C  rdova</actor>
    <actor>Lucille Bremer</actor>
    <actor>Turhan Bey</actor>
    <actor>John Sutton</actor>
    <actor>George Tobias</actor>
</movie>
</movielist>

我在将演员和类型子项添加到列表视图项中时遇到问题,因为该子项中包含多个元素。

到目前为止,我的代码看起来像这个

 foreach (DataRow dr in ds.Tables["movie"].Rows)
            {
                item = new ListViewItem(new string[]
                {
                    dr["title"].ToString(),
                    dr["year"].ToString(),
                    dr["rating"].ToString(),
                    dr["actor"].ToString(),
                    dr["director"].ToString(),
                    dr["genre"].ToString(),
                    dr["length"].ToString(),
                });
            listView1.Items.Add(item);
        }
    }

但我在演员和类型价值观上犯了错误。如何在listviewitems子项中包含多个元素?

从子项具有多个元素的“数据集”行创建ListViewItem

看起来XML解析器想要从该模式在数据集中创建三个表。在这样做的过程中,它为你创造了关键的关系。您只需要知道如何从集合中的各个数据表访问它们。

使用一点linq来帮助我们将演员和流派的列表连接在一行中,你可以试试这个:

foreach (DataRow dr in ds.Tables["movie"].Rows)
{
    item = new ListViewItem(new string[]
    {
        dr["title"].ToString(),
        dr["year"].ToString(),
        dr["rating"].ToString(),
        string.Join(", ", dr.GetChildRows("movie_actor").Select(a => a[0])),
        dr["director"].ToString(),
        string.Join(", ", dr.GetChildRows("movie_genre").Select(a => a[0])),
        dr["length"].ToString(),
    });
    listView1.Items.Add(item);
}

这做了三件事。它获取名为"movie_aactor"answers"movie_type"的关系的子记录,选择列表中的第一列,然后将它们格式化为用逗号分隔的字符串。

最后一点,我不确定如果有缺少演员或类型的电影记录,这种串联是否会失败。在这种情况下,您可能需要稍微修改构建每个ListViewItem的方式。