Это вряд ли решение проблемы, но это мой лучший удар.
У меня есть 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 вместо того, чтобы взламывать его.