Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有排序EntitySet的Datagridview<;T>;?(.NET 3.5)_.net_Linq_Datagridview_Bindingsource_Entityset - Fatal编程技术网

带有排序EntitySet的Datagridview<;T>;?(.NET 3.5)

带有排序EntitySet的Datagridview<;T>;?(.NET 3.5),.net,linq,datagridview,bindingsource,entityset,.net,Linq,Datagridview,Bindingsource,Entityset,我希望有一个简单的答案来回答这个我在谷歌搜索了几个小时后错过的问题 我有一个DataGridView,它需要显示和添加/删除/编辑数据库中的记录。我使用的是实体框架,所以记录最初是EntitySet 试一试 BindingSource具有排序功能,但是哦。。。如果您的数据源是EntitySet,那么它们实际上似乎不可用 第二次尝试 尝试在网格上实现自定义排序,但是哦。。。如果网格是数据绑定的,则不允许自定义排序 第三次尝试 在我的数据上形成Linq查询,并在那里使用order函数。这

我希望有一个简单的答案来回答这个我在谷歌搜索了几个小时后错过的问题

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

  • 试一试
BindingSource具有排序功能,但是哦。。。如果您的数据源是EntitySet,那么它们实际上似乎不可用

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

  • 第三次尝试
在我的数据上形成Linq查询,并在那里使用order函数。这可以获取我的有序数据,但是哦。。。它将AllowNew更改为false。我可以强制它返回,但是添加到DataGridView的记录不会添加到我的EntitySet(尽管奇怪的是,任何更新都会被反映出来)

  • 第四次尝试
按照#3,但现在我处理BindingSource的AddingNew事件,显式创建我的对象并将其添加到EntitySet。这样就可以了,但如果用户在网格底部输入新的条目行,我会得到一行添加到数据库中的默认值。如果用户继续输入行,我会得到很多行。所以这也不好

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


非常感谢收到的任何帮助…

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

我创建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 = 
    new LinqEntityBinding<Widget>(db, customer.Widgets, 
    customer.Widgets.OrderBy(w => w.widgetness).ToList()); // sorted
bindingSource.DataSource=
新的LinqEntityBinding(db、customer.Widgets、,
customer.Widgets.OrderBy(w=>w.widgetness.ToList());//分类
bindingSource.DataSource = 
    new LinqEntityBinding<Widget>(db, customer.Widgets, 
    customer.Widgets.OrderBy(w => w.widgetness).ToList()); // sorted