【发布时间】:2009-07-01 00:09:07
【问题描述】:
我们计划创建一个网络应用程序,用户可以在其中构建自定义“表单”,选择他们想要的字段,以及应该如何表示这些字段中的数据。然后,用户可以在类似 DetailsView 的控件中填写这些表单,从而创建“文档”。文档可以显示在 DetailsView 中,或者其中几个的某些字段可以显示在 GridView 中。至少,是这样的想法。
问题在于 GridView 和 DetailsView 似乎是专门为访问来自 DataSource 的对象的属性而设计的。由于我们希望有完全任意的形式,我们不能限制自己使用 Properties 来构建一个类来表示每个字段。我们必须能够在表单上包含任意数量的动态指定字段。
有什么方法可以利用现有的控件,这样我们就不必重新实现分页、排序以及 GridView 已经设置好的所有其他事情,或者我只需要创建自己的 GridView - 从头开始控制?
编辑:
更具体地说,我遇到的困难是在 GridView 上进行内联编辑。例如,假设添加到“表单”的“字段”之一是日历字段,它应该在只读模式下将日期显示为文本,并在编辑模式下显示日历控件。单击“保存”按钮时,需要将日历控件选择的日期作为给定文档(即表单的实例)的给定字段的新值保存到数据库中。我最初的想法是创建一个特殊的DataControlField 类,给定一个表单字段键,它会知道如何进行数据绑定:
FormDocument doc = DataBinder.GetDataItem(cell) as FormDocument;
FormFieldValue fieldValue = doc.FieldValues[FieldKey];
fieldValue.AddReadOnlyControls(cell);
...而不是:
Object dataObject = DataBinder.GetDataItem(cell);
cell.Text = DataBinder.GetPropertyValue(dataItem, FieldKey);
这可能适用于显示字段值,但如果用户尝试编辑并保存 FormDocuments 之一,我不知道如何说服 GridView 执行以下操作:
doc.FieldValues[FieldKey] = newValue;
目前,DataControlField 的 API 使用ExtractValuesFromCell 方法将属性名称和值放入IOrderedDictionary。然后将这些值应用于 GridView 的数据绑定IEnumerable 中对象的给定属性。问题是,我不能使用对象的属性,因为在这种情况下,对象需要具有完全任意数量的字段。
【问题讨论】: