如何使用 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);
}
感谢大卫·霍尔,他非常努力,但最终下面的代码是最简单的解决方案:
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
dataGridView1.SelectedRows.Cast<DataGridViewRow>()
.Select(x => x.DataBoundItem as Tab).ToList().ForEach(y => Tags.Add(y));
在这一点上,我可能更喜欢香草ForEach
而不是这个单行本。