Datagridview добавляет две новые строки одновременно

#.net #winforms #data-binding #datagridview

#.net #winforms #привязка данных #datagridview

Вопрос:

(с использованием .Net 3.5) У меня есть datagridview, который привязан к списку объектов и 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
  

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

 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
  

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

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

Комментарии:

1.Вы также можете рассмотреть возможность использования CodeSelector декоратора с конструктором без параметров.

2. Ну, поскольку мне удалось решить проблему с непустой конструкцией, обработав bindingsource «AddingNew», я не думаю, что это является причиной создания двойной строки. Я включил этот фрагмент в свой вопрос только для полного раскрытия, на случай, если это каким-то непредвиденным образом имело значение.

3. Я понимаю, я пытался предложить способ, позволяющий вам снова использовать строку шаблона.

Ответ №1:

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

  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