.net Datagridview一次添加两个新行

.net Datagridview一次添加两个新行,.net,winforms,data-binding,datagridview,.net,Winforms,Data Binding,Datagridview,(使用.NET3.5) 我有一个datagridview,它绑定到一个对象列表,并且AllowUserToAddress=True,但是对象没有空构造函数。我想正因为如此,网格的新行没有出现。因此,我处理了绑定源“AddingNew”事件,以编程方式插入必要的构造函数参数: Private _Codes As BindingList(Of CodeSelector) Private WithEvents _bs As New BindingSource _Codes = New B

(使用.NET3.5) 我有一个datagridview,它绑定到一个对象列表,并且
AllowUserToAddress=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的AllowUserToAddress功能,因为在我看来,显示新行比在窗体上放置“Add”和“Remove”按钮等更美观,这就是我试图解决这些问题的原因)

在花费了大量时间与datagridview抗争之后,我终于偶然发现了一个似乎可行的答案。这实际上是在一个论坛上提出的,但我已经失去了链接。通过调用bindingsource CancelEdit,可以防止datagridview在幕后执行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

您还可以考虑使用一个无参数的构造函数来使用<代码> CodeSelector <代码>。既然我已经成功地处理了非空的构造问题,通过处理BIDENGORACK“AddieNew”,我不认为这就是导致双行创建的原因。我在我的问题中包含这段代码只是为了充分披露,以防它以某种无法预料的方式发生。我理解,我试图建议一种方法,使您能够再次使用模板行。