1

私は、特殊な値を使用してプリミティブ int、DateTime、long の NULL を表す既存のオブジェクト フレームワークを使用しています。これらの値を含むデータは DataTable に追加され、XtraGrid などのサードパーティ コントロールに表示されます。

集計がデータに適用される場合を除いて、すべて問題ありません。この場合、明らかに NULL エントリの代わりに特別な値が処理されます。

したがって、最善の解決策は、DataRow に入れるときに DBNull との間で値をマップすることだと思います。DataTable と DataRow をサブクラス化することを考えましたが、基本クラスではアクセサーをオーバーライドできません。

サブクラスに追加の Get/Set 関数を追加することもできますが、これはそれらを使用することを覚えておく必要があります。サブクラス化の代わりに静的ヘルパー関数を追加することもできますが、これには同じ問題があります。

よりエレガントなソリューションはありますか?

更新 ユーザーが実行時に集計を定義できる柔軟なコントロールがあるため、集計を行うのはグリッド自体です。したがって、唯一の本当の解決策は、DBNull との間で何らかの方法でマップすることであり、これを行うためのエレガントな方法を探しているだけだと思います。

4

2 に答える 2

1

データテーブルを埋めて値を dbnull に変換するのに役立つ拡張メソッドを作成できます。

public static class DataExtensions
{
    public static DataRow AddRow(this DataRowCollection rowCollection, params object[] values)
    {
        object[] newValues = new object[values.Length];

        for(int i=0;i<values.Length;i++)
        {
            object value = values[i];
            if (value != null)
            {                    
                Type t = value.GetType();
                //check for min value only for value types...
                if (t.IsValueType)
                {
                    //maybe you can do some caching for that...
                    FieldInfo info = t.GetField("MinValue",
                        System.Reflection.BindingFlags.Static
                        | System.Reflection.BindingFlags.Public
                        );
                    if (info != null)
                    {
                        object o = info.GetValue(null);
                        if (value.Equals(o))  //very important == will return false
                        {
                            value = DBNull.Value;
                        }
                    }
                }
            }
            newValues[i] = value;               
        }

        return rowCollection.Add(newValues);
    }
}

そして、あなたは次のようなものを書くことができるでしょう:

t.Rows.AddRow(a,b,c,d,e);
于 2009-12-16T09:25:56.417 に答える
0

多分あなたは次のようにIIFで条件付き集計を作成することができます(愚かな例):

        DataTable t= new DataTable();
        t.Columns.Add("id");
        t.Columns.Add("id2");
        t.Columns.Add("id3", typeof(int), "IIF(id="+int.MinValue.ToString()+",id2,id+id2)");
        for (int i = 0; i < 5; i++)
        {
            t.Rows.Add(new object[] { i, 2 * i });
        }

        t.Rows.Add(new object[] { int.MinValue, 2000});

編集:他の投稿へのコメントに適合。

于 2009-12-15T14:28:19.913 に答える