代码之家  ›  专栏  ›  技术社区  ›  StriplingWarrior

使GridView与属性以外的内容交互

  •  0
  • StriplingWarrior  · 技术社区  · 17 年前

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

    问题是,GridView和DetailsView似乎是专门设计用来访问从数据源中出来的对象的属性。因为我们想要完全任意的形式,我们不能限制自己用属性来构建一个类来表示每个字段。我们必须能够在表单上拥有任意数量的动态指定字段。

    是否有任何方法可以利用现有控件,这样我们就不必重新实现分页、排序和所有其他网格视图已经设置好的操作,或者我只需要从头开始创建自己的网格视图,比如控件?

    编辑:

    更具体地说,我遇到的困难是让内联编辑在网格视图上工作。例如,假设添加到“表单”中的一个“字段”是日历字段,该字段应以只读模式将日期显示为文本,并以编辑模式显示日历控件。单击“保存”按钮时,日历控件选择的日期需要作为给定文档(即表单实例)的给定字段的新值保存到数据库中。我最初的想法是创造一个 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;
    

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

    3 回复  |  直到 16 年前
        1
  •  0
  •   Jamie Ide    17 年前

    GridView可以绑定到实现IEnumerable的任何对象。使用一个XDataSource控件的好处是,它可以为您实现分页和排序,而不需要任何额外的代码,但您肯定不会与它们联系在一起。

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

    detailsView不是很可定制的,所以您应该看看formView。但是,我认为您最终将动态地向所使用的容器添加控件。

        2
  •  0
  •   Yordan Georgiev    17 年前

    你需要的是 dynamic GridView . 我不知道你必须用描述中的控件(功能)来扩展它。

        3
  •  0
  •   StriplingWarrior    16 年前

    我最后做的是:

    1. 我创建了一个新的数据类型,其中包含一个按字段ID索引的答案字典。
    2. 我创造了一种新的 DataControlField 具有fieldid属性,该属性从上面提到的字典中检索该fieldid的正确答案值。
    3. 我向此自定义添加了数据类型和数据键属性 数据控制区 并超越了 ExtractValuesFromCell 方法,以便它可以创建answer类的新实例并将这些值添加到字典中,该字典存储在属性名下,通过该属性名可以在步骤1中提到的新数据类型中找到该字典。
    4. 我使用自己的GridView类,使用.NET Reflector查看普通的GridView如何调用 电池萃取值 方法,然后对其进行更改,以便将相同的字典对象传入每个 数据控制区 . 这样,每个字段都可以添加到同一个字典中,而不是替换上一个字段在相同属性名下添加的字典。
    5. 我使用了一个DataFieldGenerator来生成我的自定义 数据控制区 对于与给定表单关联的每个字段,我告诉GridView使用该DataFieldGenerator自动生成其字段。
    6. 我设置了ObjectDatasource,这样它就知道如何保存步骤1中提到的类型的对象的所有应答值。

    这很棘手,但值得一试。

    推荐文章