【发布时间】:2011-12-22 18:25:06
【问题描述】:
(使用 .Net 3.5)
我有一个绑定到对象列表和AllowUserToAddRows=True 的datagridview,但对象没有空构造函数。我认为因为网格的新行没有出现。然后我处理了绑定源“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 功能,因为在我看来,显示新行比在表单上放置“添加”和“删除”按钮等在视觉上更优雅,这就是为什么我要努力通过这些问题)
【问题讨论】:
-
您也可以考虑将
CodeSelectordecorator 与无参数构造函数一起使用。 -
好吧,因为我已经通过处理绑定源“AddingNew”设法克服了非空构造函数问题,我认为这不是导致双行创建的原因。我在我的问题中包含了这个 sn-p 只是为了全面披露,以防它以某种不可预见的方式发生。
-
我明白了,我试图建议一种方法,使您能够再次使用模板行。
标签: .net winforms data-binding datagridview