删除其他行后 DataGridView 不显示第一行

DataGridView is not showing first row after removing other rows

我遇到了一个问题,我已经调试了几天。

一些上下文,我有一个应用程序,我在 xml 文件中存储数据(在下面的代码中 class Expediente)序列化。为了显示数据,我将其反序列化,然后创建一个数据表,用作数据网格的数据源。我添加了一个 datagridcheckbox 列来检查要删除的内容。

在数据网格中,我有一个工具条按钮,单击它会删除选中的 - 或在编辑模式下选中的行,因此行 CType(dgvr.Cells(0)。 GetEditedFormattedValue(dgvr.Index, DataGridViewDataErrorContexts.Commit), Boolean) = True- 数据源中的元素并将数据源持久化到 xml.

问题是,当反序列化 xml 并将其再次加载到数据表并将数据网格数据源绑定到它时,它会删除第一行。如果我关闭应用程序并打开它,第一行就会出现。

我已经调试并且在数据表中出现了正确的行数。此外,我已将问题缩小到绑定导航器,当它将其绑定源设置为数据表时,数据网格的第一行消失了。

我粘贴了一个简化版本的代码,如果需要我可以提供更多。 请注意,如果在 LoadGridExpedientes() 中,我注释行

navExpedientes.BindingSource = 无

navExpedientes.BindingSource = bs

第一行没有消失,但显然绑定导航器的计数器没有更新。

 Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim chk As New DataGridViewCheckBoxColumn()
    grdExpedientes.Columns.Add(chk)
    chk.HeaderText = ""
    chk.Name = "chk"
    'fills a datatable from an xml, it works ok, it fills it with the correct amount of rows
    Dim dt As DataTable = Sistema.getInstance.getDataExpedienteForGrid()
    Dim bs As New BindingSource
    bs.DataSource = dt

    grdExpedientes.DataSource = bs
    navExpedientes.BindingSource = bs

    For i As Integer = 0 To grdExpedientes.Rows.Count - 2
        grdExpedientes.Rows(i).Cells(0).Value = True
    Next        
End Sub

Private Sub LoadGridExpedientes()        
        grdExpedientes.DataSource = Nothing
        navExpedientes.BindingSource = Nothing
        grdExpedientes.Columns.Clear()
        grdExpedientes.Rows.Clear()
        'This is to know if there is already the checkbox column
        If Not (grdExpedientes.Columns.Count > 0 AndAlso grdExpedientes.Columns(0).Name = "chk") Then
            Dim chk As New DataGridViewCheckBoxColumn()
            grdExpedientes.Columns.Add(chk)
            chk.HeaderText = ""
            chk.Name = "chk"
        End If
        Dim dt As DataTable = Sistema.getInstance.getDataExpedienteForGrid()
        Dim bs As New BindingSource
        bs.DataSource = dt
        grdExpedientes.DataSource = bs
        navExpedientes.BindingSource = bs
    End Sub

Private Sub navExpedientesDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles navExpedientesDelete.Click
        For i As Integer = 0 To grdExpedientes.Rows.Count - 2
            Dim dgvr As DataGridViewRow = grdExpedientes.Rows(i)
            If CType(dgvr.Cells(0).Value, Boolean) = True Or _
              CType(dgvr.Cells(0).GetEditedFormattedValue(dgvr.Index, DataGridViewDataErrorContexts.Commit), Boolean) = True Then
                Dim draux As DataGridViewRow = dgvr
                Dim expABorrar As Expediente = CType((From elem As Expediente In Sistema.listExpedientes
                                             Where elem.Expediente = CType(draux.Cells("Expediente (Ficha)").Value, String)
                                             Select elem).FirstOrDefault, Expediente)
                Sistema.listExpedientes.Remove(expABorrar)
            End If
        Next
        If System.IO.File.Exists(Sistema.pathListExpedientes) Then
            System.IO.File.Delete(Sistema.pathListExpedientes)
        End If
        Dim sw As System.IO.TextWriter = New System.IO.StreamWriter(Sistema.rutaListaExpedientes, 0)
        Serializer(Of Expediente).Serialize(Sistema.listExpedientes, sw, New List(Of Type) From {GetType(Movimiento)})
        sw.Close()
        LoadGridExpedientes()
    End Sub

问题是我使用的是绑定导航器附带的删除工具条按钮,点击它时似乎 'embedded' 它删除了默认情况下选择的第一行.

我在绑定导航器中创建了一个新的工具条按钮,问题就解决了。我不知道为什么不更新绑定导航器绑定源也避免了第一行被删除。