列表视图中的下拉列表SelectedIndexChanged第一次不起作用,但后续起作用

时间:2014-06-21 19:41:43

标签: asp.net .net vb.net postback repeater

我已经搜索过高低,我似乎无法找出这个发生了什么。我已经简化了代码,但我确实已经把它恢复到基本状态,但仍然存在同样的问题。

我在转发器中有一个下拉列表(在带有母版页的Web窗体中):

<asp:DropDownList ID="TicketQuantityDDL" runat="server" CssClass="qtyddl" AutoPostBack="true" OnSelectedIndexChanged="TicketQuantityDDL_SelectedIndexChanged" CausesValidation="false" SelectedIndex='<%# CInt(Eval("Quantity")) - 1%>'>
                                    <asp:ListItem Value="1">1</asp:ListItem>
                                    <asp:ListItem Value="2">2</asp:ListItem>
                                    <asp:ListItem Value="3">3</asp:ListItem>
                                    <asp:ListItem Value="4">4</asp:ListItem>
                                    <asp:ListItem Value="5">5</asp:ListItem>
                                    <asp:ListItem Value="6">6</asp:ListItem>
                                </asp:DropDownList>

处理程序

  Protected Sub TicketQuantityDDL_SelectedIndexChanged(sender As Object, e As EventArgs)
    myLiteral.text = "Selected Index Changed handled..."
  End Sub

第一次加载页面如果我更改了DDL页面被回发 - 所选的索引更改处理程序未被触发(我已经逐步完成代码,page.ispostback为true)。每次处理程序工作之后,除非页面已完全重新加载。

我尝试过的事情:

  • 手动添加处理程序OnItemCreated
  • 手动添加处理程序OnItemDataBound
  • 使用scriptmanager
  • 手动注册异步回发的控件
  • 使用OnClientSelectedIndexChanged触发来自客户端的回发
  • 再次移除AutoPostBack及以上所有内容......
  • 我已使用Page.Request.Params("__EVENTTARGET")验证当部分回发被触发时控件是下拉列表。
  • 即使启用了viewstate,我也尝试直接为控件和页面指定此项。
  • 禁用验证。
  • 我试过没有绑定下拉的价值而只是离开它 没有选定值,然后手动设置初始值 选择的价值 - 没有骰子。
  • 尝试删除更新面板,同样的问题。

绝对没有发生的事情。

  • 我没有在回帖if not page.ispostback... databind...
  • 上重新绑定
  • 我没有在下拉列表中选择相同的值/第一项
  • 这不是自动ID问题,控件ID通过回发保持不变。
  • 除了将转发器绑定到对象列表之外,我没有做任何有趣的事情。

为什么处理程序第一次触发?在第一次之后,一切都完全符合预期。

更新

我在列表视图中复制了完全相同的行为。由于时间限制,我使用了另一种方法,但我真的想知道如何解决这个问题,或者至少知道它为什么不起作用。

更新2

我已经使用沼泽标准网页表单测试了该功能,并且功能正常。在主页,脚本管理器或更新面板的内容持有者中存在一些问题。好像下拉列表的事件处理程序仅在第一次回发后注册,我已尝试在DataBound以及页面LoadComplete事件中注册处理程序,同样的事情仍然发生。

更新3

我已将其更改为列表视图,但我遇到了完全相同的问题。

这是在包含母版页的网页表单上,母版页包含脚本管理器,列表视图位于更新面板中,虽然我已尝试删除它,但我仍然遇到同样的问题。我没有包含onselectedindexchanged代码,我已经把它变得像改变文字的文本一样简单 - 没有首先发布回来的代码,是第二回事。

我最初手动指定了列表项,但是在itemDataBound上以编程方式更改了它,仍然没有区别。

正如我上面所说,当我检查哪个控件导致回发它肯定是ddl时,它不会在第一次触发selectindexchanged。我还尝试在控件本身中指定OnSelectedIndexChange,仍然没有骰子。

页面加载,绑定,列表视图和项目创建的代码。

页面加载

 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load


        If Not Page.IsPostBack Then

            Dim _Basket = SessionHandler.getSessionObject(SessionHandler.SessionObjects.Basket)

            If _Basket Is Nothing OrElse DirectCast(_Basket, BasketContainer).BasketItemList.Count = 0 Then
                BasketSectionContainer.Visible = False
                alertLiteral.Text = AlertGenerator.GetAlertHTML("No Items in Basket", "There are no items in your basket, please use the menu above to navigate the site.", AlertGenerator.AlertType.warning)
                If _Basket IsNot Nothing Then SessionHandler.removeSessionObject(SessionHandler.SessionObjects.Basket)
                Exit Sub
            Else
                Dim lBasket = DirectCast(_Basket, BasketContainer)


                BindBasket(lBasket)
            End If

        End If

    End Sub

绑定

  Private Sub BindBasket(lBasket As BasketContainer)

        basketListView.DataSource = lBasket.BasketItems
        basketListView.DataBind()

        bindTotals(lBasket) 'This just sets text of literals on the page outside of the listview
        If lBasket.Postage Then
          PostageDDL.visible = True 'This is outside of the list view also
        End If
    End Sub

项目已创建

Private Sub basketListView_ItemCreated(sender As Object, e As ListViewItemEventArgs) Handles basketListView.ItemCreated

    Dim QtyDDL As DropDownList = DirectCast(e.Item.FindControl("TicketQuantityDDL"), DropDownList)
    AddHandler QtyDDL.SelectedIndexChanged, AddressOf TicketQuantityDDL_SelectedIndexChanged

End Sub

_Item Data Bound _

Private Sub basketListView_ItemDataBound(sender As Object, e As ListViewItemEventArgs) Handles basketListView.ItemDataBound

    Dim data As BasketItem = DirectCast(e.Item.DataItem, BasketItem)
    Dim QtyDDL As DropDownList = DirectCast(e.Item.FindControl("TicketQuantityDDL"), DropDownList)

    For i As Integer = 1 To 6
        QtyDDL.Items.Add(New ListItem(i.ToString, i.ToString))
    Next


    QtyDDL.DataTextField = data.BasketItemID.ToString 'no command arg for DDL so using this, I've tested without, doesn't make a difference.

    Select Case data.BasketType
        Case BasketInfo.BasketItemType.DiscountedTickets, BasketInfo.BasketItemType.Tickets, BasketInfo.BasketItemType.Goods
            'tickets and goods...
            QtyDDL.Items.FindByValue(data.Quantity.ToString).Selected = True

        Case Else
            'non ticket or goods type, disable quantity selection

            QtyDDL.Items.FindByValue("1").Selected = True
            QtyDDL.Enabled = False
    End Select


End Sub

_List View _

<asp:ListView ID="basketListView" runat="server">

                    <LayoutTemplate>

                          <table class="cart-table responsive-table">

                                <tr>
                                    <th>Item</th>
                                    <th>Description</th>
                                    <th>Price</th>
                                    <th>Quantity</th>
                                    <th>Total</th>
                                    <th></th>
                                </tr>

                                  <asp:PlaceHolder ID="itemPlaceholder" runat="server" />

                              </table>
                        <table class="cart-table bottom">
                        <tr>
                            <th>

                                          <asp:Button ID="ApplyDiscountCodeButton" runat="server" CssClass="button color pull-right" Text="Apply Code" />
                                <asp:TextBox ID="DiscountCodeTextBox" runat="server" CssClass="discount-tb pull-right" />

                            </th>

                        </tr>

                    </table>
                    <div class="clearfix"></div>
                    </LayoutTemplate>

                    <ItemTemplate>
                        <tr>
                         <td>
                                    <img src="/images/shows/<%# Eval("imageURL")%>.jpg" alt="<%#Eval("BasketItemTitle")%>" class="basketimg" /></td>
                                <td class="cart-title">
                                    <a href="#"><%#Eval("BasketItemTitle")%></a>
                                    <br />
                                    <%# String.Format("{0:dddd} {1} {0:MMMM yyyy}      |     {0:HH:mm}", Eval("PerformanceStarts"), Eval("OrdinalDay"))%>
                                    <br />
                                    <%# Eval("VenueTitle")%>
                                </td>
                                <td>
                                    <%#Eval("PriceBandType")%>
                                    <br />
                                    @ <%# String.Format("{0:c}", Eval("PriceBandValue"))%>
                                </td>
                                <td>

                                <asp:DropDownList ID="TicketQuantityDDL" runat="server" CssClass="qtyddl" AutoPostBack="true" ClientIDMode="Static" />

                                </td>
                                <td class="cart-total"><%#String.Format("{0:c}", Eval("BasketItemTotalValue"))%></td>
                                <td>
                                    <asp:LinkButton ID="RemoveLinkBtn" runat="server" CssClass="cart-remove" CommandName="RemoveBasketItem" CommandArgument='<%#Eval("BasketItemID")%>' />
                                </td>
                            </tr>
                    </ItemTemplate>

                </asp:ListView>

3 个答案:

答案 0 :(得分:0)

由于转发器内部的Dropdown,您可以尝试使用以下选项。 将OnItemCommand添加到转发器。这绝对应该在下拉列表中的选择更改时触发事件。然后在OnItemCommand中你需要将Sender强制转换为DropDownList才能获得下拉列表的选定值

答案 1 :(得分:0)

你必须像这样注册下拉列表事件。

protected virtual void OnRepeaterItemCreated(object sender, RepeaterItemEventArgs e)
        {
            DropDownList dropdown = (DropDownList)e.Item.FindControl("TicketQuantityDDL");
            dropdown.SelectedIndexChanged += TicketQuantityDDL_SelectedIndexChanged;
        }

并在转发器中添加这段代码。

OnItemCreated="OnRepeaterItemCreated"

然后你可以像这样做选定的索引更改事件。

protected void TicketQuantityDDL_SelectedIndexChanged(object sender, EventArgs e)
        {
            DropDownList mydropdownlist = (DropDownList)sender;
            Response.Write(mydropdownlist.SelectedValue);
        }

答案 2 :(得分:0)

 protected void dropdownlist1_SelectedIndexChanged(object sender, EventArgs e)
    {
        DropDownList ddlListFind = (DropDownList)sender;
        ListViewItem item1 = (ListViewItem)ddlListFind.NamingContainer;
        DropDownList getDDLList = (DropDownList)item1.FindControl("dropdownlist1");

        Label lblMessage = (Label)item1.FindControl("lblMsg");
        lblMessage.Visible = true; lblMessage.Text = "dropDown text is : " + getDDLList.SelectedItem.Text + " and value is : " + getDDLList.SelectedItem.Value;
    }