I have a simple GridView
; something like this for a regular Item
or AlternatingItem
row:
+----+-------------+----------+
| ID | Description | Value |
+====+=============+==========+
| 01 | Some text | 0.082 |
+----+-------------+----------+
| 02 | Some text | Yes |
+----+-------------+----------+
| 02 | Some text | 9/4/2009 |
+----+-------------+----------+
When a user chooses to Edit a row in the GridView
, only the "Value" column should become editable. I want to somehow, based on a property of that row's DataItem
, render a control (in my case, either a regular TextBox
for decimal values, a DropDownList
for the "Yes/No" booleans, or something more complex like a TextBox
with some Calendar control) for editing that value based on its type.
So for starters, the object that contains the above information has a DataFormat
property on it that has the value I need to determine which control to render. I have a started a custom ITemplate
control. Its InstantiateIn()
method looks like so:
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
My goal is to somehow get to the DataItem
property of the GridViewRow
I'm in to decide what type of control to build in the InstantiateIn()
method.
Is this possible? I thought I'd do it this way to keep it clean and all in one place.
If you've read this far, thank you! Just a little more: Would there be a way to alter the ItemTemplate
for a single cell, say, by overriding the RowDataBound
event handler of the GridView
? I've scoured the Internets for a long time looking for an example of somebody doing this but I can't find a single one. I've seen some examples where they are finding the GridViewRow
through the container
variable by casting its Parent
or NamingContainer
properties to a GridViewRow
, but both are always Nothing
when I've looked at them.
I've also tried something like assigning a CSS class to the DataControlFieldCell
s in the GridView
's RowCreated
event, and then finding it in the InstantiateIn
method and using it to figure out which control to render. The problem with that is that it only works for the initial creation of the rows, but as soon as the user hits the "Edit" and it rebinds, the DataItem
s on the rows are back to Nothing
s and the RowCreated
throws a bunch of 'Object not set...' bologna.
So... any ideas out there anyone?