【问题标题】:Creating a ListViewItem from a Dataset row where a subitem has multiple elements从子项具有多个元素的数据集行创建 ListViewItem
【发布时间】:2015-12-02 02:20:14
【问题描述】:

我正在使用 c# 将 XML 数据库读入 Visual Studio 中的数据集。获得数据集后,我将从数据集中的每一行创建一个列表视图项,并将其放入列表视图中。但是,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不完全是数据集,为什么还要使用DataSet?
  • 它从早期项目中回收的代码。我是 C# 和 Visual Studio 的新手。我应该研究另一种方法吗?
  • 如何将多个字符串添加到单个项目中?加入他们的空间?

标签: c# xml visual-studio listview dataset


【解决方案1】:

看起来 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 的方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-24
    • 1970-01-01
    • 2021-06-13
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多