2015-09-25 128 views
0

因此,我目前有一个窗体,其Load事件中添加了一个动态数量的TabPages和DataGridView(DGV) - 每个TabPage有1个DGV。我想处理这些DGV的某些事件,所以我还添加了处理程序。这是在加载代码:DataGridView - 列标题更改奇怪

'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事件来允许用户更改列标题的文本。我也想更新数据源中相应列的列名,以便它们同步。这是我在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 

会发生什么,不过,是这个工程,但随后无论出于何种原因,其标题改为被移动到网格的最后一列,再加上一些其他属性得到复位。

如果我注释掉行来更新作为DGV数据源的表的列名,那么我没有将列属性重置的问题。但是,该源的列名不会更新,因此它们不同步。只是将表格作为数据源不会自动更新列名,就像实际的数据一样。

我想我会使用ColumnHeaderCellChanged事件来改变这些属性回到他们应该是什么,因为我期望上面的代码会触发....但它不会。

所以我想我的问题是:为什么更改数据源的列名具有这种效果(改变DGV的列的属性)?,为什么ColumnHeaderCellChanged事件不会触发?还有一些其他方式可以设法更改DGV列的标题和数据源的列名称,还可以让该列的其他属性保持原样(或放回)?

谢谢!

回答

0

看起来像AutoGenerateColumns已打开。您需要关闭它并手动添加列。

+0

哇 - 我永远不会想到AutoGenerateColumns!虽然这并没有回答为什么ColumnHeaderCellChanged事件没有触发的问题,但它确实告诉我需要知道如何解决这个问题,所以我将其标记为已回答。我所做的是在ColumnHeaderMouseDoubleClick事件中将AutoGenerateColumns设置为False,如果对话结果为OK。事实证明,这样做的工作除了吹出该列的值。所以我必须保存这些值(在一个数组中),然后更改数据源的列名,然后将值放回。但是,这是诀窍!谢谢! – Andarta