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

Data binding 基于DataItem属性的ITemplate的InstanceIn()方法中的动态控件类型。有办法吗?,data-binding,gridview,asp.net-3.5,Data Binding,Gridview,Asp.net 3.5,我有一个简单的GridView;对于常规项目或替代项目行,类似于此: +----+-------------+----------+ | ID | Description | Value | +====+=============+==========+ | 01 | Some text | 0.082 | +----+-------------+----------+ | 02 | Some text | Yes | +----+-------------+---

我有一个简单的
GridView
;对于常规
项目
替代项目
行,类似于此:

+----+-------------+----------+
| ID | Description | Value    |
+====+=============+==========+
| 01 | Some text   | 0.082    |
+----+-------------+----------+
| 02 | Some text   | Yes      |
+----+-------------+----------+
| 02 | Some text   | 9/4/2009 |
+----+-------------+----------+
当用户选择编辑
GridView
中的一行时,只有“值”列应变为可编辑。我想以某种方式,基于该行的
DataItem
的属性,呈现一个控件(在我的例子中,对于十进制值是一个常规的
TextBox
,对于“Yes/No”布尔值是一个
DropDownList
,或者更复杂的东西,比如带有一些日历控件的
TextBox
),用于根据其类型编辑该值

因此,对于初学者来说,包含上述信息的对象有一个
DataFormat
属性,该属性具有我需要的值,以确定渲染哪个控件。我启动了一个自定义
ITemplate
控件。它的
instantialein()
方法如下所示:

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
我的目标是以某种方式访问
GridViewRow
DataItem
属性,以决定在
InstanceIn()
方法中构建何种类型的控件

这可能吗?我想我会这样做,保持它干净,在一个地方

如果你已经读到这里,谢谢你!还有一点:是否有一种方法可以更改单个单元格的
ItemTemplate
,例如,重写
GridView
rowdabund
事件处理程序?我在互联网上搜索了很长一段时间,寻找有人这样做的例子,但我找不到一个。我看到过一些示例,其中他们通过
容器
变量查找
GridViewRow
,方法是将其
父属性
NamingContainer
属性强制转换为
GridViewRow
,但当我查看它们时,它们总是
什么都没有

我还尝试了一些方法,比如在
GridView
RowCreated
事件中为
DataControlFieldCell
分配一个CSS类,然后在
InstantiateIn
方法中找到它,并使用它来确定要呈现哪个控件。问题是,它只适用于行的初始创建,但一旦用户点击“编辑”并重新绑定,行上的
DataItem
s将返回到
Nothing
s,而
RowCreated
抛出一堆“objectnotset…”博洛尼亚


所以。。。有什么想法吗?

我在回复pjabbott的评论中解释了这条路线。

有趣的问题……我猜这是不可能的,因为在数据绑定到控件之前,控件需要就位;由于控件是首先创建的,因此无法事先告知数据类型。您是否可以构建一个自定义用户控件,该控件可以基于绑定的数据类型显示/隐藏文本框、复选框等,或者将正确的控件添加到CreateChildControls/Render中的控件集合中?好的,对于临时(?)解决方法,请在UDFTemplate.EditValue类型的InstanceIn()方法中,我添加了所有可能的控件,我需要编辑ID为且其可见属性设置为False的值。在GridView的RowDataBound事件处理程序中,我设置了进行编辑所需的可见事件处理程序。对我来说,这是一个丑陋的黑客,但它可以工作。