0

私は「カート」Repeaterを持っています。そこにはすべてのアイテムにいくつかのコントロールがあります。私たちが注目しているものは、DropDownListsLinkButtonTextBoxです。リストは1つの検証グループにあり、ボタン&テキストボックスは別の検証グループにあります。ASP.NET:LinkBut​​tonをクリックすると間違ったイベントが発生する

両方のリストには、両方ともDropDownListsの選択に基づく計算を行うOnSelectedIndexChangedイベントハンドラがあります。どちらのリストもAutoPostBack="True"です。

このボタンには、OnClickハンドラがあり、テキストボックスの数字に応じて計算されます。

私は計算が即座に更新する必要がある - ので、私はRepeaterバインディング別のデータを追加 - 各イベントハンドラに

問題がある - 私がクリックした後、私はテキストボックスから値を取得することはできませんDropDownListsのいずれかにあります。バックグラウンドでは、OnSelectedIndexChangedイベントハンドラがを最初に起動し、が発生し、その後にボタンOnClickが発生します。そのは、リストの1つを変更した後にしか発生しません。その瞬間からそのボタンをクリックするたびに発生します。それ以前は、すべてのコントロールですべて正常です。

あなたはどう思いますか?下にいくつかのコードがあります(私はそれがあまりではない、私は参加しているすべてを含むことを望みます) - ありがとう!

   <ItemTemplate> 
        <tr> 
         <td class="size"><div><asp:DropDownList runat="server" ID="_selectSize" AutoPostBack="true" OnSelectedIndexChanged="selectChange" EnableViewState="true" TabIndex="<%#Container.ItemIndex%>" ValidationGroup="doNotValidate"></asp:DropDownList></div></td> 
         <td class="material"><div><asp:DropDownList runat="server" ID="_selectMaterial" AutoPostBack="true" OnSelectedIndexChanged="selectChange" EnableViewState="true" TabIndex="<%#Container.ItemIndex%>" ValidationGroup="doNotValidate"></asp:DropDownList></div></td> 
         <td class="quantity"> 
          <div> 
           <div class="quantity_container"><asp:TextBox runat="server" ID="_txtAmount" name="quantity_<%#Container.ItemIndex%>" ValidationGroup="vCart"></asp:TextBox></div> 
           <div><asp:LinkButton runat="server" CssClass="refresh" id="_refreshCart" ValidationGroup="vCart"></asp:LinkButton></div> 
          </div> 
         </td> 
        </tr> 
       </ItemTemplate> 

Repeater.DataBound()

はここでリピーターテンプレートです。ここ

