2016-06-08 2 views
0

Я изучаю структуру Entity Framework и имею разумное понимание ее операций, однако я сталкиваюсь с некоторыми проблемами при привязке Entities к элементу управления DataGridView в Winforms.Связывание, позволяющее выполнять операции CRUD в DataGridView

Проблема, с которой я столкнулся, заключается в том, что, по-видимому, существует разрыв между объектом данных и элементом управления DataSource.

я устанавливаю DataSource в DataGridView с помощью LINQ к Entities (это выполняется в случае загрузки формы):

DbContext context = new DbContext(); 
FormGrid.DataSource = context.USER_LIST 
    .Where(x => x.USER_ID > 1) 
    .ToList() 

Это будет означать, скажем, 5 строк в DataGridView; столбцы в DataGridView были добавлены с DataPropertyName, который соответствует свойству объекта, который я хочу показать в сетке, поскольку в этом случае сетка представляет собой список объектов USER_LIST, но может быть любым видом списка объектов из DbSet<T> в модели сущности.

При добавлении новой строки в сетке, я сначала создать новый объект user_list со значениями по умолчанию, требуемые из таблицы базы данных «AllowNull = False» столбцов:

USER_LIST NewUser = new USER_LIST() { USER_ID = FGetNextID("USER"), PASSWORD = "p", USER_NAME = "NewUser" }; 

Однако я впадающей при попытке добавить этот объект: добавление его к данным в новой строке в DataGridView не добавляет его в коллекцию context.USER_LIST и добавление ее непосредственно в context.USER_LIST не добавляет новую строку в DataGridView, заставляя меня думать, что я являюсь обязательным данные в DataGridView некорректно.

Я хочу, чтобы создать экземпляр нового объекта Entity Object, а затем добавить его в DbSet, который затем будет отображаться новой строкой, добавляемой в элемент управления DataGridView. Затем, когда любые изменения внесены в любой из других объектов через DataGridView и вызывается context.SaveChanges(), эти изменения подтверждены.

+0

Вам нужно * привязку двухсторонних данных. * См. Http://stackoverflow.com/q/12736958 –

+0

Это, безусловно, позволяет привязать двухстороннюю привязку данных, но поскольку это возвращает все элементы в USER_LIST как объекты, это не позволяет фильтрация в списке объектов, привязанных к DataSource. Я буду исследовать, как фильтровать DataSource отдельно и отчитываться с тем, что я нахожу, хотя, если у вас есть какие-либо идеи на этом фронте, я открыт для предложений. –

+0

@Robert Harvey. Заглянув в это, выяснилось, что решение было действительно неловко простым; вызов Load() на DbSet будет загружать все обратно, но я не понимал, что могу выполнять инструкции LINQ перед вызовом Load() для достижения тех же результатов; выполнение этого разрешено встретить, чтобы получить исходный набор данных, который не представлял всех записей в таблице, но все же допускает двухстороннюю привязку. –

ответ

0

Поскольку я не уверен, как отметить комментарий как принятый ответ, я ответил на него здесь, чтобы попытаться закрыть его.

Перейдя по ссылке, предложенной Robert Harvey я реализовал следующие, удовлетворяющие как требование установить 2-полосные привязки данных, а также исключает запись, которые я не хочу, включенную в данные сетках:

context.USER_LIST 
     .Where(x => x.USER_ID > 1) 
     .Load(); 
FormGrid.DataSource = context.USER_LIST.Local.ToBindingList(); 
Смежные вопросы