- - PR -
GridDataViewのDataSourceにセットした値の扱いについて
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-06-26 10:29
GridDataViewのDataSourceの扱いについて、
教えていただきたいことがあります。 Formに、GridDataViewを設置し、LoadイベントでDataSourceを設定しています。 Loadイベント Dim Conn as OleDbConnection Dim Adapter as OleDbDataAdapter Dim dset as DataSet 〜略〜 DataGridView.DataSource = dset.Tables("ほげほげ") このとき、Dimで宣言しているため、Conn,Adapter,dsetは、 Loadイベント終了時に破棄されます。 しかし、FormのGridDataViewを見ると、正常にテーブルが設定されています。 Conn,Adapter,dsetを、明示的にdisposeしているときでも、同様です。 ここで疑問に思うのですが、 DataSourceに設定された内容が保持されているのは、なぜだろう?です。 dset(DataSet)が解放されていますが、DataSourceに設定されている DataSetはどこかに保持されているのでしょうか? 参考サイトであったり、値渡しのため…などであれば、値渡しなことがわかる なにかしらの情報をご教授願えれば幸いです。 過去ログも調べてはみたのですが、わかりませんでした。 お願い致します。 | ||||||||
|
投稿日時: 2008-06-26 12:03
ここが誤っています。 参照が残っている場合はガベージコレクションの対象となりません。 DataGridView.DataSource に設定したことにより、 dset は Load を抜けても DataGridView 経由で参照できますから破棄されません。 Dispose に関しては、オブジェクトが使用しているアンマネージリソースを解放するものであって、 オブジェクトの破棄とは全く別の意味です。 | ||||||||
|
投稿日時: 2008-06-26 13:16
早速の回答ありがとうございます。
回答を受けて、Nothingでのテストも行ってみました。 DataGridView.DataSource = dset.Tables("ほげほげ") ・・・(A) dset = nothing ・・・(B) この場合でも、DataAGridViewには、テーブルが表示されております。 (A)によりdsetの参照数が0とはならないため、(B)のようにNothingを指定しても dsetは破棄されていないということなのでしょうか? バグのように見えてしまうのですが、ガベージコレクタがメモリ管理している .NETとしては、このようなDataSourceの指定方法は一般的なのでしょうか? (↑少し質問の意図がズレるかもしれませんが、併せて質問させてください) 【補足】 このプログラムについては、VB2005を使うにあたり、 プログラムの練習として、仮組しているものになります。 GridDataViewに指定されるDataSourceは、ユーザアクションにより変更されると 想定しているため、フォームデザイン時には指定していません。 的がズレた返答かもしれませんが、宜しくお願い致します。 | ||||||||
|
投稿日時: 2008-06-26 15:07
その通りです。
はい、普通だと思います。 DataSource に限らずですが、何らかのオブジェクトのプロパティに クラスのインスタンスを設定したいときに、ローカル変数としてクラスの変数を宣言して New して設定するというのはよく行われます。 ちなみに GridDataView ではなくて、DataGridView です。 | ||||||||
|
投稿日時: 2008-06-27 02:11
すみません。返答が遅くなりました。
誤字すみませんでした。 親切な回答、ありがとうございます。 参考にさせてもらって、これからも.NETの理解を進めていきたいと思います。 本件は、解決済みと致します。 (スレッドのステータス変更とかなさそう?ですので、本文にて解決済とします) |
1