2010-02-25 7 views
3

시나리오 :윈도우 DataGridView를 BindingSource에 색인

기본적으로

내가 가지고

  • System.Windows.Forms.DataGridView

  • BindingSource에와 IBindingList

  • 을 상속하는 클래스
  • 개인 속성으로 2 개의 표준 목록을 가진 클래스

  • ,

된 DataGridView DGV = 새로운 ...

MyBindingSource BindingSource에 = 새 ... 새로운

myList에 목록 = ...

DataGridView.DataSource 속성은 BindingSource에 및 설정 가져옵니다 BindingSource.DataSource가 목록의 비공개 목록 중 하나로 설정됩니다.

bindingSource.DataSource = list.ListA;

dgv.DataSource = bindingSource;

데이터베이스에서 스트리밍 정보를 가져 오는 중입니다. 정보를 개체로 변환하고 한 번에 하나씩 MyList에 추가하면 결국 DataGridView에 표시되어야합니다.

나는 이제 모든 것이 의미가 있었으면 좋겠다. 문제 : 바인딩 소스가 아닌 목록에 단일 개체를 추가 한 후 DataGridView에 항목을 표시하려고합니다. 하지만 내가 현재 작동하도록 할 수있는 유일한 방법은 추가 된 1 개의 새 객체로 bindingSource의 다른 인스턴스를 만들고 DataGridView.DataSource를 새 bindingSource로 설정하는 것입니다. 이 과정은 엄청나게 비효율적이며 datagridview는 항상 매번 무효화해야합니다.

대신 DataGridView에 새로운 개체가 추가되었다는 것을 알려주는 BindingSource를 notifiy로 지정하여 목록을 만들고 싶습니다. 나는 이것을 시도했지만 'Index -1의 항목에는 값이 없습니다'라는 IndexOutOfrange 예외가 계속 발생했습니다. BindingSource를 살펴본 결과 실제로 위치는 -1이었고 Current 속성은 동일한 예외를 던졌습니다. 위치 및 현재 속성이 올 때마다 새 BindingSource를 만들면됩니다.

그래서 목록에 항목을 추가 할 때 해당 속성이 업데이트되도록하려면 어떻게해야합니까? 리플렉터를 통해 열어서 "CurrencyManager"가 그 일과 관련이있는 것처럼 보입니다. base.OnDataMemberChanged base.OnListChanged와 같은 몇 가지 작업을 시도했습니다.

편집 : 언급을 잊어 버렸습니다. DataGrid보기에서 행을 클릭 할 때 예외가 발생하기 만하면 항목이 잘 추가됩니다. DataGridView가 BindingSource와 동기화되지 않는 것과 같습니다.

+0

'List' 대신'DataTable'을 사용할 수 있습니까? DataTable을 사용하여 많은 작업을 수행했습니다. <-> BindingSource <-> DGV는 항상 완벽하게 작동합니다. List에 바인딩하는 것에 대해서는 확실하지 않습니다. – Ken

+0

흠 나는 DataTables에 너무 능숙하지 않아서 많은 코드를 변경해야 할 것입니다. 그래서 내가 현재 가지고있는 것에 대한 수정을 기대하고있다. – Daniel

답변

1

ObservableCollection을 사용 해본 적이 있습니까? 컬렉션에 추가되거나 제거 된 항목이있을 때마다 해당 컨트롤이 업데이트되었음을 ​​알 수 있습니다.나는 당신이는 바인딩을 사용하는 경우를 제외하고

1

원인이 될 수 무엇인지에 아니에요

(수동으로 이벤트를 발생시킬 필요가 있지만) 그것은 또한뿐만 아니라 컬렉션의 항목의 속성과 동일한 작업을 수행합니다 (일반) 대신 항목 추가/삭제 및 개별 항목 변경을 통보합니다. (http://msdn.microsoft.com/en-us/library/ms132679.aspx)

+0

이것이 내가하는 일이다. +1 – leppie

2

DataSource가 내용을 변경하면 DataGridView는 눈금을 지우고 SelectionChanged 이벤트를 발생시키고 다른 이벤트는 사용자 상호 작용으로 연결됩니다. 이벤트가 발생할 때 전혀 데이터가 표시되지 않으므로 SelectionChanged 이벤트 리스너가 있고 행 또는 열 내부에 액세스하는 경우 행에 액세스 할 때 바운드 예외가 발생합니다. 해결 방법 : DataGrid 리소스를 사용하기 전에 항상 Rows.count를 0 값으로 확인하십시오. 건배