这很难解决问题,但这是我最好的尝试。
我有一个 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 控件的正常功能,而不是不得不破解它。