2015-08-04 5 views
0

У моего datagridview есть столбец combobox, у combobox есть 2 значения. Давайте просто скажем «A» и «B» - значения.DataGridView Validating combobox selection

Когда данные загружаются в datagridview, значения столбцов пусты, количество строк не имеет значения, а только одна строка может иметь значение «A», и только 1 строка может иметь значение «B».

Я попробовал это в CellValidating случае

If e.ColumnIndex = 5 Then 
    For Each row As DataGridViewRow In dg.Rows 
     If row.Cells(5).Value = e.FormattedValue Then 
      e.Cancel = True 
      dg.Rows(e.RowIndex).ErrorText = "Invalid Value" 
     Else 
      dg.Rows(e.RowIndex).ErrorText = "" 
     End If 
    Next 
End If 

Я могу видеть, как это не работает, моя проблема в том, что я проверки каждой строки в том числе и я в настоящее время редактирования. Итак, как правильно проверить это?

ответ

0

Я не на рабочей станции, чтобы проверить это. Я думаю, вы должны использовать Value вместо FormattedValue. Вы также можете попробовать сделать это в событии CellValueChanged. Состояние MSDN: свойство Value является фактическим объектом данных, содержащимся в ячейке, тогда как FormattedValue является форматированным представлением этого объекта.

If e.ColumnIndex = 5 Then 
    Dim CurrValue as string = dg.rows(e.RowIndex).Cells(e.ColumnIndex).value.ToString 
    For Each row As DataGridViewRow In dg.Rows 
     If row.Cells(5).Value.ToString = CurrValue Then 
      e.Cancel = True 
      dg.Rows(e.RowIndex).ErrorText = "Invalid Value" 
     Else 
      dg.Rows(e.RowIndex).ErrorText = "" 
     End If 
    Next 
End If  
End Sub 
0

Вы можете создать функцию, которая подтверждает там не дублирует значение для конкретного столбца и вызывать его из в CellValidating обработчика событий. В этом случае вы будете называть его дважды (один раз для A и один раз для B).

Private Function DoesCellContainDuplicatedValue(ByVal intColumnToCheck As Integer, _ 
               ByVal intCurrentRow As Integer, _ 
               ByVal strValue As String) As Boolean 

    Dim bolCellContainsDuplicateValue As Boolean = False 

    Dim intCursor As Integer = 0 

    Do Until intCursor = DataGridView1.Rows.Count OrElse bolCellContainsDuplicateValue = True 

     'Don't check the old value for the cell we're checking.  
     If intCursor <> intCurrentRow AndAlso DataGridView1.Rows(intCursor).Cells(0).Value = strValue Then 

      bolCellContainsDuplicateValue = True 

     End If 

     intCursor += 1 

    Loop 

    Return bolCellContainsDuplicateValue 

End Function 

Затем в обработчике события:

Private Sub DataGridView1_CellValidating(sender As Object, e As DataGridViewCellValidatingEventArgs) Handles DataGridView1.CellValidating 

    If e.ColumnIndex = 5 AndAlso e.FormattedValue = "A" AndAlso DoesCellContainDuplicatedValue(5, e.RowIndex, "A") Then 

     e.Cancel = True 

     MsgBox("You cannot have more than one A value.") 

    End If 

    If e.ColumnIndex = 5 AndAlso e.FormattedValue = "B" AndAlso DoesCellContainDuplicatedValue(5, e.RowIndex, "B") Then 

     e.Cancel = True 

     MsgBox("You cannot have more than one B value.") 

    End If 

End Sub