У меня есть DataGridView
на вторичном TabPage
, и я хотел бы, чтобы данные внутри сетки для обновления, когда TabPage
введен, но я не хочу RowEnter
событие, чтобы быть если пользователь фактически не нажал на строку. Кажется, что первая строка в сетке автоматически выбрана ПОСЛЕ погашения события TabPage.Enter
, поэтому у меня возникают проблемы с ее подавлением.Обновление DataGridView, но не выбрать ни одной строки, когда TabPage вошел
Код, показывающий проблему, приведен ниже. Я создал элементы управления во время выполнения, поэтому вы можете просто скопировать-вставить, но в реальной программе я использовал конструктор.
Поведение, которое я хотел бы видеть, заключается в том, что после выбора TabPage2
DataGridView
полна данных, но TextBox1
пуст, пока я не нажму на строку.
Public Class Form1
Private WithEvents DataGridView1 As DataGridView
Private WithEvents TextBox1 As TextBox
Private WithEvents TabPage2 As TabPage
Sub New()
' This call is required by the designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
'Add controls to the form (usually I use the designer to do this)
Dim TabPage1 As New TabPage() With {.Name = "TabPage1", .Text = "TabPage1"}
TabPage2 = New TabPage() With {.Name = "TabPage2", .Text = "TabPage2"}
DataGridView1 = New DataGridView With {.Name = "DataGridView1", .SelectionMode = DataGridViewSelectionMode.FullRowSelect, .MultiSelect = False, .ReadOnly = True, .AllowUserToAddRows = False, .Size = New Size(TabPage1.Size.Width, TabPage2.Size.Height - 40), .Anchor = AnchorStyles.Left Or AnchorStyles.Right Or AnchorStyles.Top Or AnchorStyles.Bottom, .TabIndex = 1}
TextBox1 = New TextBox With {.Name = "TextBox1", .Top = DataGridView1.Bottom + 5, .Width = DataGridView1.Width, .Visible = True, .Anchor = AnchorStyles.Left Or AnchorStyles.Right Or AnchorStyles.Bottom, .TabIndex = 0}
TabPage2.Controls.Add(TextBox1)
TabPage2.Controls.Add(DataGridView1)
Dim TabControl1 As New TabControl() With {.Name = "TabControl1"}
TabControl1.TabPages.Add(TabPage1)
TabControl1.TabPages.Add(TabPage2)
TabControl1.Size = Me.ClientRectangle.Size
TabControl1.Anchor = AnchorStyles.Left Or AnchorStyles.Right Or AnchorStyles.Top Or AnchorStyles.Bottom
Me.Controls.Add(TabControl1)
End Sub
Private Sub DataGridView1_RowEnter(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.RowEnter
'I would like the textbox to fill ONLY after the user has selected a row in DataGridView1.
'The problem I am having is that the first row auto-selects once I enter the tab
Dim drw As DataRow = DirectCast(DataGridView1.Rows(e.RowIndex).DataBoundItem, DataRowView).Row
TextBox1.Text = CStr(drw(1))
End Sub
Private Sub TabPage2_Enter(sender As Object, e As EventArgs) Handles TabPage2.Enter
RefreshGrid() 'Refresh the data in the list
End Sub
Sub RefreshGrid()
'simulate a database query
DataGridView1.DataSource = Nothing
Dim dtb As New DataTable
dtb.Columns.Add("C1")
dtb.Columns.Add("C2")
dtb.Rows.Add("1", "One")
dtb.Rows.Add("2", "Two")
dtb.Rows.Add("3", "Three")
dtb.Rows.Add("4", "Four")
dtb.Rows.Add("5", "Five")
DataGridView1.DataSource = dtb
End Sub
End Class
Когда вы выберете «TabPage», первый элемент управления в порядке табуляции на этой странице получит фокус. Если ваша сетка является первым элементом управления, она получит фокус. Если это единственный элемент управления, у вас нет выбора, кроме как для получения фокуса. – jmcilhinney
ОК, я обновил для установки '.TabIndex' для каждого элемента управления, но проблема все еще возникает. Я не думаю, что «DataGridView» изменяет выбранную строку, когда получает фокус. Я думаю, что «DataGridView» устанавливает выбор при инициализации. (Фактически, сама вкладка TabPage сохраняет фокус при нажатии на нее) – SSS
Это зависит от того, что вы подразумеваете под «выбранным». В элементе управления «DataGridView» выбранный на самом деле означает, что он выделен и не имеет ничего общего с каким-либо событием «RowEnter». 'RowEnter' будет только поднят, когда строка станет текущей строкой, то есть строкой, которая содержит текущую ячейку. Можно установить 'CurrentCell' в' Nothing', и он останется 'Nothing', пока сетка не станет фокусом. – jmcilhinney