- PR -

XMLファイルを読み込んだDataGridにおける「列」の型変換

投稿者投稿内容
tutida
会議室デビュー日: 2003/06/05
投稿数: 7
投稿日時: 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型の数字)を普通にソートできるようにするに

は、どうすればよいのでしょうか?

 よろしくお願いします。

  



なおこ(・∀・)
大ベテラン
会議室デビュー日: 2004/04/08
投稿数: 174
お住まい・勤務地: 東京都
投稿日時: 2005-09-13 10:12
お世話になります。

・XMLファイルのDTD
・XMLファイルを読み込んでDataTableに変換する部分のコード
・DataTableをソートする部分のコード

を見せていただけないでしょうか。
tutida
会議室デビュー日: 2003/06/05
投稿数: 7
投稿日時: 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のデータはすべて文字列扱い」という認識しかあ

りません。

 よろしくお願いします
なおこ(・∀・)
大ベテラン
会議室デビュー日: 2004/04/08
投稿数: 174
お住まい・勤務地: 東京都
投稿日時: 2005-09-13 12:50
お世話になります。

引用:
「データを指定した後に DataType を変更することはできません。」


との事ですので、
空っぽのDataTableを別に用意してやる方法しか、私は思いつきませんでした。

tutidaさんのを基にちょっと実験してみました。
■XML
コード:
<?xml  version="1.0" encoding="shift_jis" ?>
<root>
    <person>
        <name>AAA</name>
        <age>10</age>
    </person>
    <person>
        <name>BBB</name>
        <age>15</age>
    </person>
    <person>
        <name>CCC</name>
        <age>5</age>
    </person>
</root>


■実験したコード
コード:
DataSet ds = new DataSet("testds");

// データソースに XML のデータを読み込む。 
FileStream myFileStream = new FileStream(@"C:\\test.xml",System.IO.FileMode.Open); 
XmlTextReader myXmlReader = new XmlTextReader(myFileStream); 
// XML ファイルから読み込む 
ds.ReadXml(myXmlReader); 
myXmlReader.Close(); 

//データテーブルを取得
DataTable dt = ds.Tables[0]; 
// コピーを作成
DataTable testdt = dt.Clone();
testdt.Columns["age"].DataType = typeof (int);
DataRow[] rows = dt.Select();
foreach (DataRow r in rows)
{
	testdt.ImportRow(r);
}

// ソート
DataRow[] sortedrows = testdt.Select("" , "age");
foreach (DataRow sr in sortedrows)
{
	Console.WriteLine(sr[0].ToString() + ":" + sr[1].ToString());
}

tutida
会議室デビュー日: 2003/06/05
投稿数: 7
投稿日時: 2005-09-13 15:39
なおこ(・∀・)三、お返事有難うございます。

 提示していただいたコードを実装して、DataGridの「列」をクリックしてみたのですが、や

はりソートできませんでした。

(例)1〜30 → (結果)1,10,11,12.....19,2,20,21....29,3,30

 XMLファイルから要素を取出し、別クラスを作って、そこで型変換をしてDataGridに読み込ま

す方法をもちいてみます。

 ありがとうございました。
なおこ(・∀・)
大ベテラン
会議室デビュー日: 2004/04/08
投稿数: 174
お住まい・勤務地: 東京都
投稿日時: 2005-09-13 16:07
お世話になります。

引用:

tutidaさんの書き込み (2005-09-13 15:39) より:

 提示していただいたコードを実装して、DataGridの「列」をクリックしてみたのですが、や
はりソートできませんでした。

(例)1〜30 → (結果)1,10,11,12.....19,2,20,21....29,3,30


あれ?そうですか。
私も、1〜30のエレメントをXMLに追加して、
下のコードを実行し、ageヘッダをクリックしたら、ソートできましたよ?

※↑の私のコードの// ソート以降を書き換え
コード:
this.dataGrid1.DataSource = testdt;
this.dataGrid1.Refresh();

tutida
会議室デビュー日: 2003/06/05
投稿数: 7
投稿日時: 2005-09-13 16:54
失礼しました。下の方に、クローンする前のDataTableがDataSourceになってました。

 なおこ(・∀・)さんのアドバイスにより、無事ソートすることが出来ました。

 なるほど、クローンして列の型変換をするのか・・・。

 勉強になりました。有難う御座いました。
なおこ(・∀・)
大ベテラン
会議室デビュー日: 2004/04/08
投稿数: 174
お住まい・勤務地: 東京都
投稿日時: 2005-09-13 17:08
お世話になります。

引用:

tutidaさんの書き込み (2005-09-13 16:54) より:
無事ソートすることが出来ました。

なるほど、クローンして列の型変換をするのか・・・。


うまくいったようでよかったです。

Cloneして型変換というか、
DataTableにDataRowが存在する状態での、
DataColumnの型変換はできない、
空っぽだったらできます。
ということみたいですね。

# ImportRow実行時の暗黙的な型変換がまずいのであれば、
# foreachの中で、testdt.NewRow()でDataRowを作って、
# Addしてやるように変更するとかですかね。

スキルアップ/キャリアアップ(JOB@IT)