DataGridView - 列 Header 更改异常
DataGridView - Column Header Change Weirdness
所以我目前有一个表单,我在其加载事件中添加了动态数量的 TabPages 和 DataGridViews (DGV) - 每个 TabPage 1 个 DGV。我想为这些 DGV 处理某些事件,因此我还添加了处理程序。这是 Load 中的代码:
'Add a tab page and corresponding grid for each table in the data set
For i = 0 To binData.BinnedTables.Tables.Count - 1
Dim tabPage As C1.Win.C1Command.C1DockingTabPage = New C1.Win.C1Command.C1DockingTabPage
tabPage.Text = binData.BinnedTables.Tables(i).TableName
tabContent.TabPages.Add(tabPage)
dgvData = New DataGridView
AddHandler dgvData.DataBindingComplete, AddressOf dgvData_Created
With dgvData
.Dock = DockStyle.Fill
.AllowUserToOrderColumns = False
.AllowUserToAddRows = False
.AllowUserToDeleteRows = False
.DataSource = binData.BinnedTables.Tables(i)
.Columns.Add("Total", "Total")
.Columns("Total").ReadOnly = True
End With
tabPage.Controls.Add(dgvData)
'These following lines have to go after dgvData is added to tabPage because otherwise they don't work
dgvData.AutoResizeColumnHeadersHeight()
For Each col As DataGridViewColumn In dgvData.Columns
col.SortMode = DataGridViewColumnSortMode.NotSortable
col.ValueType = GetType(Integer)
Next
AddHandler dgvData.RowPostPaint, AddressOf MyDGV_RowPostPaint
AddHandler dgvData.KeyDown, AddressOf dgvData_KeyDown
AddHandler dgvData.CellValueChanged, AddressOf dgvData_CellChanged
AddHandler dgvData.CellEndEdit, AddressOf dgvData_CellEdit
AddHandler dgvData.CellValidating, AddressOf dgvData_CellValidating
AddHandler tabPage.TextChanged, AddressOf tabPage_TextChanged
AddHandler dgvData.ColumnHeaderMouseDoubleClick, AddressOf dgvData_ColumnHeaderMouseDoubleClick
AddHandler dgvData.ColumnHeaderCellChanged, AddressOf dgvData_ColumnHeaderTextChanged
Next 'DataTable In binData.BinnedTables.Tables
我使用 ColumnHeaderMouseDoubleClick 事件允许用户更改列 header 中的文本。我还想更新数据源中相应列的列名,以便它们同步。这就是我在 ColumnHeaderMouseDoubleClick 中的内容:
Dim renameCol As New dlgNewCol
renameCol.lblInsertCol.Text = "Rename Column"
If renameCol.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
Dim thisGrid As DataGridView = DirectCast(sender, DataGridView)
Dim thisCol As DataGridViewColumn = thisGrid.Columns(e.ColumnIndex)
thisCol.HeaderText = renameCol.txtColName.Text
'The index of the TabPage corresponds to the index of the table in the data source
binData.BinnedTables.Tables(tabContent.SelectedIndex).Columns(e.ColumnIndex - 1).ColumnName = thisCol.HeaderText
End If 'if dialog result is OK
不过,发生了什么,这是可行的,但是无论出于何种原因,header 被更改的列被移动到网格的末尾,加上一些其他属性被重置。
如果我注释掉更新作为 DGV 数据源的 table 的列名称的行,那么我不会遇到重置列属性的问题。但是,该源的列名称不会更新,因此它们不同步。仅将 table 作为数据源不会像更新实际数据那样自动更新列名。
我想我会使用 ColumnHeaderCellChanged 事件将这些属性更改回它们应该是什么,因为我希望上面的代码会触发它......但它不会。
所以我想我的问题是:为什么更改数据源的列名会产生这种效果(更改 DGV 列的属性)?为什么 ColumnHeaderCellChanged 事件没有触发?还有其他方法吗我可以设法同时更改 DGV 列的 header 和数据源的列名,并且让该列的其他属性保持原样(或放回)?
谢谢!
AutoGenerateColumns 似乎已打开。您需要将其关闭并手动添加列。
所以我目前有一个表单,我在其加载事件中添加了动态数量的 TabPages 和 DataGridViews (DGV) - 每个 TabPage 1 个 DGV。我想为这些 DGV 处理某些事件,因此我还添加了处理程序。这是 Load 中的代码:
'Add a tab page and corresponding grid for each table in the data set
For i = 0 To binData.BinnedTables.Tables.Count - 1
Dim tabPage As C1.Win.C1Command.C1DockingTabPage = New C1.Win.C1Command.C1DockingTabPage
tabPage.Text = binData.BinnedTables.Tables(i).TableName
tabContent.TabPages.Add(tabPage)
dgvData = New DataGridView
AddHandler dgvData.DataBindingComplete, AddressOf dgvData_Created
With dgvData
.Dock = DockStyle.Fill
.AllowUserToOrderColumns = False
.AllowUserToAddRows = False
.AllowUserToDeleteRows = False
.DataSource = binData.BinnedTables.Tables(i)
.Columns.Add("Total", "Total")
.Columns("Total").ReadOnly = True
End With
tabPage.Controls.Add(dgvData)
'These following lines have to go after dgvData is added to tabPage because otherwise they don't work
dgvData.AutoResizeColumnHeadersHeight()
For Each col As DataGridViewColumn In dgvData.Columns
col.SortMode = DataGridViewColumnSortMode.NotSortable
col.ValueType = GetType(Integer)
Next
AddHandler dgvData.RowPostPaint, AddressOf MyDGV_RowPostPaint
AddHandler dgvData.KeyDown, AddressOf dgvData_KeyDown
AddHandler dgvData.CellValueChanged, AddressOf dgvData_CellChanged
AddHandler dgvData.CellEndEdit, AddressOf dgvData_CellEdit
AddHandler dgvData.CellValidating, AddressOf dgvData_CellValidating
AddHandler tabPage.TextChanged, AddressOf tabPage_TextChanged
AddHandler dgvData.ColumnHeaderMouseDoubleClick, AddressOf dgvData_ColumnHeaderMouseDoubleClick
AddHandler dgvData.ColumnHeaderCellChanged, AddressOf dgvData_ColumnHeaderTextChanged
Next 'DataTable In binData.BinnedTables.Tables
我使用 ColumnHeaderMouseDoubleClick 事件允许用户更改列 header 中的文本。我还想更新数据源中相应列的列名,以便它们同步。这就是我在 ColumnHeaderMouseDoubleClick 中的内容:
Dim renameCol As New dlgNewCol
renameCol.lblInsertCol.Text = "Rename Column"
If renameCol.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
Dim thisGrid As DataGridView = DirectCast(sender, DataGridView)
Dim thisCol As DataGridViewColumn = thisGrid.Columns(e.ColumnIndex)
thisCol.HeaderText = renameCol.txtColName.Text
'The index of the TabPage corresponds to the index of the table in the data source
binData.BinnedTables.Tables(tabContent.SelectedIndex).Columns(e.ColumnIndex - 1).ColumnName = thisCol.HeaderText
End If 'if dialog result is OK
不过,发生了什么,这是可行的,但是无论出于何种原因,header 被更改的列被移动到网格的末尾,加上一些其他属性被重置。
如果我注释掉更新作为 DGV 数据源的 table 的列名称的行,那么我不会遇到重置列属性的问题。但是,该源的列名称不会更新,因此它们不同步。仅将 table 作为数据源不会像更新实际数据那样自动更新列名。
我想我会使用 ColumnHeaderCellChanged 事件将这些属性更改回它们应该是什么,因为我希望上面的代码会触发它......但它不会。
所以我想我的问题是:为什么更改数据源的列名会产生这种效果(更改 DGV 列的属性)?为什么 ColumnHeaderCellChanged 事件没有触发?还有其他方法吗我可以设法同时更改 DGV 列的 header 和数据源的列名,并且让该列的其他属性保持原样(或放回)?
谢谢!
AutoGenerateColumns 似乎已打开。您需要将其关闭并手动添加列。