カテゴリー
Software Tech

[C#備忘録]dt.Reset後はDataGridViewのレコードが表示されない | AmpiTa Project

 データグリッドビュー(DataGridView)やデータテーブル(DataTable)は1つのデータベース専用で使う必要はありません。その時々で、何を表示させるかは任意に選択できて良いものです。

 データグリッドビュー(DataGridView)のデータソース(Datasource)として、あるデータテーブル(DataTable)に接続していたものをリセット(reset)して別のXMLファイルを呼び出してデータテーブルとし、それをデータグリッドビューに表示する、ということをしました。

 すると、レコードが表示されなかったので、その課題解決をします。




データ表示

 本来は下図のようにデータグリッドビューに、データテーブルの内容が表示されます。




故障中

 残念ながら、下図のようにカラム名は表示されるが、レコードが表示されない状態になりました。


 データテーブルにデータが格納されていることは確認できています。

 例えば下図で言うと、正常表示されたときのデータテーブルのレコード数は 97,284 個でした。


 表示されなかったデータテーブルのレコード数は 225,763 個でした。セル番号 [0,0] のデータを呼び出してみると、本来のものが存在しています。おそらく、データテーブルの格納処理は問題ないと思います。

 データグリッドビューは見た目通りのレコード数ゼロです。




コード

 データ表示の1回目は正常に表示されます。XMLファイルを呼出、データテーブルをつくり、データグリッドビューのデータソースとしてデータテーブルを紐づけます。

 コードは下記のようなものです。

dataTable_Sample.ReadXmlSchema(XML_File);
dataTable_Sample.ReadXml(XML_File);
dataGridView01.DataSource = dataTable_Sample;

 上記コードでは、XMLファイルを入れ替える際にカラム設定などがややこしそうなので、下記コードに書き換えています。

dataTable_Sample.Reset(); 
dataTable_Sample.ReadXmlSchema(XML_File);
dataTable_Sample.ReadXml(XML_File);
dataGridView01.DataSource = dataTable_Sample;
dataGridView01.AutoGenerateColumns = true;
dataGridView01.DataSource = null;
dataGridView01.DataSource = dataTable_Sample;

 前のデータテーブルの内容を抹消するのはリセット(Reset)です。これはクリア(Clear)や廃棄(Dispose)ではなくリセット(Reset)でないとカラム情報などが引き継がれてしまいます。

 空のデータテーブルにした後に ReadXml を使ってXMLファイルを読み込みます。

 データグリッドビューの AutoGenerateColumns は規定値が true なのでなくても良い行ですが、明示的にするために記述しています。列の自動作成の On/Off の指示です。

 データグリッドビューのデータソースは null を使って接続を解除しています。

 解除直後に、接続しています。

 その結果が、データグリッドビューゼロです。




偶然の発見

 カラム名は表示されるが、レコードが表示されないというデータグリッドビューをクリックしていたら、突然データが表示されました。

 ダブルクリックの影響かと思いましたが、何の指示も入っていないので違いました。

 private void dataGridView01_DoubleClick(object sender, EventArgs e) { }

 ほかに考えられるのは、カラム名のクリックです。すなわち、ソートです。

 下記のように、ソートのコードを追記したところ、上手くいきました。

 ソート指示に Asc と Desc があるのは、カラム名が前回と同じ場合に、既にソート済と判断されて何も起きないため、降順と昇順の切替を1度行うことで、無反応を回避しています。

dataTable_Sample.Reset(); 
dataTable_Sample.ReadXmlSchema(XML_File);
dataTable_Sample.ReadXml(XML_File);
dataGridView01.DataSource = dataTable_Sample;  
dataGridView01.AutoGenerateColumns = true;
dataGridView01.DataSource = null;
dataGridView01.DataSource = dataTable_Sample;
dataGridView01.Sort(dataGridView01.Columns["ID"], ListSortDirection.Descending);
dataGridView01.Sort(dataGridView01.Columns["ID"], ListSortDirection.Ascending);




挙動

 結果として、こうなりました。




おわりに

 今回は、データテーブルを差し替えたあとでデータグリッドビューが表示されなくなる現象に対応しました。

 原因追及はできていません。

 非常に姑息的な方法で対処しています。

 適正な対処法が見つかったら、コードを書き替えたいと思います。




関連記事