2012-01-24 4 views
0

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

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) 

UPDATE -. 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 
+1

Вы смотрели здесь http://stackoverflow.com/questions/825048/accessing-controls-in-the-edititemtemplate-of-a -Посмотреть список. В каком событии вы пытаетесь получить доступ к элементу управления? –

+0

@PaulMcCowat Да, и я сейчас смотрю на это более внимательно, но у меня все еще возникают проблемы с подключением точек. Как мне сказать «ItemDataBound DropDownList», что значение SelectedValue должно быть указано в событии ItemCommand? Т.е. как передать эти данные между событиями? Или я думаю об этом неправильно? Посмотрите, как я запутался? : '( – Chiramisu

+0

Похоже, вы находите 'NewProductName_ddl', как если бы это был один экземпляр. Вероятно, это вернет коллекцию DropDownLists. Очень сложно помочь вам и написать код, не имея полного html и кода, доступного. –

ответ

2

EUREKA !!

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

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

Событие 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 

Я могу внести улучшения в этот ответ позже, но это сделал трюк для меня. :)

2

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

If i = e.Item.DataItemIndex Then 

С

If i = DirectCast(e.Item, IDataItemContainer).DataItemIndex Then 
+0

Полезно знать. Спасибо.;) – Chiramisu

+0

@NoA: Удивительно, спасибо за это –

 Смежные вопросы

  • Нет связанных вопросов^_^