0

我希望有一个简单的答案来解决我在谷歌搜索数小时中错过的这个问题......

我有一个 DataGridView 需要显示和添加/删除/编辑数据库中的记录。我使用的是实体框架,所以记录最初是 EntitySet。

  • 尝试一

BindingSource 具有排序功能,但是哦……如果您的 DataSource 是 EntitySet,它们似乎实际上不可用。

  • 尝试二

尝试在网格上实现自定义排序,但是哦……如果网格是数据绑定的,则不允许自定义排序。

  • 尝试三

对我的数据执行 Linq 查询并在那里使用 order 函数。这可以获取我的有序数据,但是哦……它把 AllowNew 更改为 false。我可以强制它回来,但是添加到 DataGridView 的记录不会添加到我的 EntitySet 中(尽管奇怪的是任何更新都被反映了)。

  • 尝试四

按照#3,但现在我处理 BindingSource 的 AdditionalNew 事件并显式创建我的对象并将其添加到 EntitySet。然后,这将起作用,除非用户在网格底部输入新的条目行,我会得到一行完整的默认值添加到我的数据库中。如果用户继续输入该行,我会得到很多行。所以这也不好。

必须有一种方法来做到这一点 - 当然,在网格中显示一些数据库记录并允许完全编辑是最基本的要求(并且以随机顺序显示行并没有多大用处)?

非常感谢您的任何帮助...

4

1 回答 1

0

我仍然欢迎有关更好的方法的任何建议,但以下似乎对我有用。

我创建了一个 BindingList 的衍生物来包装我的 LINQ 返回的记录,然后传递 ObjectContext 和 EntityCollection。它覆盖了 AddNewCore 和 CancelNew 以将对象以及 BindingList 放入数据库中,并且如果您将焦点移到底行但不写任何内容,它似乎会在没有不需要的空白行的情况下持久化更改。

class LinqEntityBinding<T> : System.ComponentModel.BindingList<T> 
    where T : System.Data.Objects.DataClasses.EntityObject
{
    public LinqEntityBinding(
        System.Data.Objects.ObjectContext context,
        System.Data.Objects.DataClasses.EntityCollection<T> collection,
        IList<T> list)
        : base(list)
    {
        _context = context;
        _collection = collection;
    }
    System.Data.Objects.ObjectContext _context;
    System.Data.Objects.DataClasses.EntityCollection<T> _collection;

    protected override object AddNewCore()
    {
        object obj = base.AddNewCore();
        _collection.Add((T)obj);
        return obj;
    }

    public override void CancelNew(int itemIndex)
    {
        object obj = Items[itemIndex];
        _collection.Remove((T)obj);
        if (((T)obj).EntityState != System.Data.EntityState.Detached)
        {
            _context.DeleteObject(obj);
        }
        base.CancelNew(itemIndex);
    }
}

然后代替:

bindingSource.DataSource = customer.Widgets;  // unsorted

我有:

bindingSource.DataSource = 
    new LinqEntityBinding<Widget>(db, customer.Widgets, 
    customer.Widgets.OrderBy(w => w.widgetness).ToList()); // sorted
于 2009-09-23T11:23:10.963 回答