2009-08-07 15 views
1

DataTableから継承したクラスを作成しました。私はクラスから「名前」などのアイテムを公開する、「番号」DataTableの列を公開する方法

。ちょうどこのように

class MyClass : DataTable 
{ 
    [Column] 
    Name 

    [Column] 
    Number 
} 

私は[[Name "] =" some "のようにアクセスできます。

と私はCrystalレポートにデータソースとしてこのデータテーブルを使用する予定。これを達成するための方法

- (>オブジェクトおよび適切なクラスを選択して、これは私が設計時にCrystalレポートに追加することができます名前と番号が表示されますつまり、データメニュー - から>新しいデータソースを追加します)。

+0

強く型指定されたデータセットを作成しようとしていますか? –

+0

私はあなたのことを理解しているとは思わないが、あなたが言うことは、DataTableとDataRowのデフォルトの動作とどう違うのだろうか? –

+0

どの.NET Frameworkのバージョンを使用していますか? –

答えて

3

あなたは車輪の再発明されています。名前付き行/列を公開するDataTableを作成しようとすると、すでに.NET 2.0で行われているパターンになります。.NET 2.0を使用している場合は、MSDN tutorialを参照してください。あなたはまた、入力されたDataSetを使用して、キーワードStrong Typed DataSets

2

を使用して詳細については、Googleで検索することができ

は、これを行うための最善の方法です。しかし、あなたがこれを望まない、あるいはできないような状況がいくつかあります。たとえば、型付きのDataSetがサポートしていないnull可能な型のプロパティが必要な場合があります。 (入力されたDataSetでは、各NULL可能列もかなり陰惨である、Set<ColumnName>NullIs<ColumnName>Nullメソッドを持っています。)これらのケースでは

、あなたが入力したDataSetが取るアプローチとほとんど同じをしたい:サブクラスDataRowをして実装しますそこ特性、例えば:

public class MyDataRow : DataRow 
{ 
    public DateTime? SomeDate 
    { 
     get 
     { 
      return (this["SomeDate"] is DBNull) 
       ? (DateTime?)null 
       : this.Field<DateTime>("SomeDate"); 
     } 
     set 
     { 
      if (value == null) 
      { 
       this["SomeDate"] = DBNull.Value; 
      } 
      else 
      { 
       this["SomeDate"] = value; 
      } 
     } 
    } 
} 

は2つのことは、これを複雑にし、彼らが構築されているどのように新しい行としなければなりません。まず、あなたは基本コンストラクタを呼び出しMyDataTableでコンストラクタを実装する必要があります。

public MyDataRow(DataRowBuilder rb) : base(rb) { } 

セカンドを(これは紛らわしい部分です)、あなたもDataTableをサブクラス化し、NewRowFromBuilderメソッドをオーバーライドする必要があります。これはNewRow方法は、実際に(NewRow呼び出しNewRowFromBuilderため)MyDataRowオブジェクトのDataRowオブジェクトを返します。これを行わない場合は、NewRowDataRow返しNewRowFromBuilderの基本クラスの実装を呼び出します、そしてあなたはそれがMyDataRowを返却する必要があります。

public class MyDataTable : DataTable 
{ 
    protected override DataRow NewRowFromBuilder(DataRowBuilder builder) 
    { 
     return new MyDataRow(builder); 
    } 
} 

その後コードでこれらのオブジェクトを作成するために、あなたはこのようなものがあります:NewRowは常にタイプDataRowのオブジェクトを返しますので、あなたはまだ(NewRowからの戻り値をキャストする必要があり

MyDataTable t = new MyDataTable(); 
MyDataRow r = (MyDataRow) t.NewRow(); 

注意を)。

MyDataTableのイベントを処理する必要がある場合は、イベントハンドラをオーバーライドして、MyDataRowオブジェクトのイベントを発生させる必要があります。実際には、生成されたコードDataSetのコードを見て、これがどのように動作するかを確認する必要があります。