フォームに を実装DataGridViewし、 を正常に実装しましたVirtualMode。これにより、ローカルキャッシュからセルデータが取得され、グリッド/ページングなどにデータを入力するときにすべてが正しく機能しているように見えますDataGridView.CellValueNeeded。イベントを処理してセルにデータを入力します。
DataGridView で、AutoSizeColumnsModeプロパティを に設定していDataGridViewAutoSizeColumnsMode.DisplayedCellsます。VirtualMode を使用すると、セルにデータを入力した後、DataGridView が AutoSizeColumnsMode を尊重していないように見えることに気付きました。この記事を調べましたが、解決策が見つかりませんでした。
私が最終的にやりたいのは、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; }列のサイズを正しく変更しますが、必要なすべてのセル値に対して繰り返し呼び出す必要があるのは奇妙に思えます。また、すぐに .None に設定することはできません
StackOverFlowException。したがって、ユーザーが列のサイズを変更できるようにすることはできません。.UpdateCellValue()私のハンドラーからの記事で述べたように呼び出すと、同様に.CellValueNeededスローStackOverFlowExceptionされます。
では、オーバーフローするまで発生し.AutoResizeColumn()ない場所を呼び出すことは可能ですか? .CellValueNeeded#4には自動サイズ機能を実行する機能があるように見えるので、どこかから手動で呼び出すこともできるようです。