使Gridview与属性以外的东西进行交互

时间:2009-07-01 00:09:07

标签: asp.net gridview

我们计划创建一个Web应用程序,用户可以在其中构建自定义“表单”,选择他们想要的字段,以及如何表示这些字段中的数据。然后,用户可以在类似DetailsView的控件中填写这些表单,从而创建“文档”。文档可以在DetailsView中显示,或者其中几个字段的某些字段可以在GridView中显示。至少,这就是想法。

问题是GridView和DetailsView似乎专门设计用于访问来自DataSource的对象的Properties。由于我们希望拥有完全任意的形式,因此我们不能仅限于使用Properties构建一个表示每个字段的类。我们必须能够在表单上包含任意数量的动态指定字段。

有没有办法利用现有的控件,所以我们不必重新实现分页,排序和GridViews已经设置的所有其他东西,或者我只需要创建自己的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);

这可能适用于显示字段值,但如果用户尝试编辑并保存其中一个FormDocument,我不知道如何说服GridView执行以下操作:

doc.FieldValues[FieldKey] = newValue;

目前,DataControlField的API使用ExtractValuesFromCell方法将属性名称和值放入IOrderedDictionary。然后将这些值应用于GridView的数据绑定IEnumerable中对象的给定属性。问题是,我无法使用对象的属性,因为在这种情况下,对象需要具有完全任意数量的字段。

3 个答案:

答案 0 :(得分:0)

GridView可以绑定到任何实现IEnumerable的对象。使用其中一个xDataSource控件的优点是它可以为您实现分页和排序,而无需任何其他代码,但您肯定不会与它们绑定。

如果我正确理解了您的问题,您不知道在运行时直到GridView中显示的列数。在这种情况下,我建议从表单数据构建一个数组并将网格绑定到该数组。您必须自己实现分页和排序。

DetailsView不是很容易定制,所以你应该看一下FormView。但是,我认为您最终会动态地将控件添加到您使用的任何容器中。

答案 1 :(得分:0)

您需要的完全是dynamic GridView。我想你必须用你的描述中的控件(功能)来扩展它

答案 2 :(得分:0)

这是我最终做的事情:

  1. 我创建了一个新的数据类型,其中包含一个由字段ID索引的答案词典。
  2. 我创建了一个带有FieldId属性的新类型DataControlField,该属性从上面提到的字典中检索该FieldId的正确答案值。
  3. 我将数据类型和数据键属性添加到此自定义DataControlField并覆盖ExtractValuesFromCell方法,以便它可以创建答案类的新实例并将这些值添加到字典中,存储在属性名称下,通过该属性名称可以在步骤1中提到的新数据类型中找到该字典。
  4. 我使用自己的GridView类,使用.NET Reflector来查看普通GridView如何调用ExtractValuesFromCell方法,然后更改它以便将相同的Dictionary对象传递给每个{{1} }。这样,每个字段都可以添加到同一个字典中,而不是替换最后一个字典在相同属性名称下添加的字典。
  5. 我使用DataFieldGenerator为与给定表单关联的每个字段生成我的一个自定义DataControlField,我告诉GridView使用该DataFieldGenerator自动生成其字段。
  6. 我设置了我的ObjectDataSource,以便知道如何保存步骤1中提到的类型的对象的所有答案值。
  7. 这很棘手,但值得。