1

我创建了一个line对象,它是一个实体,它具有Tags我也想设置的导航属性。我想从绑定到Tag对象的 datagridview 中获取此标签集合:

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);
}
4

2 回答 2

2

感谢 David Hall,他非常努力,但最后下面的代码是最简单的解决方案:

foreach (DataGridViewRow r in dgvTags.SelectedRows)
{
    l.Tags.Add(r.DataBoundItem as Tag);
}
于 2012-05-04T13:58:15.237 回答
1

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

IList<Tag> myrows = dataGridView1.SelectedRows.Cast<DataGridViewRow>().Select(x => x.DataBoundItem as Tag).ToList();

这使用了 Linq,与您的方法基本相同,Linq 只是通过删除 foreach 来整理一下。


您在评论中遇到的问题是因为System.Collections.Generic.List<T>Linq 创建的和System.Data.Objects.DataClasses.EntityCollection<T>.

我相信这应该有效:

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

我说相信,因为我只测试了转换为BindingList<T>not with EntityCollection<T>


事实证明,EntityCollection 无法分配整个列表!从这里的这个问题:convert or cast a List<t> to EntityCollection<T>我想出了以下代码:

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

在这一点上,我可能更喜欢香草ForEach而不是这种单衬里。

于 2012-05-04T12:16:37.340 回答