у меня простой GridView
; что-то вроде этого для обычной строки Item
или AlternatingItem
:
+----+-------------+----------+
| ID | Description | Value |
+====+=============+==========+
| 01 | Some text | 0.082 |
+----+-------------+----------+
| 02 | Some text | Yes |
+----+-------------+----------+
| 02 | Some text | 9/4/2009 |
+----+-------------+----------+
Когда пользователь выбирает для редактирования строки в GridView
, только столбец «Значение» должен стать редактируемым. Я хочу как-то, основываясь на свойстве DataItem
этой строки, отобразить элемент управления (в моем случае, либо обычный TextBox
для десятичных значений, DropDownList
для логических значений "Да / Нет", либо что-то еще сложный как TextBox
с некоторым элементом управления Calendar) для редактирования этого значения в зависимости от его типа.
Итак, для начала, объект, который содержит вышеуказанную информацию, имеет свойство 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
Моя цель состоит в том, чтобы каким-то образом получить свойство DataItem
GridViewRow
, в котором я сейчас принимаю решение, какой тип элемента управления создать в методе InstantiateIn()
.
Возможно ли это? Я думал, что сделаю так, чтобы все было чисто и все в одном месте.
Если вы прочитали это далеко, спасибо! Еще немного: есть ли способ изменить ItemTemplate
для отдельной ячейки, скажем, путем переопределения обработчика событий RowDataBound
GridView
? Я долго искал Интернет, ища пример того, как кто-то делает это, но я не могу найти ни одного. Я видел несколько примеров, когда они находят переменную GridViewRow
через container
путем приведения ее свойств Parent
или NamingContainer
к GridViewRow
, но оба они всегда Nothing
, когда я смотрел на их.
Я также пытался что-то вроде присвоения CSS-класса DataControlFieldCell
s в событии GridView
RowCreated
, а затем найти его в методе InstantiateIn
и использовать его, чтобы выяснить, какой элемент управления оказывать. Проблема в том, что он работает только для первоначального создания строк, но как только пользователь нажимает «Редактировать» и выполняет повторное связывание, DataItem
s в строках возвращаются к Nothing
s и RowCreated
бросает связку Болоньи «Объект не установлен ...».
Так ... есть идеи, у кого-нибудь есть?