如何使用 datagridview 所选行在创建实体时将子实体集合添加到实体

本文关键字:实体 集合 添加 创建 datagridview 何使用 | 更新日期: 2023-09-27 18:33:05

我正在创建一个line对象,这是一个实体,它具有Tags导航属性,我也想设置该属性。我想从绑定到Tag对象的数据网格视图中获取此标签集合:

dgvTags.DataSource = _rs.Tags.Where(x => x.TagGroup.Name == "All Reasons").OrderBy(x => x.Name);

有问题的代码:

Line l = new Line
{
    Part = o.Part,
    Description = desc,
    Price = o.Price.Value,
    InvoiceNo = o.InvoiceNo,
    Cost = o.Cost.Value,
    Comments = txtComment.Text,
    Tags = dgvTags.SelectedRows as List<Tag> // <--- needs work here
                    };

该行显示错误:

错误 5 无法通过引用转换、装箱转换、取消装箱转换、包装转换或空类型转换将类型"System.Windows.Forms.DataGridViewSelectedRowCollection"转换为"System.Collections.Generic.List" C:''SVN''RS''fAddLines.cs 142 15 RS

有没有正确的方法?

更新:

我已经能够使用以下代码达到预期的结果,但仍在寻找正确的方法:

foreach (DataGridViewRow r in dgvTags.SelectedRows)
{
    l.Tags.Add(r.DataBoundItem as Tag);
}

如何使用 datagridview 所选行在创建实体时将子实体集合添加到实体

感谢大卫·霍尔,他非常努力,但最终下面的代码是最简单的解决方案:

foreach (DataGridViewRow r in dgvTags.SelectedRows)
{
    l.Tags.Add(r.DataBoundItem as Tag);
}

这是有很多方法可以解决问题的情况之一。我在下面给出的代码可能不是最好的,但它适用于从 SelectedRows 集合中获取类型化对象的列表。

IList<Tag> myrows = dataGridView1.SelectedRows.Cast<DataGridViewRow>().Select(x => x.DataBoundItem as Tag).ToList();
这使用 Linq,

并且与您的方法基本相同,Linq 只是通过删除 foreach 来稍微整理一下。


您在评论中遇到的问题是因为 Linq 和 System.Data.Objects.DataClasses.EntityCollection<T> 创建的System.Collections.Generic.List<T>之间没有隐式对话。

我相信这应该有效:

Tags = new System.Data.Objects.DataClasses.EntityCollection<RS.Tag>(
    dataGridView1.SelectedRows.Cast<DataGridViewRow>()
    .Select(x => x.DataBoundItem as Tab).ToList());

我说相信,因为我只测试过转换为BindingList<T>而不是EntityCollection<T>.


事实证明,实体集合无法分配整个列表!从这个问题这里:转换或投射一个 List 到 EntityCollection我想出了以下代码:

dataGridView1.SelectedRows.Cast<DataGridViewRow>()
    .Select(x => x.DataBoundItem as Tab).ToList().ForEach(y => Tags.Add(y));

在这一点上,我可能更喜欢香草ForEach而不是这个单行本。