views:

770

answers:

1

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 DataControlFieldCells 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 DataItems on the rows are back to Nothings and the RowCreated throws a bunch of 'Object not set...' bologna.

So... any ideas out there anyone?

A: 

I went with the route explained in my comment in response to pjabbott.

Cory Larson