在DataObjectSource中使用DataObjectTypeName

时间:2009-12-15 13:25:15

标签: webforms asp.net-3.5 objectdatasource

我尝试使用的功能是: - 创建ObjectDataSource以选择和更新网页上的控件(用户控件)。 - 使用DataObjectTypeName创建一个将数据发送到UpdateMethod的对象。 - 在DataObjectTypeName的对象中填充值之前,我想预先填充对象,以便类中的未使用的项不会默认为零和空字符串,而我不知道零或默认字符串是由用户设置还是通过申请。

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

例如,假设我有一个包含字段的类(反映SQL表):FirstName,LastName,Address,City,State,Zip。我可能希望为用户提供更改FirstName和LastName的选项,甚至不会看到Address,City,State,Zip(反之亦然)。我不想创建两个UpdateMethods,其中一个处理FirstName和LastName,另一个方法处理其他字段。我正在使用来自多个表的大约40多个列的类,我可能想要在一个屏幕上而不是另一个屏幕上的某些字段,然后决定将这些字段从一个屏幕更改为另一个屏幕(这在我不知情的情况下打破了我的UpdateMethods)。

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

1 个答案:

答案 0 :(得分: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控件的常规功能,而不是必须破解它。