トップ回答者
DataGridView の説明で出てくる「共有行」とは何ですか?

質問
-
下記ドキュメントを読んだのですが、「共有」という用語が頻繁に出てきます。
- Windows フォーム DataGridView コントロールを拡張するための推奨される手順
「共有」とはどういう働きのことを意味しているのでしょう?共有という言葉からは、
複数のものが何かを同時に所有するような意味しか思い浮かばないのですが。そして、「共有行」とは何でしょう?
ここを読め、という情報でも構いません。
Document Explorer で検索してもピタリな説明が見つかりません。
背景
---
VirtualMode = true の DataGridView で行の並べ替えを行っていると、
期待通りに動きません。中をのぞいてみると、
RemoveAtInternal() において SharedRow() が呼ばれています。
共有行?共有行って何?
回答
-
紹介されているページに、以下のように書かれています。
----- 引用開始 --------------
共有行を使用すると、DataGridView コントロールでメモリを効率的に使用できます。複数の行で DataGridViewRow クラスのインスタンスを共有すると、行の表示形式と動作に関する情報が最大限共有されます。
----- 引用終了 --------------
上に書かれているように、共有行とはDataGridViewRow クラスのインスタンスを共有している行ということでしょう。例えばデータバインドしている場合、データはデータソースから提供されますから、各行にデータを保持する必要がありません。したがって各行に必要なのは外観や動作に関する設定のみで済みます。通常、これらは各行で同じになります。同じであるにもかかわらず、各行に対応したDataGridViewRow クラスのインスタンスをそれぞれ作成するのはメモリの無駄です。よって、1つのDataGridViewRow クラスのインスタンスを各行で共有してしまおうという発想なのでしょう。
DataGridViewを描写する際には、この共有されたDataGridViewRowのインスタンスに設定された情報を元に、各行が描写されるのでしょう。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/- 回答としてマーク custar 2009年3月26日 4:29
すべての返信
-
紹介されているページに、以下のように書かれています。
----- 引用開始 --------------
共有行を使用すると、DataGridView コントロールでメモリを効率的に使用できます。複数の行で DataGridViewRow クラスのインスタンスを共有すると、行の表示形式と動作に関する情報が最大限共有されます。
----- 引用終了 --------------
上に書かれているように、共有行とはDataGridViewRow クラスのインスタンスを共有している行ということでしょう。例えばデータバインドしている場合、データはデータソースから提供されますから、各行にデータを保持する必要がありません。したがって各行に必要なのは外観や動作に関する設定のみで済みます。通常、これらは各行で同じになります。同じであるにもかかわらず、各行に対応したDataGridViewRow クラスのインスタンスをそれぞれ作成するのはメモリの無駄です。よって、1つのDataGridViewRow クラスのインスタンスを各行で共有してしまおうという発想なのでしょう。
DataGridViewを描写する際には、この共有されたDataGridViewRowのインスタンスに設定された情報を元に、各行が描写されるのでしょう。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/- 回答としてマーク custar 2009年3月26日 4:29
-
trapemiya さん、解説ありがとうございます。
概略分かりました。
今回、VirtualMode を切っ掛けにした DataGridView の行移動を試していたの
ですが、たった 1 行 "VirtualMode = true" を入れた途端に行移動ができなく
なることを確認しました。
共有行絡みと思っているのですが、行移動は可能であれば導入してみようと程
度だったので、今回は見送ることとしました。
trapemiya さん、ありがとうございました。
- Windows フォーム DataGridView コントロールでの仮想モード