Datagridview добавляя две новые строки одновременно - PullRequest
0 голосов
/ 05 ноября 2011

(используя .Net 3.5) У меня есть представление данных, которое связано со списком объектов и AllowUserToAddRows=True, но у объектов нет пустых конструкторов. Я думаю, что из-за этого новый ряд сетки не появился. Затем я обработал событие источника привязки «AddingNew», чтобы программно вставить необходимые аргументы конструктора:

 Private _Codes As BindingList(Of CodeSelector)
 Private WithEvents _bs As New BindingSource

    _Codes = New BindingList(Of CodeSelector)
    _bs.DataSource = _Codes
    _bs.AllowNew = True
    Me.dgvGraphs.DataSource = _bs


 Private Sub _bs_AddingNew(ByVal sender As Object, ByVal e As System.ComponentModel.AddingNewEventArgs) Handles _bs.AddingNew
    e.NewObject = New CodeSelector({default contructor arg's here})
End Sub

Итак, теперь новая строка появляется в представлении данных. Однако первый столбец является столбцом кнопки, и нажатие на ячейку кнопки новой строки, по-видимому, не вызывает новую строку. Затем я попытался обработать щелчок ячейки и заставить источник привязки создать новую строку:

Private Sub dgvGraphs_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvGraphs.CellClick
        Dim dgv = DirectCast(sender, DataGridView)
        If e.ColumnIndex = ColEdit.Index AndAlso e.RowIndex = dgv.NewRowIndex Then
            _bs.AddNew()
        End If
End Sub

Но теперь сетка данных создает ДВЕ новые строки, когда пользователь нажимает кнопку ячейки! Понятия не имею почему. Как я могу заставить представление данных создать только одну новую строку (т.е. добавить связанный объект), когда пользователь нажимает на ячейку кнопки новой строки?

(Кстати, мне очень нравится функция AllowUserToAddRows в datagridview, так как отображение новой строки кажется мне более наглядным, чем нажатие кнопок «Добавить» и «Удалить» на форме и т. через эти проблемы)

1 Ответ

1 голос
/ 06 ноября 2011

Хорошо, после абсурдного количества времени, потраченного на борьбу с сетью данных, я, наконец, наткнулся на то, что кажется подходящим решением. На самом деле это было предложено на форуме, но я потерял ссылку. Вызывая bindingsource CancelEdit, вы предотвращаете добавление AddNew, которое выполняет скрытое представление данных. У него все еще есть несколько причуд, но в целом все в порядке:

 Private Sub dgvGraphs_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvGraphs.CellClick
        Dim dgv = DirectCast(sender, DataGridView)
        If e.ColumnIndex = ColEdit.Index Then
            If e.RowIndex = dgv.NewRowIndex Then
                _bs.AddNew()
                _bs.CancelEdit()
            E 
        End If
End Sub
...