2015-09-25 90 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