ITemplate 的 InstantiateIn() 方法中的动态控件类型基于 DataItem 的属性。有办法吗?

2024-03-05

我有一个简单的GridView;对于普通人来说是这样的Item or AlternatingItem row:

+----+-------------+----------+
| ID | Description | Value    |
+====+=============+==========+
| 01 | Some text   | 0.082    |
+----+-------------+----------+
| 02 | Some text   | Yes      |
+----+-------------+----------+
| 02 | Some text   | 9/4/2009 |
+----+-------------+----------+

当用户选择编辑行GridView,只有“值”列才可编辑。我想以某种方式,基于该行的属性DataItem,渲染一个控件(在我的例子中,要么是常规的TextBox对于十进制值,aDropDownList对于“是/否”布尔值,或者更复杂的东西,例如TextBox与某些日历控件)用于根据其类型编辑该值。

所以对于初学者来说,包含上述信息的对象有一个DataFormat它的属性具有我需要确定要呈现哪个控件的值。我已经开始定制ITemplate控制。它是InstantiateIn()方法看起来像这样:

Public Sub InstantiateIn(ByVal container As Control) Implements ITemplate.InstantiateIn
    Select Case Me.ItemType
        Case UDFTemplate.Value
            Dim valueLabel As New Label()
            AddHandler valueLabel.DataBinding, AddressOf ControlDataBinding
            container.Controls.Add(valueLabel)

        Case UDFTemplate.EditValue
            ' I don't always want a text box... I want to decide what to create here.
            Dim editBox As New TextBox()
            editBox.Columns = 15
            AddHandler editBox.DataBinding, AddressOf ControlDataBinding
            container.Controls.Add(editBox)
    End Select
End Sub

我的目标是以某种方式达到DataItem的财产GridViewRow我要决定在其中构建什么类型的控件InstantiateIn()方法。

这可能吗?我想我应该这样做以保持干净并且全部集中在一个地方。

如果您已经读到这里,谢谢!还有一点:有没有办法改变ItemTemplate对于单个单元格,例如,通过覆盖RowDataBound的事件处理程序GridView?我在互联网上搜索了很长时间,寻找有人这样做的例子,但我找不到一个。我见过一些他们发现的例子GridViewRow通过container通过强制转换变量Parent or NamingContainer属性到一个GridViewRow,但两者总是Nothing当我看着他们的时候。

我还尝试过将 CSS 类分配给DataControlFieldCell是在GridView's RowCreated事件,然后在InstantiateIn方法并使用它来确定要呈现哪个控件。问题在于它仅适用于行的初始创建,但是一旦用户点击“编辑”并重新绑定,DataItem行上的 s 返回到Nothings 和RowCreated抛出一堆“对象未设置...”博洛尼亚。

那么...有人有什么想法吗?


我按照我在回复 pjabbott 的评论中解释的路线去了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ITemplate 的 InstantiateIn() 方法中的动态控件类型基于 DataItem 的属性。有办法吗? 的相关文章

随机推荐