DataGridView: CellEnter не отображает правильный RowCount - PullRequest
0 голосов
/ 19 февраля 2019

Я создал пользовательский элемент управления с datagridview и меткой, которая отображает количество строк.В некоторых проектах, в которых я использовал элемент управления, у меня возникла проблема с событием CellEnter, когда оно не отображает правильное количество строк.Я поместил label.text в событие CellEnter, чтобы значение метки могло изменяться в зависимости от введенной ячейки.

В одном из моих проектов у меня есть кнопки, которые работают как вкладки.Когда форма загружается, она добавляет новый элемент управления и заполняет данные.Когда кнопка нажата, она удалит существующий элемент управления и добавит новый элемент управления (я сделал это, потому что по какой-то причине столбец из предыдущей таблицы остается в dgv, даже если я уже очистил datatable и установил источник данных на ничего).Для некоторых таблиц, которые я связал с сеткой данных, счетчик строк на экране CellEnter 2 (разрешить добавление строки установлен в значение true), где, как в DataSourceChange или CellValidating, он показывает правильный номер (например, 664).Это происходит только при первой загрузке, когда она перемещается в другую ячейку, она показывает правильное значение.

Итак, вот последовательность при первой загрузке формы:1. CellEnter (количество строк = 2)2. DataSourceChanged (количество строк = 664)3. CellValidating (количество строк = 664)4. CellEnter (количество строк = 2)

Нажмите кнопку, которая загружает ту же таблицу, что и при первой загрузке формы:1. CellEnter (количество строк = 2)2. DataSourceChanged (количество строк = 664)

Я пытался использовать количество строк на основе значения, которое я получаю из DataSourceChange, но оно испортит значение метки, если записи будут удалены или добавлены.Также пытались переместить метку в CellValidating, но она не всегда отображает правильную строку (например: щелкните ячейку 664 и перейдите в ячейку 659, метка все еще отображает 664).Если добавить dgv1.dgvEditor.CurrentCell = dgv1.dgvEditor.Item("TAG_CODE", 1) к PopulateCodesGrid, он будет отображать правильную метку, но при изменении строки на 0 он получит 1 из 1.

Private Sub dgvEditor_CellEnter(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvEditor.CellEnter
    If AllowUserToAddRow Then
        If dgvEditor.CurrentCell.RowIndex = dgvEditor.Rows(dgvEditor.NewRowIndex).Index Then
            NewRowIndex = dgvEditor.CurrentCell.RowIndex
            lblDataNav.Text = dgvEditor.CurrentCell.RowIndex + 1 & " of " & dgvEditor.RowCount
        ElseIf NewRowIndex <> -1 Then
            lblDataNav.Text = dgvEditor.CurrentCell.RowIndex + 1 & " of " & dgvEditor.RowCount - 1
        Else
            lblDataNav.Text = dgvEditor.CurrentCell.RowIndex + 1 & " of " & dgvEditor.RowCount - 1
        End If
    Else
        lblDataNav.Text = dgvEditor.CurrentCell.RowIndex + 1 & " of " & dgvEditor.RowCount
    End If
End Sub


Private Sub SystemAdminForm_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    dgv1 = New SQLTableEditor.ctlTableEditor
    Me.Controls.Add(dgv1)
    dgv1.BringToFront()

    dgv1.Visible = True
    dgv1.Location = New Point(25, 115)
    dgv1.Size = New Size(722, 550)
    dgv1.HeaderLabelVisible = False
    dgv1.DataNavigatorVisible = True

    PopulateCodesGrid()
End Sub

Private Sub CodesTab_Click(sender As System.Object, e As System.EventArgs) Handles CodesTab.Click
    'Button click
    If (dgv1 IsNot Nothing) AndAlso (Not dgv1.IsDisposed) Then dgv1.Dispose()

        Dim btn As Button = DirectCast(sender, Button)
        Select Case btn.Name
            Case "CodesTab"
                dgv1 = New SQLTableEditor.ctlTableEditor
                Me.Controls.Add(dgv1)
                dgv1.BringToFront()

                dgv1.Visible = True
                dgv1.Location = New Point(25, 115)
                dgv1.Size = New Size(722, 550)
                dgv1.HeaderLabelVisible = False
                dgv1.DataNavigatorVisible = True

                PopulateCodesGrid()
End Sub

Private Sub PopulateCodesGrid()
    Try

        Using connection As New SqlClient.SqlConnection(MAIN_CONN)
            connection.Open()
            Using dAdapt As New SqlClient.SqlDataAdapter("spGetCodes", connection)

                Dim colCategory = New DataGridViewComboBoxColumn
                colCategory.DataPropertyName = "CATEGORY"
                colCategory.HeaderText = "Category"
                colCategory.Name = "CATEGORY"
                colCategory.Width = 150
                colCategory.SortMode = DataGridViewColumnSortMode.Automatic
                For Each item In viewModel.DefectCategoryDropDownList
                    colCategory.Items.Add(item.Value)
                Next

                dgv1.dgvEditor.Columns.Add(colCategory)

                dgv1.AllowUserToAddRow = True
                dgv1.AllowUpdateEditRecord = True
                dgv1.AllowUserToDeleteRow = False
                dgv1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells

                dAdapt.Fill(dgv1.dTable)
                dgv1.BindingSrc.DataSource = dgv1.dTable
                dgv1.dgvEditor.DataSource = dgv1.BindingSrc

                dgv1.dgvEditor.Columns("TAG_CODE").DisplayIndex = 0
                dgv1.dgvEditor.Columns("TAG_CODE").HeaderText = "CODE"
                dgv1.dgvEditor.Columns("TAG_CODE").ReadOnly = True
                dgv1.dgvEditor.Columns("PROBLEM").DisplayIndex = 1
                dgv1.dgvEditor.Columns("PROBLEM").HeaderText = "Description"
                dgv1.dgvEditor.Columns("CATEGORY").DisplayIndex = 2
                dgv1.dgvEditor.Columns("INACTIVE_DATE").DisplayIndex = 3
                dgv1.dgvEditor.Columns("INACTIVE_DATE").HeaderText = "Inactive Date"

                RemoveHandler dgv1.InsertRecord, AddressOf RTCodesInsertRecord
                RemoveHandler dgv1.UpdateRecord, AddressOf RTCodesUpdateRecord
                RemoveHandler dgv1.CellDefaultValue, AddressOf CellDefaultValue
                RemoveHandler dgv1.CellClick, AddressOf DGV1CellClickEvent

                AddHandler dgv1.InsertRecord, AddressOf RTCodesInsertRecord
                AddHandler dgv1.UpdateRecord, AddressOf RTCodesUpdateRecord
                AddHandler dgv1.CellDefaultValue, AddressOf CellDefaultValue
                AddHandler dgv1.CellClick, AddressOf DGV1CellClickEvent

            End Using
        End Using

    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try

Я ожидал, что количество строк в CellEnter будет равно 664, а не 2. У меня был другой программист, который помог мне взглянуть на мой код, и я не мог понять это.Обратите внимание, что это происходит только в некоторых других таблицах в этом же проекте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...