【问题标题】:Make Gridview interact with something other than properties让 Gridview 与属性以外的东西进行交互
【发布时间】: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 中对象的给定属性。问题是,我不能使用对象的属性,因为在这种情况下,对象需要具有完全任意数量的字段。

【问题讨论】:

    标签: asp.net gridview


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      您需要的完全是dynamic GridView。我想您必须使用描述中的控件(功能)对其进行扩展

      【讨论】:

        【解决方案3】:

        这是我最终做的:

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

        这很棘手,但值得。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-02-02
          • 2011-04-01
          • 2011-02-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-11
          相关资源
          最近更新 更多