2008-10-07 7 views
5

VS 2008/C#을 사용하고 DataGridView 컨트롤의 DataSource로 도우미 클래스의 로컬 목록을 바인딩합니다. 내 헬퍼 클래스 목록에서 Remove() 메서드를 호출하면 DataGridView의 CellFormatting 이벤트가 발생합니다.이 이벤트는 의미가 있습니다.마지막 행 제거 데이터 바인딩 DataGridView C#

그리드의 마지막 행에있는 DataBoundItem (그리드에 둘 이상의 행이있는 한)을 제거하면이 이벤트가 발생하기 전에 DataGridView의 Rows 컬렉션이 업데이트되지 않습니다. 그래서 CellFormatting 이벤트 핸들러에서 행 컬렉션이 너무 커서 IndexOutOfRangeException이 발생합니다.

DataGridView.Rows.Remove() 메서드를 사용하여 행을 제거하고 List를 데이터 소스로 직접 바인딩하지 않고 BindingSource를 사용하여 바인딩을 시도했습니다.

Google을 통해이 발생에 대한 몇 가지 참조를 찾았지만 응답이 없거나 DataGridView 또는 DataGridView.Rows 컬렉션에서 Delete() 메소드를 사용한다고 응답하지 않았습니다. 현재 존재하지도 않습니다.

정렬 작업을 수행하거나 수행하지 않을 때 동일한 결과가 발생하므로 정렬이 문제가되지 않습니다.

"마지막 행"에 대한 유일한 예외는 DataGridView에 행이 하나만있는 경우입니다.이 경우 모든 것이 정상적으로 작동합니다.

답변

10

나는 과거에이 문제를 겪었고, 올바르게 기억하면 할 수있는 두 가지 작업 중 하나가 있습니다. 컬렉션에서 레코드를 제거 할 때 datagridview의 datasource 속성을 null로 설정 한 다음 목록에 다시 바인딩하십시오. 그 트릭을해야합니다.

DataGridview에서 DataError 이벤트를 처리 할 수 ​​있으며 e.Cancel = true로 설정하면 예외를 표시하지 않거나 더 이상 처리 할 수 ​​있습니다.

+0

null로 설정하고 컬렉션으로 돌아 가기. – Pat

+0

미친 오래된 질문에 대한 예외 답변. :-) 나는 그 당시 성공하지 못한 채 제안을 시도했다고 믿는다. 그러나 그것은 다른 사람들을 위해 일한 것으로 보인다. –

0

아주 오래된 문제이지만 다음과 같이 행 제거 이벤트를 처리하여 해결했습니다.

private void dgViewItems_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e) 
{ 
    dataAdapter.Update((DataTable)bindingSource1.DataSource); 
} 

입니다.

0

나는 이것이 오래된 질문이라는 것을 알고 있지만 나에게 도움이되는 또 다른 해결책을 발견했다. 데이터 소스/바인딩 소스에서 항목을 삭제하기 전에 CellFormatting 이벤트에 대한 이벤트 핸들러의 연결을 해제 한 후 다시 연결하십시오. 예 :

RemoveHandler DataGridView1.CellFormatting, AddressOf DataGridView1_CellFormatting 
Me.BindingSource1.Remove(item) 
AddHandler DataGridView1.CellFormatting, AddressOf DataGridView1_CellFormatting 
0

동일한 문제가 있습니다. 나는 해결책을 찾았다. 모든 행을 다음 행에 복사하십시오. 그런 다음 dgv의 첫 번째 행을 제거하십시오. 이에 대한 예제 코드 : 같이

If Dgv.CurrentCell.RowIndex + 1 = Dgv.Rows.Count Then 
     For m = Dgv.Rows.Count - 2 To 0 Step -1 
      Dgv.Rows(m + 1).Cells(0).Value = Dgv.Rows(m).Cells(0).Value 
      Dgv.Rows(m + 1).Cells(1).Value = Dgv.Rows(m).Cells(1).Value 
      Dgv.Rows(m + 1).Cells(2).Value = Dgv.Rows(m).Cells(2).Value 
      Dgv.Rows(m + 1).Cells(3).Value = Dgv.Rows(m).Cells(3).Value 

     Next 
     Dgv.Rows.RemoveAt(0) 
     Exit Sub 
    End If 
    Dgv.Rows.Remove(Dgv.CurrentRow) 

그것을 :) 시도

2

는 마지막 행을 숨기려면 DataGridView에의 AllowUserToAddRows 속성을 변경 :

myDataGridView1.AllowUserToAddRows = false 
1

우선 단지의 재산을 해제 Datagridview

dataGridView1.AllowUserToAddRows = false; 

으로 변경 한 다음 원하는만큼 마지막 행을 제거하십시오. -1을 유지하여 for 루프로 반복합니다.

dataGridView1.Rows.RemoveAt(dataGridView1.Rows.Count - 1); 
dataGridView1.Rows.RemoveAt(dataGridView1.Rows.Count - 1); 
관련 문제