2010-02-11 3 views
73

둘 사이의 차이점을 내 프로젝트에 설명 할 수 있습니까?목록 <T> 대 바인딩 목록 <T> 장점/단점

현재 List<MyClass>이 있고 BindingSource를 BindingSource에 DataGridView로 설정합니다.

내가 IEditableObject을 구현 그래서 CancelEdit를 호출 할 때 나는 나의 목적은 다시는 Memberwise.Clone()

으로 무엇에 복귀 해결는 바인딩에 내 목록을 변경하는 것이 어떤과는 바인딩을 사용할 때의 장점은 무엇인가?

답변

100

List<>은 몇 가지 도우미 기능 (예 : sort)을 사용하여 지정된 유형의 항목을 자동으로 크기 조정하는 배열입니다. 그것은 단지 데이터 일 뿐이므로이를 사용하여 모델의 객체 세트에 대한 작업을 실행할 수 있습니다.

BindingList<>IBindingList 인터페이스를 구현하는 입력 된 목록 또는 모음을 둘러싼 래퍼입니다. 이것은 양방향 데이터 바인딩을 지원하는 표준 인터페이스 중 하나입니다. 이는 항목을 추가, 제거 또는 설정할 때 발생하는 ListChanged 이벤트를 구현하여 작동합니다. 연결된 컨트롤은 표시를 새로 고치는시기를 알기 위해이 이벤트를 수신합니다.

BindingSource의 데이터 소스를 List<>으로 설정하면 내부적으로 목록을 줄이기 위해 BindingList<>이 만들어집니다. BindingSource 외부에서 액세스하려는 경우 자신의 목록을 BindingList<>으로 미리 래핑하고 싶을 수도 있습니다. 그렇지 않으면 그냥 동일합니다. 또한 항목을 변경할 때 BindingList<>에서 상속하여 특별한 동작을 구현할 수도 있습니다.

IEditableObject은 BindingSource에서 처리합니다. 바인딩 된 컨트롤에서 데이터를 변경할 때 모든 구현 객체에서 BeginEdit을 호출합니다. 그런 다음 BindingSource에서 EndEdit/CancelEdit를 호출하면 개체에 전달됩니다. 다른 행으로 이동하면 EndEdit도 호출됩니다.

+0

현재 내 목록 접근 방식으로 CancelEdit를 호출하면 편집중인 항목이 원래 상태로 돌아 오지 않으므로 Clone()을 사용하게됩니다. 바인딩리스트가 나를 위해 그것을 다룰 거라고 말하는거야? – Jon

+2

아니요, BindingList는 해당 기능과 아무 관련이 없습니다. BindingSource는 기본 목록의 유형에 관계없이 단순히 현재 개체의 CancelEdit를 호출합니다. 일반 객체에 대한 객체 버전을 자동으로 구현하는 프레임 워크에는 아무 것도 없습니다. 이 목적으로 만 데이터의 원본 복사본을 보관하는 DataTables/DataRows를 사용할 수 있습니다. –

+0

당신은 통제가 목록이 언제 변화 하는지를 알아야한다고 말합니다, 당신은 더 설명 할 수 있습니까? 데이터가있는 데이터가있는 폼에서 DataGridview 및 다른 폼이 있습니다. 이 문제에 대한 당신의 말에 대해 내가 우려해야합니까? – Jon

10

BindingList는 이벤트를 사용하여 양방향 데이터 바인딩을 허용하지만 List는 해당 컬렉션이 변경 될 때 이벤트를 발생시키지 않습니다.

나는 당신의 특별한 문제를 해결할 것이라고 생각하지 않습니다.