2011-01-02 2 views
3

저는 ORMs를 처음 접했고 현재 Telerik OpenAccess ORM을 시도하고 있습니다. 그러나 질문은 실제로 해당 ORM에만 한정되지는 않습니다. 그리고 나는 아직 ORM에 대해 아직 완전히 정착하지 못했습니다.ORM, DataGridView에 대한 데이터 바인딩 : 데이터베이스에 저장되지 않은 새 행을 삽입/삭제했습니다.

내가 얻으려고하는 것은 DataGridView를 바인딩하여 고객 테이블의 모든 고객을 보여주는 Customers 개체 컬렉션을 표시하는 것입니다.

BindingSource에 바인딩하고 BindingSource를 DataGridView 컨트롤에 바인딩했습니다.

기존 항목을 성공적으로 수정할 수 있습니다 (OpenAccess ORM의 SaveChanges 메서드 사용). 저장하면 내용이 예상대로 데이터베이스에 다시 저장됩니다.

그러나 DataGridView에서 행을 삭제하거나 새 행을 추가하면 오류 메시지 나 예외없이 데이터베이스에 저장되지 않습니다.

이상적으로, 내가 좋아하는 바인딩 외모를 수행 ... 나는 전형적인 DataTable을 사용하여이 작업을 수행 할 수있을 것입니다 단지처럼 ORM 가능한 모든 CRUD 작업을 수행 할 수 있도록

코드를 싶습니다 이 :

 List<Customer> ukCustomers = (from c in diagrams.Customer 
           where c.Country == "UK" 
           select c).ToList(); 

     customersBindingSource.DataSource = ukCustomers; 
     customersBindingSource.AllowNew = true; 

나의 현재 추측은 DataGridView에에 사용자가 추가 된 새로운 행이 목록 만 "자유로운 서"고객 인스턴스의 일부가 아닌 것입니다? 나는 그들이 목록에 자동으로 추가 될 것이라고 생각했을 것이다. 삭제 된 행에 대해 동일한 작업이 수행됩니다. 목록에서 자동으로 제거되고 ORM의 SaveChanges 메서드가 해당 작업을 선택할 수 있습니까?

바인딩 이외의 다른 작업을 수행해야합니까? 누구나이 작업을 성공적으로 수행 했습니까? 일반적으로 WinForms와의 데이터 바인딩 경험은 ORM (Telerik이 아닌)을 통해 얼마나 성공적 이었습니까?

감사합니다.

답변

3

당신의 의혹은 맞습니다. 그리드를 "프리 스탠딩 (free standing)"개체 목록에 바인딩하고 각 개체가 자체 추적하는 동안 목록은 그렇지 않습니다. 이것이 기존 개체의 변경 내용이 예상대로 작동하지만 추가/제거가 수행되지 않는 이유입니다.

한 가지 해결 방법은 표준 목록 대신 관찰 가능한 모음을 사용하는 것입니다. 그런 다음 바인딩을 동일하게 처리 할 수 ​​있지만 필요에 따라 컨텍스트에서 항목을 추가/제거하여 이벤트 추가/제거에 응답합니다.

기본 예는 :

private PropertyManagerModel.DemoDBEntityDiagrams context; 
    public Form1() 
    { 
     InitializeComponent(); 
     context = new DemoDBEntityDiagrams(); 
     LoadCommunities(); 
    } 

    private void LoadCommunities() 
    {   
     var communityList = new ObservableCollection<Community>(context.Communities); 
     communityList.CollectionChanged += new NotifyCollectionChangedEventHandler(communityList_CollectionChanged); 
     this.dataGridView1.DataSource = new BindingSource() { DataSource=communityList}; 
    } 

    void communityList_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
    { 
     if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add) 
      context.Add(e.NewItems); 

     if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove) 
      context.Delete(e.OldItems); 

     context.SaveChanges(); 
    }  

이 내가 아는 한, 모든 ORMS의 경우 일 것이다. 희망이 도움이! 그쪽 된 DataGridView에서 콤보 상자가있는 경우

감사합니다,

여호수아 홀트

+0

이 작동하지 않습니다. 이러한 경우 ObservableCollection이 지속적으로 DataError Exception을 발생시킵니다. – sentenza

관련 문제