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事件处理程序中,我设置了进行编辑所需的可见事件处理程序。对我来说,这是一个丑陋的黑客,但它可以工作。