从子项具有多个元素的数据集行创建 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 的方式。
我正在使用 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 的方式。