0

バックグラウンドワーカースレッド内でデータグリッドビューを反復処理してExcelエクスポートを作成するには、datagridviewを別のビューにコピーする必要がありました。

コピーは、エクスポート中にユーザーが元のデータグリッドビューに変更を加えることができるようにするために作成されました。

そこで、(プログラムで)新しいDataGridViewを作成し、元のDataTableのコピーを新しいDataGridViewのDataSourceプロパティに配置しました。ただし、フォームのControls(list)プロパティにdatagridviewを追加しない場合でも、RowCountは0に等しいことがわかりました...

誰かがこれを説明できますか?

注:DataTableのコピーは、Columnsのcopy()を含む新しいDataTableです。

4

2 に答える 2

2

これは非常に簡単です。DataGridView(またはその他のWinFormsまたはWpfコントロール)を作成したばかりの場合は、.Netでのみ作成されます。たとえば、そのために作成されたシステムウィンドウはありません。また、コントロールがこの状態にある間は、最適化の目的でバインディングを適用しません(視覚的なコントロールが見えないのに、なぜ何かを行う必要があるのですか?:))。コントロールを表示に追加するとフォームでは、コントロールのシステムウィンドウが作成され(つまり、Handleプロパティが初期化され)、期待どおりに動作を開始します。視覚的なコントロールを意図したとおりに機能させたいが、実際には表示したくない場合は、Handleプロパティを読み取る必要があります。これにより、制御はシステムウィンドウを作成し、完全に初期化します。また、WPFの場合、ウィンドウコントロールのハンドルしか取得できず、取得するには次のコードを使用する必要があるため、少し難しくなります。

public IntPtr GetWpfWindowHandle(Window w)
{
   var interopHelper = new WindowInteropHelper(w);
   return interopHelper.Handle;
}
于 2011-11-24T13:48:17.270 に答える
0

答えについては、この質問を参照してください。その場合、ハンドルを読み取るだけでは機能しませんでした。グリッドにBindingContextを割り当てる必要がありました。

于 2011-12-02T10:49:13.110 に答える