Использование DataObjectTypeName в DataObjectSource - PullRequest
3 голосов
/ 15 декабря 2009

Функциональность, которую я пытаюсь использовать: - Создать ObjectDataSource для выбора и обновления элементов управления на веб-странице (пользовательский элемент управления). - Используйте DataObjectTypeName, чтобы создать объект, который будет отправлять данные в UpdateMethod. - Прежде чем значения будут заполнены в объекте DataObjectTypeName, я хотел бы предварительно заполнить объект, чтобы неиспользуемые элементы в классе не были по умолчанию равны нулям и пустым строкам, и я не знал, была ли задана пользователем ноль или строка по умолчанию по заявке.

Я не могу найти способ предварительно заполнить значения (это было проблемой еще в 2006 году с фреймворком 2.0). Кто-то может спросить: «Зачем кому-то нужно предварительно заполнять объект?». Ответ прост: я хочу иметь возможность произвольно размещать элементы управления на разных пользовательских элементах управления, и мне не нужно заботиться о том, какой UpdateMethod должен обрабатывать какие поля объекта.

Например, допустим, у меня есть класс (который отражает таблицу SQL), который включает в себя поля: FirstName, LastName, Address, City, State, Zip. Я могу захотеть дать пользователю возможность изменить FirstName и LastName и даже не видеть адрес, город, штат, почтовый индекс (или наоборот). Я не хочу создавать два метода UpdateMethods, где один обрабатывает FirstName и LastName, а другой - другие поля. Я работаю с классом из более чем 40 столбцов из нескольких таблиц, и мне могут потребоваться некоторые поля на одном экране, а не на другом, и позже я решу изменить эти поля с одного экрана на другой (что нарушает мои методы UpdateMethods без моего ведома).

Надеюсь, я достаточно хорошо объяснил свою проблему.
Спасибо

1 Ответ

0 голосов
/ 03 марта 2010

Это вряд ли решение проблемы, но это мой лучший удар.

У меня есть 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 вместо того, чтобы взламывать его.

...