2011-11-05 76 views
0

(使用.net 3.5) 我有一個datagridview綁定到對象列表和AllowUserToAddRows=True,但對象沒有空的構造函數。我想這是因爲電網的新排沒有出現。於是我處理的綁定源「AddingNew」事件以編程方式插入必要的構造器參數:Datagridview一次添加兩個新行

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功能,因爲顯示一個新行似乎比在屏幕上顯示「添加」&「刪除」按鈕更具視覺優雅,這就是爲什麼我想要通過這些問題的力量)

+0

您也可以考慮使用'CodeSelector' [裝飾](http://www.dofactory.com/Patterns/PatternDecorator.aspx)與參數的構造函數。 –

+0

好吧,因爲我設法通過處理bindingsource「AddingNew」來解決非空構造問題,所以我不認爲這是造成雙行創建的原因。我在我的問題中包含了這個片段,只是爲了全面披露,以防止它以某種無法預料的方式發揮作用。 – Tekito

+0

我明白了,我試着建議一種讓你再次使用模板行的方法。 –

回答

1

經過荒謬的時間花在與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