2010-01-18 6 views
3

나는 Fluent NHibernate로 매핑 된 데이터베이스의 데이터를 표시하기 위해 WinForms 데이터 바인딩을 사용 해왔다.NHibernate, WinForms 및 DataBinding - 함께 잘 작동합니까?

예를 들어, 엔티티의 IList 속성에서 DataGridView의 DataSource 속성을 설정할 수 있으며 모든 데이터가 있습니다.

하지만 이제는 새 데이터 행을 추가하고 저장해야하므로 잘 진행되지 않습니다. 나는 그리드의 AllowUserToAddRows 속성을 활성화 할 수있을 것이라고 생각하고 새로운 행이 엔티티의 기본 IList에 추가 될 것이지만 작동하지 않는다.

약간의 검색 후에 IList에서 채워진 BindingList에 DataSource 속성을 설정하려고했지만 새 행으로도 업데이트되지 않았습니다.

내 검색 과정에서 WinForms 및 DataBinding을 사용하는 데 어려움을 겪고있는 사람이 몇 명 있었으므로이 방법을 더 이상 추구해야하는지 궁금합니다.

데이터 바인딩 접근법은 계속 가치가 있습니까? 그렇다면 누군가 내가 잘못 가고 있다고 제안 할 수 있습니까?

또는 새 행을 추가하는 것과 관련된 모든 DataGridView 이벤트를 처리하고 내 엔터티의 IList 속성에 새 개체를 추가하는 코드를 직접 작성하는 것이 좋습니다.

다른 방법은? (비록 WPF 로의 전환이 옵션이 될 것 같지는 않지만 데이터 바인딩이 얼마나 좋을 지 상관없이)

답변

5

nHibernate 엔티티를 일반 목록에로드 (또는 복사) 할 수 있습니까? 그렇다면 일반 목록에 바인딩 된 DataGridView를 사용하여 양방향 바인딩으로 성공을 거두었습니다.

핵심 포인트는

  • 일반 목록은 각 사용자 정의 클래스의 인스턴스 인 객체 목록이 포함되어 있습니다.
  • 사용자 정의 클래스는 바인딩 할 각 필드에 대해 공용 속성을 구현해야합니다. 공개 입력란이 나를 위해 작동하지 않았습니다.
  • BindingSource를 사용하여 실제 제네릭 목록을 래핑하십시오.
  • BindingSOurce를 사용하면 AllowNew 속성을 true로 설정할 수 있습니다. List에 직접 바인딩하는 것이 거의 효과가 있지만 AllowUsersToAddRows = true 인 경우에도 DataGridVieww에 "New row"행이 표시되지 않습니다.

는 예를 들어, dataGridView1와 양식이 코드를 추가

private List<MyObject> m_data = new List<MyObject>(); 

    private BindingSource m_bs =new BindingSource(); 


    private void Form1_Load(object sender, EventArgs e) 
    { 

     m_data.Add(new MyObject(0,"One",DateTime.Now)); 
     m_data.Add(new MyObject(1, "Two", DateTime.Now)); 
     m_data.Add(new MyObject(2, "Three", DateTime.Now)); 

     m_bs.DataSource = m_data; 
     m_bs.AllowNew = true; 

     dataGridView1.DataSource = m_bs; 
     dataGridView1.AutoGenerateColumns = true; 
     dataGridView1.AllowUserToAddRows = true; 

    } 

    private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     for (int i = 0; i < m_data.Count ; i++) 
     { 
      Console.WriteLine(string.Format("{0} {1} {2}", m_data[i].ID, m_data[i].Name, m_data[i].DOB));     
     } 
    } 
} 

public class MyObject 
{ 
    // Default ctor, required for adding new rows in DataGridView 
    public MyObject() 
    { 
    } 

    public MyObject(int id, string name, DateTime dob) 
    { 
     ID = id; 
     Name = name; 
     DOB = dob; 

    } 

    private int m_id; 
    public int ID 
    { 
     get 
     { 
      return m_id; 
     } 
     set 
     { 
      m_id = value; 
     } 
    } 


    private string m_name; 

    public string Name 
    { 
     get 
     { 
      return m_name; 
     } 
     set 
     { 
      m_name = value; 
     } 
    } 

    private DateTime m_dob; 

    public DateTime DOB 
    { 
     get 
     { 
      return m_dob; 
     } 
     set 
     { 
      m_dob = value; 
     } 
    } 
} 

형태가 종료

는 바인딩 목록의 내용이 화면에 출력된다.

+0

감사합니다. BindingList를 사용하여 BindingSource로 전환했을 때 모든 것이 잘 동작했습니다. –

관련 문제