2009-12-10 4 views
1

에 개체의 목록에 데이터 그리드를 바인딩 할 때 레코드를 추가 :나는 다음과 같은 수업을 윈폼 응용 프로그램

public class MyItems : List<MyItem> 
{ 
... 
} 

public class MyItem 
{ 
... 
} 

나는 MyItems을 인스턴스화하고 윈폼의 데이터 그리드의 데이터 소스 속성에 할당했습니다.

모든 것이 제대로 표시되지만 행을 추가하려고하면 아무 일도 발생하지 않습니다. 내가하는 일은 그리드 DataSource를 MyItems로 다시 가져와 MyItems의 인스턴스를 추가 한 다음 DataSource를 다시 목록으로 설정하는 것입니다. 코드를 단계별로 살펴보고 데이터 소스의 항목 수가 늘어나고 있지만 그리드가 표시하지 않는 것을 볼 수 있습니다. 어떤 아이디어?

//Form Load 
MyItems lstItems = new MyItems(); 
lstItems.Add(new MyItem("1")); 
lstItems.Add(new MyItem("2")); 

//Grid displays two rows; 
grd.DataSource = lstItems; 

//Add button click event 
MyItems lstItmes = (MyItems)grd.DataSource; 
lstItems.Add(new MyItem("3")); 

//Grid does not display new row 
grd.DataSource = lstItems; 

답변

3

데이터 소스를 변경하려면 System.ComponentModel.IBindingList 인터페이스를 구현해야합니다. ListChanged 이벤트를 제공하는 인터페이스로, 목록 (항목 추가 및 제거) 또는 행 (속성 값 변경)에 대한 변경 사항을 발견하기 위해 그리드가 후크합니다.

또한, ITypedList 인터페이스는 속성을 발견하고 그리드 반사 기반의 결합보다 더 나은 성능과 데이터 바인딩을 수행 할 수있는 방법 디자이너를 허용하는 것이다.

기본 알림을 찾고 기본 클래스가 List<T>과 같은 것으로부터 상속 된 경우 상위를 System.ComponentModel.BindingList<T>으로 변경해보세요. 이것은 이미 IBindingList 인터페이스의 간단한 구현을 가지고 있습니다. 속성 변경 알림을 정렬하거나 지원하는 것과 같은 고급 기능을 원한다면 더 많은 작업을 수행해야하지만 기본 추가 및 제거를위한 구현을 제공합니다.