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

时间:2009-09-30 22:12:59

标签: data-binding gridview asp.net-3.5

我有一个简单的GridView;类似于常规ItemAlternatingItem行的内容:

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

当用户选择在GridView中修改一行时,只有“值”列才可以编辑。我想以某种方式,基于该行的DataItem的属性,呈现一个控件(在我的例子中,对于十进制值是常规TextBox,对于“是/否”是DropDownList “booleans,或更复杂的东西,如带有某些Calendar控件的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

我的目标是以某种方式到达DataItemGridViewRow的{​​{1}}属性,以决定在InstantiateIn()方法中构建什么类型的控件。

这可能吗?我以为我会这样做,以保持清洁,并在一个地方。

如果您已经读过这篇文章了,谢谢!再多一点:是否可以通过覆盖ItemTemplate的{​​{1}}事件处理程序来改变单个单元格的RowDataBound?我已经搜索了互联网很长一段时间寻找一个人做这个的例子,但我找不到一个。我已经看到了一些示例,他们通过将GridViewGridViewRow属性转换为container来查找ParentNamingContainer变量,但两者都是我看过它们时总是GridViewRow

我也尝试过在Nothing的{​​{1}}事件中为DataControlFieldCell分配CSS类,然后在GridView方法中找到它并使用它来确定要渲染的控件。问题在于它只适用于行的初始创建,但只要用户点击“编辑”并重新绑定,行上的RowCreated就会回到InstantiateIn s和DataItem抛出了一堆'对象未设置......'博洛尼亚。

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

1 个答案:

答案 0 :(得分:1)

我选择了回应pjabbott的评论中解释的路线。