6

たとえば、IsCheapest というプロパティを持つカスタム DataRow を作成したいと思います。

public class RateDataRow : DataRow
{
    protected internal RateDataRow(DataRowBuilder builder) : base(builder)
    {
    }

    public bool IsCheapest { get; set ;}
}

そして、.NewDataRow() が RateDataRow インスタンスを新しい行として返すように、***RateDataRow***s のみを含む新しい DataTable が必要です。

DataTable を拡張するクラスの実装は何ですか?

ありがとう、

4

3 に答える 3

13

これが古い投稿であることはわかっていますが、上記の例を機能させることができませんでした。私は同様の問題を抱えていたので、解決策を見つけたいと思っていました。少し調査した結果、次のことが機能することがわかりました。

class Program
{
    static void Main(string[] args)
    {
        MyDataTable t1 = new MyDataTable();

        t1.Columns.Add(new DataColumn("Name", typeof(string)));
        t1.Columns.Add(new DataColumn("DateOfBirth", typeof(DateTime)));

        MyDataRow r1 = t1.NewRow() as MyDataRow;
        r1["Name"] = "Bob";
        r1["DateOfBirth"] = new DateTime(1970, 5, 12);
        t1.Rows.Add(r1);
    }
}

[Serializable]
public class MyDataTable : DataTable
{
    public MyDataTable()
        : base()
    {
    }

    public MyDataTable(string tableName)
        : base(tableName)
    {
    }

    public MyDataTable(string tableName, string tableNamespace)
        : base(tableName, tableNamespace)
    {
    }

    /// <summary>
    /// Needs using System.Runtime.Serialization;
    /// </summary>
    public MyDataTable(SerializationInfo info, StreamingContext context)
        : base(info, context)
    {
    }

    protected override Type GetRowType()
    {
        return typeof(MyDataRow);
    }

    protected override DataRow NewRowFromBuilder(DataRowBuilder builder)
    {
        return new MyDataRow(builder);
    }
}

[Serializable]
public class MyDataRow : DataRow
{
    public bool MyPropertyThatIdicatesSomething { get; private set; }

    public MyDataRow()
        : base(null)
    {
    }

    public MyDataRow(DataRowBuilder builder)
        : base(builder)
    {
    }
}
于 2011-11-07T10:22:58.287 に答える
4

DataTable は GetRowType 仮想メソッドを公開し、派生クラスでこれをオーバーライドします。間違ったタイプの行を追加しようとすると、例外がスローされます。

class Program
{
    static void Main(string[] args)
    {
        MyDataTable t = new MyDataTable();
        t.Rows.Add(t.NewRow()); // <-- Exception here, wrong type (base doesn't count).
    }
}

public class MyDataTable : DataTable
{
    public MyDataTable()
        : base()
    { }

    protected override Type GetRowType()
    {
        return typeof(MyDataRow);
    }
}

public class MyDataRow : DataRow
{
    public MyDataRow()
        : base(null)
    { }
}
于 2010-06-23T12:28:51.293 に答える
0

あなたの質問から、型指定されたデータセットに精通しているかどうかは明確ではありません。それらは基本的にあなたが求めているものです。

組み込みのウ​​ィザードを使用して、XSD に基づいて型指定されたデータセットを作成できます (XSD は Db スキーマから抽出されます)。WinForms プロジェクトで、[Add DataSource] を選択し、手順に従います。

そのモデルを使用したくない場合でも、プロパティ、部分クラスなどのコードから借りることができます。

そのモデルを使用するか、非常に近くにとどまることが賢明です。

于 2010-06-23T12:12:12.393 に答える