3

私が使用しようとしている機能は次のとおりです。 - Web ページ上のコントロールを選択および更新するための ObjectDataSource を作成します (ユーザー コントロール)。- DataObjectTypeName を使用して、データを UpdateMethod に送信するオブジェクトを作成します。- DataObjectTypeName のオブジェクトに値が入力される前に、オブジェクトを事前入力して、ゼロまたはデフォルトの文字列がユーザーによって設定されたのか、またはアプリケーションによって。

値を事前設定する方法が見つかりません (これは 2006 年にフレームワーク 2.0 で発生した問題でした)。「なぜオブジェクトを事前設定する必要があるのですか?」と尋ねる人がいるかもしれません。簡単な答えは次のとおりです。さまざまなユーザー コントロールにコントロールをランダムに配置できるようにしたいのですが、どの UpdateMethod がオブジェクトのどのフィールドを処理する必要があるかを気にする必要はありません。

たとえば、FirstName、LastName、Address、City、State、Zip というフィールドを含む (SQL テーブルを反映する) クラスがあるとします。FirstName と LastName を変更し、Address、City、State、Zip (またはその逆) を表示しないオプションをユーザーに提供したい場合があります。1 つが FirstName と LastName を処理し、もう 1 つのメソッドが他のフィールドを処理する 2 つの UpdateMethods を作成したくありません。複数のテーブルから40以上の列のクラスを操作していますが、ある画面ではいくつかのフィールドが必要で、別の画面ではなく、後でそれらのフィールドをある画面から別の画面に変更することを決定する場合があります(知らないうちにUpdateMethodsが壊れます)。

私の問題を十分に説明したことを願っています。
ありがとう

4

1 に答える 1

0

これはほとんど問題の解決策ではありませんが、私の最善の方法です。

DataSourceID が ObjectDataSource に設定された GridView があります。

行が更新されるたびに、オブジェクトのプロパティ値を選択的に更新する必要があります。つまり、GridView の列として表示される場合にのみ更新します。

次の拡張機能を作成しました。

public static class GridViewExtensions
{
    public static void EnableLimitUpdateToGridViewColumns(this GridView gridView)
    {
        _gridView = gridView;
        if (_gridView.DataSourceObject != null)
        {
            ((ObjectDataSource)_gridView.DataSourceObject)
                .Updating += new ObjectDataSourceMethodEventHandler(objectDataSource_Updating);
        }
    }

    private static GridView _gridView;

    private static void objectDataSource_Updating(object sender, ObjectDataSourceMethodEventArgs e)
    {
        var newObject = ((object)e.InputParameters[0]);
        var oldObjects = ((ObjectDataSource)_gridView.DataSourceObject).Select().Cast<object>();

        Type type = oldObjects.First().GetType();

        object oldObject = null;

        foreach (var obj in oldObjects)
        {
            if (type.GetProperty(_gridView.DataKeyNames.First()).GetValue(obj, null).ToString() ==
                type.GetProperty(_gridView.DataKeyNames.First()).GetValue(newObject, null).ToString())
            {
                oldObject = obj;
                break;
            }
        }

        if (oldObject == null) return;

        var dynamicColumns = _gridView.Columns.OfType<DynamicField>();

        foreach (var property in type.GetProperties())
        {
            if (dynamicColumns.Where(c => c.DataField == property.Name).Count() == 0)
            {
                property.SetValue(newObject, property.GetValue(oldObject, null), null);
            }
        }
    }
}

そして、私のページの Page_Init イベントで、次のように GridView に適用します。

protected void Page_Init()
{
    GridView1.EnableLimitUpdateToGridViewColumns();
}

これは現時点で私にとってはうまくいっています。

おそらく、ListView や DetailsView などの他のコントロールにも同様のロジックを適用できます。

私は現在、レンダリングにとらわれない方法でこれを行う方法を考えようと頭を悩ませています。つまり、使用されているレンダリング コントロールについて知る必要はありません。

これが、ハッキングするのではなく、GridView または ObjectDataSource コントロールの通常の機能になることを願っています。

于 2010-03-03T03:00:03.700 に答える