その後、色々試してみて まだ部分的に切り出した実験コードレベルですが 質問で意図した動作はほぼ達成出来たと思われます ・型付データセットを作成 ・必要な列を追加 ・DefaultValueをString列はString.Empty、Boolean列はfalseに設定・・・(※1) ・スキーマを含めずWriteXmlで書き出す前に以下のようにDBNullを空文字やfalseに置換・・・(※2) for (int i = 0; i <= ds.Tables[0].Columns.Count - 1; i++) { for (int j = 0; j <= ds.Tables[0].Rows.Count - 1; j++) { if (ds.Tables[0].Columns[i].DataType.ToString() == "System.String") { if (ds.Tables[0].Rows[j][i] == DBNull.Value) { ds.Tables[0].Rows[j][i] = String.Empty; } } if (ds.Tables[0].Columns[i].DataType.ToString() == "System.Boolean") { if (ds.Tables[0].Rows[j][i] == DBNull.Value) { ds.Tables[0].Rows[j][i] = false; } } } } この手順で、 読み込むxmlに抜けた要素がある場合も DataGridViewを手書き/コードから編集、あるいは新規行を追加した場合も 目的の動作になることを確認しました 動作自体はうまくいったのですが 少々疑問に思う所もありまして ※1は、コード中で以下のように初期値を設定しているのですが ds.Tables[0].Columns["Name"].DefaultValue = String.Empty; 同じことを型付データセットを作るデザイナーのプロパティから 設定する方法はあるのでしょうか? String.Empty,、<String.Empty>など試してみましたが 空文字にならず、そのままString.Emptyや<String.Empty>という文字列がDataGridViewに表示されてしまいました コードから設定すれば済む事ですが、気になったので ※2は、 列の型判定についてです 最初、以下のコードで型判定できると思ったのですが if (ds.Tables[0].Columns[i].DataType is System.String) VisualStudioのエディターで緑波線がついて 「式は指定された型’string’ではありません」 とあり、実際に正しく判定されませんでした それで、ToString()でキャストした後、文字列として判定する方法に変更した所うまくいきました 最初のコードがダメな理由がわかりません ■No87091 (WebSurfer さん) に返信 > (1) SQL Server の Microsoft のサンプルデータベースの Northwind の Products テーブルか > ら以下のクエリを使ってインラインスキーマ付きの xml を生成。 すいません、この手順がわからないのですが これはVisualStudioで行う操作なのでしょうか? SQLは全く触ったことが無いもので・・・
- Child Tree -