2017-01-12 4 views
0

데이터 테이블에 연결된 Datagridview가 있습니다. 셀 값에 따라 행을 숨기거나 표시하고 싶습니다. 예를 들어 셀 값이 "N"이면 "Y"이면 행을 숨기고 행을 숨길 수 있습니다. 나는 또한 아래로있는 DataGridView의 CellValueChanged 이벤트 처리 한데이터 소스 변경시 Datagridview 업데이트

New DataColumn With {.ColumnName = "Rec", .AllowDBNull = False, .DefaultValue = "N", .DataType = GetType(String)} 

: 설치로

를 DataColumn은

Private Sub DataGridView1_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged 
    If CType(sender, DataGridView).Columns(e.ColumnIndex).HeaderText.Equals("Rec") Then 
     CType(sender, DataGridView).Rows(e.RowIndex).Visible = CType(sender, DataGridView).Item(e.ColumnIndex, e.RowIndex).Value.Equals("N") 
    End If 
End Sub 

을하지만 프로그래밍 방식으로 값을 "Y"로 변경 (때 그리드에서 값이 변경된 것을 볼 수 있습니다.) 행은 계속 표시됩니다. 나는 또한 이벤트 처리기 안에 휴식을 넣고 해고되지 않습니다! 그래서 질문, cellvalue를 "Y"로 변경하면 어떻게 datagridviewrow를 숨길 수 있습니까?

CType(DataGridView1.DataSource, DataTable).Item("Rec") = "Y" 

내가 직접 그리드를 업데이트하고, 따라서 해고 할 수

편집

그냥 손에서 문제를 좀 더 명확를 추가하려면 내가 프로그래밍 그리드의 데이터 소스를 업데이트하는 방법입니다 cellvaluechanged 이벤트가 발생하면 CurrencyManager 오류가 발생하므로 바인딩을 일시 중단 한 다음 셀 값이 업데이트 될 때마다 표에 대한 바인딩을 다시 시작해야합니다. 이는 작은 데이터 세트조차도 (심지어 리플렉션을 통해 구현 된 이중 버퍼링을 사용하는 경우에도) 달팽이의 속도에서도 작동합니다.

+0

'DataTable'에서 행을 제거하십시오. – Fabio

+0

데이터 테이블에서 행을 제거하면 더 이상 행을 업데이트하여 DataGridview에서 다시 볼 수 없게됩니다. – Nepaluz

+0

DataGridview에서 행을 숨기면 어떻게 셀 값을 다시 'N'으로 변경할 수 있습니까? – Fabio

답변

1

DataTable에 직접 바인딩하는 대신 DataTable을 BindingSource (컨트롤)에 바인딩 한 다음 그리드에 바인딩하십시오. 그런 다음 BindingSource의 이벤트를 사용하여 그리드의 변경 또는 프로그래밍 방식의 변경이 직접 데이터 테이블로 변경된 시점을 확인할 수 있습니다.

또는 데이터가 변경된시기를 결정하기 위해 연결할 수있는 DataTable에 의해 발생되는 이벤트가 있습니다. 당신은 당신이 업그레이드 된 세포에서 다음 단계에서 rowIndex에를 추출 cellvalue를 업데이트 할 때

0

당신과 함께 셀을 숨기 OK 어떤 것을 같은 : 내가 이런 짓을 테스트에 대한 그래서

DataGridView1.Rows.Item(rowindex).Visible = False 

:

DataGridView1(1, 2).Value = "Y" 
DataGridView1.Rows.Item(2).Visible = False 

및 작동합니다.

+0

네, 컨트롤을 직접 업데이트하는 것이 매우 효과적이지만 바인딩을 중지해야한다는 것보다 훨씬 느리다는 것을 내 원래의 질문 (및 편집)에서 확인하십시오. 반면 데이터 테이블을 업데이트하는 것은 매우 빠르지 만, 행이 전환되지 않습니다. – Nepaluz

0

맞아, 나는 내가 직면 한 문제가 내가 풀어 놓은 것보다 조금 더 복잡해 보인 것처럼 @ John0987의 제안을 부분적으로 사용하여이를 해결했다. 기본적으로 폼 과이드 부울 변수를 false로 초기화하고 부울을 true로 설정하고 행을 보이지 않게하기 전에 부울 검사를 CellValueChanged 이벤트에 추가 한 DataGridView의 DataBindingComplete 이벤트를 처리하는 해킹입니다. 이것은 지금까지 완벽하게 작동합니다.