VB.Net 2010に6つのDataGridViewを備えたWinFormがあり、それぞれに独自のバインディングソースがあります。他のグリッドにあるものを制御するメインのDataGridViewがもう1つあります。これは、新しいレコードを追加できる唯一のグリッドです。他のすべてはプログラムで制御されます。メイングリッドバインディングソースは、オブジェクトの監視可能なコレクションにバインドされ、コレクションのクラスオブジェクトの1つに追加のバインディングソースが追加されます。
私の問題は、メイングリッドの新しい行をクリックすると、新しい単一クラスオブジェクトをインスタンス化することで想定どおりにすべてがクリアされることですが、グリッドからタブで移動したり、クリックしたりすると、 gridは、現在のアイテムをグリッドの最初のアイテムにリセットします。単一のオブジェクトバインディングソースを新しいインスタンス化されたオブジェクトに設定すると、コレクションの最初のアイテムもクリアされます。これは、監視可能なコレクションにバインドされたDataGridViewsを使用する他の画面では発生しません。私は何が欠けていますか?
グリッドクリック実装のサンプルコード
Private Sub dgvReports_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgvReports.CellClick
If e.RowIndex < 0 Or dgvReports.SelectedRows.Count < 0 Then
Exit Sub
End If
If Not dgvReports.Rows(e.RowIndex).IsNewRow Then
objReport = dgvReports.Rows(e.RowIndex).DataBoundItem
objReport.SerializeToDB()
intSelIndex = e.RowIndex
objReport = objReport.Deserialize()
If objReport.MsgObject.ErrMsg > "" Then
objReport.MsgObject.DisplayErrMsg()
End If
btnDelete.Enabled = True And Not blnReadOnly
Else
objReport = New RBL.Report
objReport.GlobalID = Guid.NewGuid.ToString
intSelIndex = e.RowIndex
btnDelete.Enabled = False
End If
' The following 3 lines of code causes the first record in grid to be reset
' but works in other implementations
'If objReport IsNot Nothing Then
'bsReport.DataSource = objReport
'End If
btnApply.Enabled = False
UpdateReportObjects()
End Sub
Private Sub UpdateReportObjects()
Dim objRprt As RBL.Report = Nothing
If dgvReports.SelectedRows.Count = 1 Then
objRprt = dgvReports.SelectedRows(0).DataBoundItem
End If
' Set all local observable collections to Report properties
If objReport.GlobalID = objRprt.GlobalID Then
RptFieldLst = objReport.ReportFields
RptTableLst = objReport.TableList
DisplayFieldLst = objReport.DisplayFields
SortFldLst = objReport.SortList
Else
' Instantiate new collections and set to new Report object properties
RptTableLst = New RBL.ReportTables()
RptFieldLst = New RBL.ReportFields()
DisplayFieldLst = New RBL.ReportFields()
NonDisplayFieldLst = New RBL.ReportFields()
SortFldLst = New RBL.ReportSortOrders()
objReport.TableList = RptTableLst
objReport.ReportFields = RptFieldLst
objReport.DisplayFields = DisplayFieldLst
objReport.SortList = SortFldLst
End If
End Sub