3

我尝试使用的功能是: - 创建一个 ObjectDataSource 用于选择和更新网页上的控件(用户控件)。- 使用 DataObjectTypeName 创建一个将数据发送到 UpdateMethod 的对象。- 在将值填充到 DataObjectTypeName 的对象中之前,我想预先填充该对象,这样类中未使用的项目就不会默认为零和空字符串,而我不知道用户是否设置了零或默认字符串或由应用程序。

我找不到预先填充这些值的方法(这是 2006 年框架 2.0 的问题)。有人可能会问“为什么有人需要预先填充对象?”。简单的答案是:我希望能够在不同的用户控件上随机放置控件,而不必关心哪个 UpdateMethod 需要处理对象的哪些字段。

例如,假设我有一个包含以下字段的类(反映 SQL 表):FirstName、LastName、Address、City、State、Zip。我可能想让用户选择更改名字和姓氏,甚至看不到地址、城市、州、邮编(反之亦然)。我不想创建两个 UpdateMethod,其中一个处理 FirstName 和 LastName,另一个处理其他字段。我正在使用来自多个表的大约 40 多个列的类,我可能希望在一个屏幕上而不是另一个屏幕上显示一些字段,然后决定将这些字段从一个屏幕更改为另一个屏幕(这在我不知道的情况下破坏了我的 UpdateMethods)。

我希望我能很好地解释我的问题。
谢谢

4

1 回答 1

0

这很难解决问题,但这是我最好的尝试。

我有一个 GridView,其 DataSourceID 设置为 ObjectDataSource。

每当更新一行时,我希望有选择地更新对象中的属性值 - 也就是说 - 只有当它们在 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 回答