C# - SQlite + Entity - 在ListView

时间:2017-11-13 23:16:22

标签: c# listview

使用Visual Studio 2015并使用SQlite + Entity(WPF应用程序)学习ORM

我的数据库包含字段:ID和ShipType

我可以使用ShypType字段填充listView:

    private void button_Click(object sender, RoutedEventArgs e)
    {
        List<string> shipList = new List<string>();
        using (var db = new ImperialFleetDBEntities())
        {
            shipList = (from g in db.ShipsType select g.ShipType).ToList();
            db.Dispose();
        }

        listView.Items.Clear();                   
        foreach (string str in shipList)
        {
            listView.Items.Add(str);
        }

    }

但我无法想象如何显示ID字段(本例中的g.ID)

在此链接C# ListView Display中,解决方案正在使用ListViewSubItems

但如果我输入listView。我没有任何SubItems选项

解决方案是5岁,也许这就是问题?

1 个答案:

答案 0 :(得分:1)

最简单的方法可能是:

private void button_Click(object sender, RoutedEventArgs e)
{
    using (var db = new ImperialFleetDBEntities())
    {
        listView.Items.Clear();
        foreach(var item in (from g in db.ShipsType select new { ID = g.ID, ShipType = g.ShipType }))
        {
            listView.Items.Add(item)
        }
    }
}

这应该以正确的方式填充listView,并确保EF不会跟踪这些新对象。

如果您愿意,可以创建完整的类,例如包含所需字段的Lis​​tView的ViewModel,然后选择它们:

foreach(var item in (from g in db.ShipsType select new NewShipType { ID = g.ID, ShipType = g.ShipType }))
{
    listView.Items.Add(item)
}

或使用构造函数(如果你创建一个)。

使用seprate ViewModel,您当然可以使用中间列表对象并清除并将它们添加到listView.Items,这对于匿名对象是不可能的。

顺便说一下,你没有,也许你不应该在db.Dispose()子句中写using,因为using正是为了确保内部的对象被处理掉 - 您无法在未实现using接口的对象上使用IDisposable