Protected Sub rptCart_ItemDataBound(sender As Object, e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles rptCart.ItemDataBound 
    If e.Item.ItemType = ListItemType.AlternatingItem OrElse e.Item.ItemType = ListItemType.Item Then 
     Dim OrderItem As ProxyMarket.Item = CType(e.Item.DataItem, ProxyMarket.Item) 
     Dim btnRemoveProduct As LinkButton = CType(e.Item.FindControl("_removeProduct"), LinkButton) 
     Dim btnRefreshCart As LinkButton = CType(e.Item.FindControl("_refreshCart"), LinkButton) 
     Dim txtAmount As TextBox = CType(e.Item.FindControl("_txtAmount"), TextBox) 
     Dim sizeSelect As DropDownList = CType(e.Item.FindControl("_selectSize"), DropDownList) 
     Dim materialSelect As DropDownList = CType(e.Item.FindControl("_selectMaterial"), DropDownList) 

     btnRemoveProduct.CommandName = OrderItem.ID 
     btnRefreshCart.CommandName = OrderItem.ID 
     txtAmount.Text = OrderItem.Units 

     AddHandler btnRemoveProduct.Click, AddressOf removeProduct 
     AddHandler btnRefreshCart.Click, AddressOf refreshCart 

     sizeSelect.DataSource = sizeList 
     sizeSelect.DataBind() 
     sizeSelect.SelectedIndex = s 
     materialSelect.DataSource = materialList 
     materialSelect.DataBind() 
     materialSelect.SelectedIndex = m 
    End If 
End Sub 

DropDownListsイベントハンドラです:

Protected Sub selectChange(ByVal sender As DropDownList, ByVal e As System.EventArgs) 
    Dim listing As New PriceListing 
    Dim ddl As DropDownList 
    Dim selectedIndex As Integer 

    If sender.ID = "_selectSize" Then 
     For Each rptrItem As RepeaterItem In rptCart.Items 
      ddl = CType(rptrItem.FindControl("_selectMaterial"), DropDownList) 
      If ddl.TabIndex = sender.TabIndex Then Exit For 
     Next 

     For Each listing In artDecoPricing 
      If listing.Size = sender.SelectedValue Then Exit For 
     Next 

     selectedIndex = ddl.SelectedIndex 
     s = sender.SelectedIndex 
    ElseIf sender.ID = "_selectMaterial" Then 
     For Each rptrItem As RepeaterItem In rptCart.Items 
      ddl = CType(rptrItem.FindControl("_selectSize"), DropDownList) 
      If ddl.TabIndex = sender.TabIndex Then Exit For 
     Next 

     For Each listing In artDecoPricing 
      If listing.Size = ddl.SelectedValue Then Exit For 
     Next 

     selectedIndex = sender.SelectedIndex 
     s = ddl.SelectedIndex 
    End If 

    Select Case selectedIndex 
     Case 0 
      Cart.Order.Items(sender.TabIndex).PriceUnit = listing.Canvas 
     Case 1 
      Cart.Order.Items(sender.TabIndex).PriceUnit = listing.Acrylic 
     Case 2 
      Cart.Order.Items(sender.TabIndex).PriceUnit = listing.Framed 
     Case 3 
      Cart.Order.Items(sender.TabIndex).PriceUnit = listing.Alucobond 
    End Select 

    Cart.SaveOrder() 

    s = sender.SelectedIndex 
    m = selectedIndex 

    rptCart.DataSource = Cart.Order.Items 
    rptCart.DataBind() 
End Sub 

そして最後に、LinkButtonOnClickハンドラ:

Protected Sub refreshCart(ByVal sender As Object, ByVal e As System.EventArgs) 
    Dim btnRefreshCart As LinkButton = CType(sender, LinkButton) 
    Dim amountStr As String 
    Dim amount As Integer 

    amountStr = CType(btnRefreshCart.Parent.FindControl("_txtAmount"), TextBox).Text 
    If IsNumeric(amountStr) Then 
     amount = CDbl(amountStr) 
    Else 
     amount = -1 
    End If 
    amount = IIf(amount > 0, amount, -30) 

    For Each Item As ProxyMarket.Item In Cart.Order.Items 
     If Item.ID = btnRefreshCart.CommandName Then 
      Item.Units = amount 
      Cart.Edit_Product(btnRefreshCart.CommandName, amount) 
      Exit For 
     End If 
    Next 

    rptCart.DataSource = Cart.Order.Items 
    rptCart.DataBind() 
End Sub 

ありがとう:)

答えて

1

私は解決策を見つけました!

明らかに、これは、ユーザーが実際に別の値を選択したかどうかにかかわらず、OnSelectedIndexChangedがPage_Loadで発生するASP.NETのビューステートの制限が原因で発生しています。

したがって、イベントハンドラが起動すると、私に電話したのがか、別のコントロールかどうかをチェックしています。これは、必要がないときにイベントが発生しないようにして、 :

Protected Sub selectChange(ByVal sender As DropDownList, ByVal e As System.EventArgs) 
    Dim senderClientID = Page.Request.Params.Get("__EVENTTARGET") 
    ' Run ONLY if the relevant select control was clicked, 
    ' otherwise this is only fired because of ASP.NET limitations, 
    ' and will screw up the original event: 
    If senderClientID.IndexOf("_selectSize") <> -1 Or senderClientID.IndexOf("_selectMaterial") <> -1 Then 
     'do stuff 
0

私は、これはすでに回答されている知っているが、私は完全に別の溶液で、これは私がそれをここに追加するだろうと思ったグーグルに登場最初の投稿ですと、非常に同様の問題を抱えていました。

私はリンクボタンを持っていましたが、リンクボタンをクリックしたときにIE9でしか表示されませんでした。ページ上の別のボタンをアクティブにして、自分のイベントではなくイベントと呼びました。

私は多くのことをやめて、私のページの特定のセクションのどこかをクリックしただけでは、他のボタンをアクティブにしているボタンではないことに気付きました。

私は最終的に私のページを完全に取り除いた後に問題を発見しました。これは:

<label style="width: 100%" /> 

空ラベルタグです。一度削除されても問題ありません。

関連する問題