.net Datagridview一次添加两个新行
(使用.NET3.5) 我有一个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
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”,我不认为这就是导致双行创建的原因。我在我的问题中包含这段代码只是为了充分披露,以防它以某种无法预料的方式发生。我理解,我试图建议一种方法,使您能够再次使用模板行。