当数据网格失去焦点时,绑定源会更改当前项目

时间:2012-11-29 15:36:15

标签: vb.net winforms data-binding datagridview observablecollection

我在VB.Net 2010中有一个带有6个DataGridViews的WinForm,每个都有自己的绑定源。我有一个额外的主DataGridView控制其他网格中的内容。这是唯一允许添加新记录的网格。所有其他都以编程方式控制。主网格绑定源绑定到一个可观察的对象集合,并为集合中的一个类对象提供额外的绑定源。

我的问题是,当我点击主网格中的新行时,所有内容都会通过实例化一个新的单个类对象来清除,但是当我选中网格或单击或其他任何内容时,绑定网格源将其当前项重置为网格中的第一项。如果我将单个对象绑定源设置为新的实例化对象,它也会清除集合中的第一个项目。在我们使用绑定到可观察集合的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

1 个答案:

答案 0 :(得分:1)

已发现问题,并且像往常一样,手指指向自己。 DataSource用于可观察集合的绑定源和单个项目的绑定源,其中设置为相同的变量对象,即单个类对象。 问题解决了。