Тип динамического элемента управления в методе InstantiateIn () ITemplate, основанный на свойствах DataItem. Есть ли способ? - PullRequest
2 голосов
/ 01 октября 2009

у меня простой 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 бросает связку Болоньи «Объект не установлен ...».

Так ... есть идеи, у кого-нибудь есть?

1 Ответ

1 голос
/ 15 октября 2009

Я пошел по маршруту, описанному в моем комментарии в ответ на pjabbott.

...