Страница: 1 |
Страница: 1 |
Вопрос: как отлов.изменен. текста текстбоксa Дин DataGrida
Добавлено: 20.05.06 13:17
Автор вопроса: student-uni
Есть динамически созданный массив Датагридов
В каждом из них динамические темплаты для ввода значений через текстбокс
Они заполняются при загрузк данными из базы.
Вопрос, как теперь отловить изменение текста в текстбоксе
и сохранить изменения ?
Я попытался Написать обработчик события TextChanged, для каждого
текст бокса, по нему отловить Темплату контейнер и по ней Датагрид контейнер
но обработчик почему то не включается.
Может я не туда его вставил ?
Привожу текст, посоветуйте пож-ста что либо
'вот код вызова из текста
Dim objtc2 As New TemplateColumn
objtc2.HeaderText = "Full Name2"
objtc2.ItemTemplate = New newTextBoxColumn
allDataGrid.Columns.Add(objtc2)
allDataGrid.DataSource = dw
'предполагается что уже имеется заполненный ДатаВъю - dw
allDataGrid.DataBind()
' а вот описание класса newTextBoxColumn
'экземпляр этого класса успешно создаёт новую колонку в датагриде
'а в ней текстбоксы
Public Class newTextBoxColumn
Implements ITemplate
Public Sub New()
End Sub 'New
Public Sub InstantiateIn(ByVal container As Control) Implements System.Web.UI.ITemplate.InstantiateIn
Dim txtBox As New TextBox
'Это событие успешно привязывает данные к текстбоксу
AddHandler txtBox.DataBinding, AddressOf Me.BindLabelColumn2
' А ВОТ ЭТО СОБЫТИЕ не срабатывает
AddHandler txtBox.TextChanged, AddressOf Me.txtChan
container.Controls.Add(txtBox)
End Sub 'InstantiateIn
' вот описание подпрограмм обработки событий
' BindLabelColumn2 - вызывается каждый раз при заполнении
' датагридов
' txtChan - не вызывается вообще
Public Sub BindLabelColumn2(ByVal sender As Object, ByVal e As EventArgs)
Dim lbl As TextBox = CType(sender, TextBox)
Dim container As DataGridItem = CType(lbl.NamingContainer, DataGridItem)
Dim strVals As [String] = Convert.ToString(DataBinder.Eval(CType(container, DataGridItem).DataItem, "Name"))
lbl.Text = strVals
End Sub 'BindLabelColumn
Public Sub txtChan(ByVal sender As Object, ByVal e As EventArgs)
Dim tb As TextBox = CType(sender, TextBox)
Dim container As DataGridItem = CType(tb.NamingContainer, DataGridItem)
Dim dgg As DataGrid = CType(container.NamingContainer, DataGrid)
'tb.Text = strVals
tb.Text = dgg.ID.ToString
tb.Text = dgg.ID.ToString
End Sub 'BindLabelColumn
End Class 'newLabelColumn
Ответы
Всего ответов: 3
Номер ответа: 1
Автор ответа:
student-uni
Вопросов: 122
Ответов: 257
Профиль | | #1
Добавлено: 20.05.06 14:09
Переформулирую вопрос
я заменил событие ТекстЧеиндж на Унлоад
Это событие отлавливается по нажатию Энтер после введения текста
в текстБокс,
НО
введенного текста я в свойстве не вижу, вместо него старый текст !!!
Объясните пожалуйста, здесь что то со временем существования объекта
связяно или ?
Номер ответа: 2
Автор ответа:
student-uni
Вопросов: 122
Ответов: 257
Профиль | | #2
Добавлено: 20.05.06 14:50
Окей при Enter первым срабатывает Databinding, что то типа перечитывания страницы
все элементы создаются заново
поэтому я и получаю старое значение,
подскажите пожалуйста всё же как мне получить новое введеное значение.
Спасибо
Номер ответа: 3
Автор ответа:
student-uni
Вопросов: 122
Ответов: 257
Профиль | | #3
Добавлено: 20.05.06 18:21
Разобралься,
1. Надо включить автопостбек
иначе событие ТекстБокс.ТекстЧейндж не работает.
2. Событие хранится на сервере, поэтому
автопостбек инициализирует всё по новой
Решение - кинул все ДатаГриды в сессионВариабле.
Рулит!
Вопрос к знающим - можно ли объявить коллекцию (или массив датагридов), чтоб не запоминать в кеше по одному а кинуть туда одним ходом все ?
Правильно ли это - сохранять в кеше ?
или лучше в др месте ?
Привет.