Untyped DataSet 방식에서의 1:n 구현
- Untyped DataSet 방식으로 코딩 시 다음 과정이 포함.
- DataRelation 개체 구성
- Expression Column 구성
- BindingSource 구성
- Control을 BindingSource와 연결
Typed DataSet 방식의 경우
- DataSource view에서 위계적으로 확인이 가능하며 관계된 table을 단순히 폼으로 Drag-Drop해서 구현.
- 부모tbl 아래 자식tbl에 표현되는 방식
=> 자식tbl 아래에서 부모 tbl이 나타나지 않는다.
Binding Source 이벤트
- bs개체.CurrentChanged :
。BindingSource가 DataSource로서 Control로 할당된 후 Control에서 현재 선택된 행이 바뀔 때 발생.- bs개체.ListChanged :
。BindingSource의 List가 바뀔 때 발생.
=> ex ) BindingSource에서 부모tbl에서 CurrentChanged가 발생하여 선택된 행이 바뀔 때 자식tbl에서는 부모tbl의 선택된 행의 값을 외래키로 갖는 행들로 BindingSource가 필터링 되면서 List가 변경이 되면서 자식tbl에 ListChanged 발생.
해당 이벤트들을 통해 List에서 M:N에 의해 자동 필터링 되지 않은 BindingSource를 필터링 가능.
- CurrentChanged :
。부모(1)쪽의 행 하나를 필터링 할때 사용
。textBox와 같은 단일 Control에 표현 시 CurrentChanged 이벤트 사용.- ListChanged :
。부모(1)쪽의 List를 필터링 시 사용.
。필터링 된 각 행을 집합으로 표현하는 Control로 사용하며 주로 DataGridView , ListBox 등의 Control에 사용.
- 우측 tbl은 BindingSource의 ListChanged 이벤트를 활용해서 부모 tbl을 필터링.
CurrentChannged로 M:N 구현하기
- Form_Load 이벤트 핸들러에 CurrentChanged 이벤트 등록 후메소드를 하나 만들어서 이벤트로 MultiCasting한다.
private void CustomersOrders_Load(object sender, EventArgs e) { orderDetailsBindingSource1.CurrentChanged += OrderDetailsBindingSource_CurrentChanged; } private void OrderDetailsBindingSource_CurrentChanged(object sender, EventArgs e) { DataRowView current = ordersBindingSource1.Current as DataRowView; if (current != null && !current.IsNew) { //employeesBindingSource.Position = // employeesBindingSource.Find("EmployeeID", current["EmployeeID"]); string filter = string.Format("EmployeeID = {0}", current["EmployeeID"]); employeesBindingSource.Filter = filter; //shippersBindingSource.Position = // shippersBindingSource.Find("ShipperID", current["ShipVia"]); filter = string.Format("ShipperID = {0}", current["ShipVia"]); shippersBindingSource.Filter = filter; } }
MDI(Multiple Document Interface)
- 한개의 창에서 여러가지 작업을 할 수 있는 Interface
- Form에서 IsMdiContainer 속성을 True로 하여 사용.
- Parent Form과 Child Form간 관계 설정 시 다음과 같이 명시.
// 부모 폼 기준. 자식Form개체.MdiParent = this