我希望有一个简单的答案,我在谷歌搜索时间里错过了...
我有一个DataGridView,它需要显示和添加/删除/编辑数据库中的记录。我正在使用实体框架,因此记录最初是EntitySet。
BindingSource具有排序功能,但是哦......如果您的DataSource是EntitySet,它们似乎并不可用。
尝试在网格上实现自定义排序,但是如果网格是数据绑定的话,则不允许进行自定义排序。
对我的数据执行Linq查询并使用那里的订单功能。这可以获取我的有序数据,但是哦......它将AllowNew改为false。我可以强制它回来,但是添加到DataGridView的记录不会被添加到我的EntitySet中(尽管奇怪地反映了任何更新)。
按照#3,但现在我处理BindingSource的AddingNew事件并显式创建我的对象并将其添加到EntitySet。然后这可以工作,除非用户在网格底部输入新的条目行,否则我会得到一行充满了添加到我的数据库的默认值。如果用户继续输入行,我会得到很多行。所以这也不好。
必须有一种方法可以做到这一点 - 当然要在网格中显示一些数据库记录并允许完全编辑是最基本的要求(并且以随机顺序显示行没有多大用处)?
最感激的任何帮助......
答案 0 :(得分: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