我在表單上實施了DataGridView
併成功實施VirtualMode
。這從本地緩存中檢索單元格數據,並且在填充網格/分頁等時全部顯示正常工作。我處理DataGridView.CellValueNeeded
事件以填充單元格。VirtualMode中的WinForms DataGridView何時調用AutoResizeColumn?
在DataGridView上,我將AutoSizeColumnsMode
屬性設置爲DataGridViewAutoSizeColumnsMode.DisplayedCells
。我注意到在使用VirtualMode時,在填充單元格後DataGridView看起來並不尊重AutoSizeColumnsMode。我已檢查了this article但未找到解決方案。
我最終會做的是不依靠AutoSizeColumnsMode
財產,而是調用.AutoResizeColumn()
方法地方來調整,所以我最初自動調整列,但隨後允許用戶調整。
我試圖用有限的或者沒有成功如下:
設置
DataGridView.AutoSizeColumnsMode
到.None
。然後在我的.CellValueNeeded
處理private void dataGridView_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e) { // ... Get cell value from cache dataGridView.AutoResizeColumn(e.ColumnIndex, DataGridViewAutoSizeColumnMode.DisplayedCells); }
這將引發
StackOverFlowException
大概是因爲它 多次提出.CellValueNeeded
。嘗試完全相同的事情,除了在
.CellFormatting
事件處理程序。得到了相同的StackOverFlowException
。嘗試與不
DataGridView.SuspendLayout/ResumeLayout
:private void dataGridView_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e) { // ... Get cell value from cache dataGridView.CellValueNeeded -= dataGridView_CellValueNeeded; dataGridView.AutoResizeColumn(e.ColumnIndex, DataGridViewAutoSizeColumnMode.DisplayedCells); dataGridView.CellValueNeeded += dataGridView_CellValueNeeded; }
這讓所有的空白單元格,所以沒有用。
這實際上是一個有些工作,是有原因的,我不明白:
private void dataGridView_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e) { // ... Get cell value from cache dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells; }
它正確地調整大小列,但它似乎很奇怪有反覆調用它需要每一個單元格的值。此外,我不能立即將它設置爲。無權之後,或將再次
StackOverFlowException
。因此,我不能允許用戶調整列的大小。如我在
.CellValueNeeded
處理文章中提到的調用.UpdateCellValue()
也會拋出StackOverFlowException
。
那麼,是否可以調用.AutoResizeColumn()
的地方,它不會提高.CellValueNeeded
直到溢出?由於#4似乎有能力執行autosize函數,所以好像我也可以從某處手動調用它。