Я создал пользовательский элемент управления с 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. У меня был другой программист, который помог мне взглянуть на мой код, и я не мог понять это.Обратите внимание, что это происходит только в некоторых других таблицах в этом же проекте.