2011-10-18 23 views
3

。datagridviewに.xmlファイルのデータが移入されています。データはMyObjectのリストです。ここでMyObjectはC#クラスです。これは最初はスキーマなしで行われたので、タイプ情報はありません:(MyObjectクラスのboolなどの自動生成されたチェックボックス列の利点は得られません。 。の.xsdファイルには、素晴らしい見えますが、どのように私は好きアプリでこのの.xsdを展開、私はそれが私のアプリと同じディレクトリに座っていることを確認する必要がありますか、それをロードします:!xmlスキーマとデータをDataSet(とデータグリッドビュー)にロード

DataSet ds = new DataSet(); 
ds.ReadXml("mystuff.xml"); 
ds.ReadXmlSchema("myschema.xsd"); 
dataGridView_1.DataSource = ds; 
dataGridView_1.DataMember = "MyObject"; 

私は?これを処理するより良い方法があることは確かです...アセンブリの一部として何かを含めることができますか何か助けてくれてありがとう

答えて

5

強く型付けされたリソースにする

ファイルをプロジェクトに追加し、Build Actionに "Content"を付け、 "Do Not Copy"を付けます。次に、[リソース]デザイナタブ([プロパティ]フォルダまたは[プロジェクトプロパティ]ダイアログ)を開き、ファイルをリソースデザイナキャンバスにドラッグします。ファイルがアセンブリに埋め込まれました。これにより、デフォルトのResourcesクラスの強く型付けされたプロパティが生成され、その名前は元のファイルと同じ名前になります。

データセットにロードするには、StringReaderを接続します。それはReadXmlの動作を変更して、あなたはほとんど常に最初のスキーマをロードすることに注意してください:XmlReadModeについては

var ds = new DataSet(); 
using (var rdr = new StringReader(Properties.Resources.myschema)) 
{ 
    ds.ReadXmlSchema(rdr); 
} 
ds.ReadXml("mystuff.xml", XmlReadMode.IgnoreSchema); 

を使用すると、オプションのカップルを持っています。すでにロードされているものと異なるXMLファイルにインラインで定義されたスキーマがあるかどう彼らはあなたのデータはあなたのスキーマと一致しない場合に何が起こるかを指示し、何をすべきか:

  • XmlReadMode.ReadSchemaは、任意のインラインスキーマをインポートします既にロードされているスキーマと衝突しない限り長くしてください。名前の衝突がある場合、ReadXmlはスローします。または
  • XmlReadMode.IgnoreSchemaは、インラインスキーマを無視し、指定したスキーマに強制的にデータを強制しようとします。このモードでは、スキーマと一致しないデータはではなく、がデータセットになります。
  • XmlReadMode.InferSchemaはインラインスキーマを無視しますが、この場合、スキーマに準拠していないデータはスキーマを拡張させます。たとえば、XMLファイルにスキーマにないテーブルがある場合、そのテーブルはスキーマに追加され、インポートされます。異なるタイプの列間に名前の衝突がある場合、ReadXmlがスローします。あなたが最初ReadXmlを行う場合は、インラインスキーマ、またはInferSchemaモードがあるかどう存在しない場合は

、あなたは常にReadSchemaモードを取得します。それがあなたが望むものであっても、それについて明示するほうが良いです。

+0

ワウ。ころした。とても簡単。ありがとう!! – akevan

+0

readxml()の前にreadschema()を呼び出しても、XmlReadMode.IgnoreSchemaが動作しないようです。これは、上記の自分自身のコードを使用している場合に当てはまります。 XMLファイル内にありスキーマファイルにリストされていない要素は、サイレントにデータセットに追加されます。 – Canacourse

関連する問題