2013-08-14 5 views
0

현재 빈 또는 빈 DataGridview 셀을 숨기는 프로그램이 있습니다. 이 셀을 완전히 삭제하는 방법을 찾고 싶습니다. 그 이유는 공백의 셀이 숨겨진 후에 다른 일부 유효성 검사를 거친 후에 다시 나타납니다. 이러한 검증을 통해 셀에 음수, 숫자가 아닌 입력 및 빈 셀과 같은 잘못된 입력이 포함되어 있는지 확인했습니다. 위의 값 중 하나라도 포함하면 기본값으로 채워 지므로 숨겨진 셀이 다시 나타납니다. 다행히도 이러한 셀을 삭제하는 방법이 있다면 기본 데이터로 채워지는 변화를 느끼지 않을 것입니다. 나는 MSDN에서 아래의 코드를 찾았지만 doens't 어떤 이유로 든 제대로 작동하는 것 같습니다. 또한 DATABINDINGCOMPLETE 이벤트를 사용하고 있습니다. 이 상황에서 더 잘 작동하는 다른 이벤트가 있는지 확실하지 않습니다. 나는 당신이 줄 수있는 어떤 도움을 주셔서 감사합니다!가져 오기시 빈 datagridview 셀을 삭제하는 방법

Private Sub DataGridView1_DataBindingComplete(sender As Object, e As DataGridViewBindingCompleteEventArgs) Handles DataGridView1.DataBindingComplete 


    Dim i As Integer = 0 
    Dim mtCell As Integer = 0 
    For Each row As DataGridViewRow In DataGridView1.Rows 
     For j = 1 To row.Cells.Count -2 
      If row.Cells(j).Value Is DBNull.Value Then 
       mtCell += 1 
      End If 
     Next 
     If mtCell = row.Cells.Count Then 
      DataGridView1.Rows.RemoveAt(i) 
     End If 
     i += 1 
     mtCell = 0 
    Next 

end sub 

답변

1

코드에 여러 가지 문제가 있습니다. 여기서 당신은 아무 문제없이 작동합니다 개선 된 버전이 있습니다

Dim mtCell As Integer = 0 
Dim row As DataGridViewRow = New DataGridViewRow() 
For rowNo As Integer = DataGridView1.Rows.Count - 2 To 0 Step -1 
    row = DataGridView1.Rows(rowNo) 
    Try 
     For j = 0 To row.Cells.Count - 2 
      If row.Cells(j).Value Is Nothing OrElse row.Cells(j).Value Is DBNull.Value Then 
       mtCell += 1 
      End If 
     Next 
     If mtCell = row.Cells.Count - 1 Then 'I understand that you want to delete the row ONLY if all its cells are null 
      DataGridView1.Rows.RemoveAt(rowNo) 
     End If 
     mtCell = 0 
    Catch ex As Exception 
     Exit For 
    End Try 
Next rowNo 

우선,이 문제 (예를 방지하기 위해 삭제할 때 "뒤로"컬렉션을 반복하는 것이 좋습니다 : 3 행, 첫 번째 삭제 위치와 루프가 두 번째로 이동하지만 삭제 후 모든 행이 "위로 이동"하므로 두 번째 위치가 이제 세 번째 행으로 점령됩니다 -> 두 번째 행을 건너 뛰고 결과적으로 컬렉션). DBNull.Value은 매우 제한적입니다. 특정 조건에서 잘 작동하는지 확실하지 않지만 Nothing으로 보완하는 것이 좋습니다. For Each 루프에서 반복되는 항목에 영향을 줄 수는 없습니다 (보통 For은 아닙니다). 이 경우에는 간접적으로 영향을 미치지 만 정상적인 For 루프를 사용하는 것이 좋습니다. 행을 반복하고 있지만이 행을 삭제하는 것이 아니라 현재 행 번호와 반드시 관련이없는 카운터 (i)로 정의 된 행을 삭제하는 것이 좋습니다. 마지막으로 try...catch을 포함하여 (존재하지 않는 위치에 액세스하지 않도록) 확인하십시오.

+0

답변 해 주셔서 감사합니다. 나는 예외 범위를 벗어난 인덱스를 얻고 있는데 왜 그럴 수 없는지를 알 수있다. – stackexchange12

+0

@ stackexchange12 이것은 특정 상황에 적응해야하는 샘플 코드입니다. 어쨌든 이것은 매우 안전한 측면의 시나리오이며이 오류가 어디에서 발생할 수 있는지를 알 수 없습니다. 내가 생각할 수있는 유일한 옵션은 데이터를 전혀 포함하지 않는 DataGridview입니다. 컨트롤에 데이터가 포함되어 있는지 확인하고 오류가 발생한 행을 봅니다. – varocarbas

+0

예, 맞습니다. 대부분 내 Excel 워크 시트가 비어 있지만 내 선택 문 크기를 조정하지 않고 이러한 빈 행을 삭제하려면 노력하고있어. – stackexchange12

관련 문제