我尝试使用的功能是: - 创建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)。
我希望我能很好地解释我的问题 感谢
答案 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控件的常规功能,而不是必须破解它。