Доступ к элементам управления в команде редактирования ListView - PullRequest
0 голосов
/ 25 января 2012

В моем ListView у меня есть ItemTemplate и EditItemTemplate, которые выглядят примерно так, соответственно.

enter image description here -------> enter image description here

Когда я нажимаю кнопку «Изменить», и она переключается на представление EditItemTemplate справа, я хочу предварительно заполнить Textbox и выбрать соответствующий option в DropDownList. Как я могу это сделать?

Прежде чем вы скажете использовать что-то вроде следующего, пожалуйста, знайте, что я уже изучил все возможные варианты, которые я могу придумать. Извините, что так требовательно, но, пожалуйста, будьте готовы провести меня через это, если вы ответите. ^. ^ Я застрял в этом вопросе буквально на месяцы: (

Dim lv As ListView = DirectCast(sender, ListView) 'sender is the ListView on the ItemCommand event
Dim ddl As DropDownList = DirectCast(lv.Items(0).FindControl("NewProductName_ddl"), DropDownList)
Dim tb As TextBox = DirectCast(lv.Items(0).FindControl("NewProductName_tb"), TextBox)

ОБНОВЛЕНИЕ - RAWR !!

О, черт возьми, Боже, ТАК ЗАКРЫТЬ, но без сигары. Следующий код работал для предварительной заливки, когда в ListView был только один элемент, но когда существует более одного элемента, он генерирует исключение NullReferenceException : (

'PROBLEM WAS HERE: Compare to the working code in my answer.
Protected Sub NewProduct_ItemDataBound(ByVal sender As ListView, ByVal e As ListViewItemEventArgs) Handles NewProduct.ItemDataBound
    If sender.EditIndex > -1 Then
        Dim ddl As DropDownList = DirectCast(e.Item.FindControl("NewProductName_ddl"), DropDownList)
        Dim tb As TextBox = DirectCast(e.Item.FindControl("NewProductName_cb"), TextBox)

        ddl.Items.FindByValue(sender.DataKeys(sender.EditIndex)("ID").ToString).Selected = True 'Prefills the DropDownList
        tb.Text = sender.DataKeys(sender.EditIndex)("Product").ToString 'Prefills the TextBox
    End If
End Sub

Ответы [ 2 ]

2 голосов
/ 24 апреля 2012

Отличный пост!У меня была такая же проблема, и вы сэкономили мне часы проб и ошибок.Просто хотел отметить, что при использовании вашего первого варианта с .NET Framework 3.5 или ниже, DataItemIndex недоступен.Чтобы обойти это, вы можете заменить

If i = e.Item.DataItemIndex Then

на

If i = DirectCast(e.Item, IDataItemContainer).DataItemIndex Then
2 голосов
/ 25 января 2012

EUREKA !!

Я взволнован за гранью воображения !!Все заглавные буквы, а также жирный шрифт делают справедливость о том, как я счастлив сейчас:)

Сначала я хочу дать реквизит этот вопрос , который заставил меня указать в правильном направлении.Теперь перейдем к ответу, который является наиболее идеальным вариантом, который я нашел для ответа, приведенного в приведенной выше ссылке:

Событие ItemDataBound является ключом, но важно отметить, что это событие будет срабатывать для каждогопредмет, который существует в вашем ListView, и по этой причине вы должны быть осторожны в своем подходе.Вот два варианта, которые одинаково хорошо сработали для меня.

Вариант 1 - Самый элегантный;* запускает FindControl только для рассматриваемого элемента, а не для всех элементов.

Protected Sub NewProduct_ItemDataBound(ByVal sender As ListView, ByVal e As ListViewItemEventArgs) Handles NewProduct.ItemDataBound
    Dim i As Integer = sender.EditIndex
    If i = e.Item.DataItemIndex Then
        Dim ddl As DropDownList = DirectCast(e.Item.FindControl("NewProductName_ddl"), DropDownList)
        Dim tb As TextBox = DirectCast(e.Item.FindControl("NewProductName_cb"), TextBox)

        ddl.Items.FindByValue(sender.DataKeys(i)("ID").ToString).Selected = True 'Prefills the DropDownList
        tb.Text = sender.DataKeys(i)("Product").ToString 'Prefills the TextBox
    End If
End Sub

Опция 2 - на основе указанного вопроса, но с критической проверкой для обеспечения ненулевого объекта.

Protected Sub NewProduct_ItemDataBound(ByVal sender As ListView, ByVal e As ListViewItemEventArgs) Handles NewProduct.ItemDataBound
    Dim i As Integer = sender.EditIndex
    If i > -1 Then
        Dim ddl As DropDownList = DirectCast(e.Item.FindControl("NewProductName_ddl"), DropDownList)
        Dim tb As TextBox = DirectCast(e.Item.FindControl("NewProductName_cb"), TextBox)

        If Not IsNothing(ddl) Then
            ddl.Items.FindByValue(sender.DataKeys(i)("ID").ToString).Selected = True 'Prefills the DropDownList
        End If
        If Not IsNothing(tb) Then
            tb.Text = sender.DataKeys(i)("Product").ToString 'Prefills the TextBox
        End If
    End If
End Sub

Я могу улучшить этот ответ позже, но это помогло мне.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...