ADO.NET : Many-To-Many

TopOfTheHead·2024년 6월 8일

시립대-C# , .NET

목록 보기
7/8

Untyped DataSet 방식에서의 1:n 구현

  • Untyped DataSet 방식으로 코딩 시 다음 과정이 포함.
  1. DataRelation 개체 구성
  2. Expression Column 구성
  3. BindingSource 구성
  4. Control을 BindingSource와 연결

Typed DataSet 방식의 경우

  • DataSource view에서 위계적으로 확인이 가능하며 관계된 table을 단순히 폼으로 Drag-Drop해서 구현.
  • 부모tbl 아래 자식tbl에 표현되는 방식
    => 자식tbl 아래에서 부모 tbl이 나타나지 않는다.

Many-To-Many

  • Typed Dataset의 경우 m:n에서 1:m , n:1 일때 , 1(부모)쪽으로 필터링을 자동으로 수행하지 않는다.
    => DataSource View에서는 자동으로 부모 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
profile
공부기록 블로그

0개의 댓글