2013-12-13 4 views
1

У меня есть datagridview, которое обновляется при обновлении источника привязок. После последней строки, содержащей фактические данные, должна быть пустая строка. Если пользователь выбирает ячейку в этой строке, они должны иметь возможность вводить данные в эту ячейку (как если бы это было текстовое поле).Как отредактировать ячейку в Datagridview, привязанную к источнику связывания

Я установил свойство AllowUserToAddRows для datagridview в "true"; это добавляет пустую строку после последней строки с данными. Однако, когда пользователь нажимает на строку, ячейки заполняются значением по умолчанию для поля (ноль, в моем случае).

Поскольку свойства, которыми я привязывал столбцы datagridview, имеют тип double, кажется, что я не могу отображать любые числовые значения.

Итак, во-первых, можно ли оставить ячейки пустыми или отобразить пустую строку при нажатии. Во-вторых, как я могу позволить пользователю вводить данные в определенные ячейки?

ответ

1

Попробуйте использовать событие CellFormatting:

Private Sub dgv_CellFormatting(sender As Object, _ 
           e As DataGridViewCellFormattingEventArgs) _ 
           Handles dgv.CellFormatting 
    If (e.ColumnIndex = 0) Then 
    If e.Value IsNot Nothing AndAlso DirectCast(e.Value, Double) = 0 Then 
     e.Value = String.Empty 
     e.FormattingApplied = True 
    End If 
    End If 
End Sub 

Двойной тип не подходит для сравнения. Вместо этого рассмотрите использование десятичного типа.


Попытка сохранить клетки «пустой» для новой строки, пока они не были «прикоснулся» пользователь требует взлома вокруг с флагом на каждой ячейке новой строки, поэтому здесь приведен пример использования тега имущество:

Dim rowEditing As Integer = -1 

Private Sub dgv_RowEnter(sender As Object, _ 
         e As DataGridViewCellEventArgs) _ 
         Handles dgv.RowEnter 
    If e.RowIndex = dgv.NewRowIndex Then 
    rowEditing = e.RowIndex 
    For i As Integer = 0 To dgv.Columns.Count - 1 
     dgv.Rows(rowEditing).Cells(i).Tag = "tagged" 
    Next 
    End If 
End Sub 

Private Sub dgv_RowLeave(sender As Object, _ 
         e As DataGridViewCellEventArgs) _ 
         Handles dgv.RowLeave 
    If rowEditing > -1 Then 
    For i As Integer = 0 To dgv.Columns.Count - 1 
     dgv.Rows(rowEditing).Cells(i).Tag = String.Empty 
    Next 
    rowEditing = -1 
    End If 
End Sub 

Private Sub dgv_CellEndEdit(sender As Object, _ 
          e As DataGridViewCellEventArgs) _ 
          Handles dgv.CellEndEdit 
    If e.RowIndex = rowEditing AndAlso e.ColumnIndex = 1 Then 
    dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Tag = String.Empty 
    End If 
End Sub 

Private Sub dgv_CellFormatting(sender As Object, _ 
           e As DataGridViewCellFormattingEventArgs) _ 
           Handles dgv.CellFormatting 
    If e.RowIndex = rowEditing AndAlso e.ColumnIndex = 1 Then 
    If dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Tag IsNot Nothing AndAlso _ 
     dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Tag = "tagged" Then 
     If e.Value IsNot Nothing Then 
     e.Value = String.Empty 
     e.FormattingApplied = True 
     End If 
    End If 
    End If 
End Sub 

Этот пример просто проверяет второй столбец с типом Double.

+0

Это все еще не позволяет пользователю вводить данные в эту ячейку datagridview. –

+0

@BernoulliLizard Итак, вы хотите отобразить значение нуля только после того, как пользователь вводит нуль? – LarsTech

+0

Да. Должно быть n строк данных со значениями во всех ячейках (в зависимости от количества данных). Внизу должна быть «лишняя» строка, которая не имеет значений. Пользователь должен иметь возможность вводить данные в ячейку в последней строке, чтобы я мог читать введенное значение и добавлять его в bindingshorce. –