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

Creating a ListViewItem from a Dataset row where a subitem has multiple elements

我正在使用 c# 将 XML 数据库读入 Visual Studio 中的数据集。获得数据集后,我将从数据集中的每一行创建一个 listviewitem,并将其放入列表视图中。但是,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 子项中包含多个元素?

看起来 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_actor" 和 "movie_genre" 的关系的子记录,选择列表中的第一列,然后将它们格式化为以逗号分隔的字符串。

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