- - PR -
XMLファイルを読み込んだDataGridにおける「列」の型変換
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-09-12 23:19
先日XMLファイルを用いてSystem.Windows.FormsのDataGrid上にデータを表示しするものを
作り、「年齢」の格納されてる「列」を昇降順のソートにかけたところ、うまくソートされず、 上一桁(23なら2)でソートされてしまします。 たぶんXMLファイルのデータであるため、「年齢」のデータがstring型になっていることが邪 魔しているものと思われるのですが、 DataColumnCollection dcc = dt.Columns;//「列」を取得 dcc[(列番号等)].DataType = Type.GetType("System.Int16"); をどこにもっていても、 「データを指定した後に DataType を変更することはできません。」 のエラーが出てしまいます。 XMLファイルから読み込んだデータ(string型の数字)を普通にソートできるようにするに は、どうすればよいのでしょうか? よろしくお願いします。 | ||||||||||||
|
投稿日時: 2005-09-13 10:12
お世話になります。
・XMLファイルのDTD ・XMLファイルを読み込んでDataTableに変換する部分のコード ・DataTableをソートする部分のコード を見せていただけないでしょうか。 | ||||||||||||
|
投稿日時: 2005-09-13 11:51
なおこ(・∀・)さん、お返事有難う御座います。
Form1クラスのコンストラクタには // ロードする前に、データセットをクリアする。 this.dataSet1.Clear(); // データソースに XML のデータを読み込む。 FileStream myFileStream = new FileStream("C:/test.xml",System.IO.FileMode.Open); XmlTextReader myXmlReader = new XmlTextReader(myFileStream); // XML ファイルから読み込む this.dataSet1.ReadXml(myXmlReader); myXmlReader.Close(); //「データテーブル」を取得し、「列」を取得 DataTable dt = dataSet1.Tables[0];//データテーブルを取得 DataColumnCollection dcc = dt.Columns;//「列」を取得 dcc["年齢"].DataType = Type.GetType("System.Int16"); と記述しています。 ・XMLファイルのDTD.....書いていません。記入しなくとも、DataColumnのDataTypeプロ パティの操作で、string型をint型に変換できるであろうとおもったからです。 ・DataTableをソートする部分のコード .....「年齢」を昇降順等にソートするだけなの で、DataGridのAllowSortingプロパティをtrueにしただけです XMLに関しては、かじっただけで、「XMLのデータはすべて文字列扱い」という認識しかあ りません。 よろしくお願いします | ||||||||||||
|
投稿日時: 2005-09-13 12:50
お世話になります。
との事ですので、 空っぽのDataTableを別に用意してやる方法しか、私は思いつきませんでした。 tutidaさんのを基にちょっと実験してみました。 ■XML
■実験したコード
| ||||||||||||
|
投稿日時: 2005-09-13 15:39
なおこ(・∀・)三、お返事有難うございます。
提示していただいたコードを実装して、DataGridの「列」をクリックしてみたのですが、や はりソートできませんでした。 (例)1〜30 → (結果)1,10,11,12.....19,2,20,21....29,3,30 XMLファイルから要素を取出し、別クラスを作って、そこで型変換をしてDataGridに読み込ま す方法をもちいてみます。 ありがとうございました。 | ||||||||||||
|
投稿日時: 2005-09-13 16:07
お世話になります。
あれ?そうですか。 私も、1〜30のエレメントをXMLに追加して、 下のコードを実行し、ageヘッダをクリックしたら、ソートできましたよ? ※↑の私のコードの// ソート以降を書き換え
| ||||||||||||
|
投稿日時: 2005-09-13 16:54
失礼しました。下の方に、クローンする前のDataTableがDataSourceになってました。
なおこ(・∀・)さんのアドバイスにより、無事ソートすることが出来ました。 なるほど、クローンして列の型変換をするのか・・・。 勉強になりました。有難う御座いました。 | ||||||||||||
|
投稿日時: 2005-09-13 17:08
お世話になります。
うまくいったようでよかったです。 Cloneして型変換というか、 DataTableにDataRowが存在する状態での、 DataColumnの型変換はできない、 空っぽだったらできます。 ということみたいですね。 # ImportRow実行時の暗黙的な型変換がまずいのであれば、 # foreachの中で、testdt.NewRow()でDataRowを作って、 # Addしてやるように変更するとかですかね。 |