Взаимодействие с элементами управления ListView (NamingContainer) - PullRequest
1 голос
/ 10 ноября 2011

Если бы существовал более простой способ обхода элементов управления ASP.NET в коде позади.Это было проклятием моего существования в качестве международного разработчика .NET.Мне нужна помощь в определении правильного члена ListView элементов управления.Я удалил весь код презентации в разметке, чтобы его было легче просматривать, так как он все равно не актуален.Вот ситуация:

Разметка

<asp:ListView ID="NewProduct" runat="server" DataSourceID="NewProductSDS" DataKeyNames="ID">
    <ItemTemplate>
        <asp:Table ID="NewProductTable" runat="server">
            <asp:TableRow>
                <asp:TableCell>
                    <asp:LinkButton ID="editProductName" runat="server" CommandName="Edit" />
                </asp:TableCell>
                <!-- I want this value to be transferred to my edit combobox -->
                <asp:TableCell ID="NewProductName" runat="server">
                    <%# Eval("Product").ToString.Trim()%>
                </asp:TableCell>
            </asp:TableRow>
        </asp:Table>
    </ItemTemplate>
    <EditItemTemplate>
        <asp:Table ID="NewProductTable" runat="server">
            <asp:TableRow>
                <asp:TableCell>
                    <asp:LinkButton ID="updateProductName" runat="server"  CommandName="Rename" />
                    <asp:LinkButton ID="cancelProductName" runat="server" CommandName="Cancel" />
                    <!-- Autocomplete Combobox, NOTE: The DDL is not displayed -->
                    <asp:DropDownList ID="NewProductName_ddl" runat="server" DataSourceID="productLineSDS" DataTextField="Product" DataValueField="ID"></asp:DropDownList>
                    <asp:TextBox ID="NewProductName_cb" runat="server"></asp:TextBox>
                    <button id="NewProductName_btn" type="button"></button>
                </asp:TableCell>
            </asp:TableRow>
        </asp:Table>
    </EditItemTemplate>
</asp:ListView>

Codebehind (VB)

Protected Sub ItemClick(ByVal sender As Object, ByVal e As ListViewCommandEventArgs) Handles NewProduct.ItemCommand
    Dim lv As ListView = DirectCast(sender, ListView)
    Dim i As Integer = e.Item.DisplayIndex
    'Session State Attempt
    Session.Add("NewProductKey", lv.DataKeys(i).Value)
    'URL State Attempt
    NewProductKey = lv.DataKeys(i).Value

    If e.CommandName = "Edit" Then
        Session.Add("NewProductKey", lv.DataKeys(i).Value)
        Try
            'This DDL is in the <EditItemTemplate> section.
            '  Need to set "selected" to value from "NewProductName" table cell
            '  For some reason I can't "FindControl" on this one.
            Dim ddl As DropDownList = DirectCast(lv.Items(0).FindControl("NewProductName_ddl"), DropDownList)
            Dim tb As TextBox = DirectCast(lv.Items(0).FindControl("NewProductName_cb"), TextBox)
            tb.Text = "test" 'BROKEN, can't even set the text. How can I ensure this control exists at this time?
            'This TableCell is in the <ItemTemplate> section. I can get this
            '  value back just fine.
            Dim pn As TableCell = DirectCast(lv.Items(0).FindControl("NewProductName"), TableCell)
            ddl.SelectedValue = CInt(Session.Item("NewProductKey"))
            ddl.Text = ddl.SelectedValue
        Catch ex As Exception
        End Try
        'Wireup the Combobox using some custom Javascript.
        Page.ClientScript.RegisterStartupScript([GetType], "", "cbsetup(""#NewProductName_cb"", ""#NewProductName_ddl"");", True)
    ElseIf e.CommandName = "Rename" Then
        Session.Add("NewProductKey", lv.DataKeys(i).Value)
        'Update the Product Name with the new value as entered in the TextBox control.
        Try
            Dim ddl As DropDownList = DirectCast(lv.Items(0).FindControl("NewProductName_ddl"), DropDownList)
            Dim tb As TextBox = DirectCast(lv.Items(0).FindControl("NewProductName_cb"), TextBox)
            Dim pKey As String = NewProductKey.ToString
            Dim pName As String = tb.Text 'Should take the value from the "NewProductName" TableCell
            Using connection As New SqlConnection(myConnectionString)
                'Query using pName and pKey works perfectly when run from SQL Server.
                '  The issue I'm having is capturing the values from the controls.
                Dim updateQuery As New SqlCommand(RenameProductQueryStr, connection)
                connection.Open()
                updateQuery.ExecuteNonQuery()
                connection.Close()
            End Using
        Catch ex As Exception
        End Try
    End If
End Sub

Чего я хочу достичьдля моего Combobox иметь значение выбранной строки, уже выбранной в DDL, и текст, введенный в TextBox.Я думаю, что проблема заключается в моей неспособности FindControl для элемента управления в разделе <EditItemTemplate> из команды, инициированной элементом управления в разделе <ItemTemplate>.Вот как я хочу, чтобы это выглядело.Первое изображение - режим элемента, второе - режим редактирования.

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

Это не показано в моем блоке кода позади, но яЯ использую следующее внутри моего командного блока «Редактировать», чтобы попытаться определить структуру и как захватить мои элементы управления Combobox, чтобы воздействовать на них, но безрезультатно: (

For Each item As Control In lv.Items
    debugLabel.Text += ", Items: " + item.ToString + "<br />"
Next

Я не знаюиспользовать ли lv.Items(0).FindControl(""), lv.Items(0).Parent.FindControl(""), lv.Parent.FindControl(""), lv.FindControl("") и т. д., или ЧТО?!

Ответы [ 2 ]

0 голосов
/ 25 января 2012

Я пересмотрел свой вопрос по этому вопросу несколько месяцев спустя в надежде упростить его и увеличить вероятность получения адекватной помощи. Я опубликовал ответ на оба эти вопроса благодаря некоторым рекомендациям из упомянутого вопроса.

Иди сюда, чтобы увидеть мой ответ :)

0 голосов
/ 10 ноября 2011

Если я правильно вас понимаю, я думаю, что это то, для чего Bind.

<ItemTemplate>
    <asp:DropDownList ID="DropDownList1" runat="server" 
        SelectedValue='<%# Bind("SomeValue") %>'>
    </asp:DropDownList>
</ItemTemplate>
<EditItemTemplate>
    <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("SomeValue") %>' ... />
</EditItemTemplate>

РЕДАКТИРОВАТЬ

Я думаю, это то, что вы 'после:

For Each item As ListViewItem In lv.Items 
    Dim ddl As DropDownList = DirectCast(item.FindControl("NewProductName_ddl"), DropDownList)
    If ddl IsNot Nothing Then
        'your code
    End If
Next
...