データグリッドビュー(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);
挙動
結果として、こうなりました。
おわりに
今回は、データテーブルを差し替えたあとでデータグリッドビューが表示されなくなる現象に対応しました。
原因追及はできていません。
非常に姑息的な方法で対処しています。
適正な対処法が見つかったら、コードを書き替えたいと思います。
関連記事
- [C#備忘録]dt.Reset後はDataGridViewのレコードが表示されない | AmpiTa Project
- [C#備忘録]2つのDataTableを紐づける | AmpiTa Project
- [C#備忘録]DataGridViewをXMLファイルへ反映 | AmpiTa Project
- [C#備忘録]XML・DataTable条件絞込・該当レコード指示 | AmpiTa Project
- [C#備忘録]複数のNumericUpDownから最適値を探す | AmpiTa Project
- [備忘録]PHP7.4⇒8.0 アップ … ウェブページのデータベース接続構文を変更 | AmpiTa Project
- [C#備忘録]高DPIへの対応(目標未達) | AmpiTa Project
- [C#備忘録]HTMLファイルでレポート | AmpiTa Project
- [C#備忘録]画像ファイル出力 | AmpiTa Project
- [C#備忘録]Excelファイルをインポート | AmpiTa Project