- PR -

C# DataTableの列に独自の型を定義できますか

1
投稿者投稿内容
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2007-11-18 21:56
System.Data.Datatableの列に事前定義型よりも現実に近い制約を反映した型を定義したい時があります。

★質問
System.Data.Datatableの列にenum型あるいは独自の型を定義することが可能ですか?

定義例
・都道府県名
・月度(1〜12)性別(男、女、不明)
・試験の平均点(0.0〜100.0)
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2007-11-19 10:23
ドキュメントは見ましたか?
Add するときに 型 を指定するとかではなく?
http://msdn2.microsoft.com/ja-jp/library/system.data.datacolumncollection.add(VS.80).aspx
_________________
かるあ のメモスニペット
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2007-11-19 13:43
ご回答ありがとうございます。

 ご指摘の通り、Addメソッドで独自の型が指定できないので、質問した時点でダメな可能性が高いと思っていました。しかし、別の方法が準備されている可能性を考え、質問してみました。
 XMLスキーマがきめ細かく制約を記述できるので、Datatableにもそのような機能があるかも知れないと期待しました。例えばenumのような制約を的確に表現したいと思いました。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2007-11-19 14:07
あれ?僕が勘違いしているのかな?
http://msdn2.microsoft.com/ja-jp/library/730zyedy(VS.80).aspx
コード:

Dim table = New DataTable("table1")
table.Columns.Add("Col1", GetType(月度))
table.Columns.Add("Col2", GetType(性別))
table.Columns.Add("Col3", GetType(試験の平均点))

table.Rows.Add(月度.1月, 性別.男, New 試験の平均点(70))


とかじゃなくて??
データのバリデーションはここでやることかな?とも思うけれど。


_________________
かるあ のメモ
http://karua.at.webry.info/

[ メッセージ編集済み 編集者: かるあ 編集日時 2007-11-19 14:07 ]
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2007-11-19 20:36
ご回答ありがとうございます。
オリジナル型を格納することができました。(汚いソースコードですが...)

private void button1_Click(object sender, EventArgs e)
{
DataTable table1 = new DataTable("table1");
Test test1 = new Test(123);
// Test型の列を定義
table1.Columns.Add("Test", test1.GetType());
// Test型のデータを格納
table1.Rows.Add(new Test(123));
table1.Rows.Add(new Test(456));
table1.Rows.Add(new Test(789));
// 確認
// 出力 123 456 789 (確かに格納できている)
Test t1 = table1.Rows[0][0] as Test;
Test t2 = table1.Rows[1][0] as Test;
Test t3 = table1.Rows[2][0] as Test;
int a = t1.Value;
int b = t2.Value;
int c = t3.Value;
Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(c);
}

// オリジナル型
public class Test
{
public Test(int p)
{
_p = p;
}

private int _p;

public int Value
{
get { return _p; }
}
}
}
1

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