ASP.NETボタンクリックはキャッチされていません(リピーターに動的にロードされるユーザーコントロールのボタン)
-
24-10-2019 - |
質問
ユーザーの入力をキャプチャし、DBに保存するための保存ボタンがあるユーザーコントロールを作成しました。リピーターを使用してページ上のこれらのコントロールの多くをレンダリングします。各質問ごとに保存ボタンを使用して、複数選択の質問のリストを想像してください。
このようなリピーターのItemDataBoundイベント内にユーザーコントロールをロードしています(コードが簡素化されました):
Protected Sub rptAssignments_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles rptAssignments.ItemDataBound
Dim CurrentAssignment As Assignment = DirectCast(e.Item.DataItem, Assignment)
Dim ctl As UA = CType(LoadControl("~\Controls\UA.ascx"), UA)
ctl.AssignmentID = CurrentAssignment.AssignmentID
ctl.Assignment = CurrentAssignment.AssignmentName
ctl.EnableViewState = True
e.Item.Controls.Add(ctl)
End Sub
参考までに、各行に異なるコントロールを使用できるため、項目テンプレートで指定するのではなく、実行時にコントロールをロードする必要があります。
ユーザーコントロールには、次のようなリンクボタンがあります。
<asp:LinkButton ID="lbnUpdate" runat="server" Text="Update" OnClick="lbnUpdate_Click" />
...そして、このようなハンドラーをクリックします:
Protected Sub lbnUpdate_Click(ByVal sender As Object, ByVal e As EventArgs) Handles lbnUpdate.Click
' my code to update the DB
End Sub
問題は、保存ボタンがクリックされると、ページが戻ってくるが、lbnupdate_clickが呼び出されないことです。ただし、ページ自体のpage_loadイベントは呼ばれます。
リピーターはユーザーコントロールの一部であり、ユーザーコントロールは別のユーザーコントロール内にロードされていることに注意してください(これは、ユーザーコントロールを豊富に使用するDotnetnukeサイトです)。保存ボタンリンクは次のようになります:
javascript:__doPostBack('dnn$ctr498$AssignmentsList$rptAssignments$ctl04$ctl00$lbnUpdate','')
解決
この問題は、WebFormsがどのようにそれ自体を覆うかを例示しています。
サブコントロールにイベントを提起するには、再結合またはViewStateからのリピーターを再構成する必要があります。あなたが支払う価格は、あなたのデータソースへの別の旅行またはViewStateのクライアントに保存されたすべての冗長なデータのいずれかです。恥ずかしい!
他のヒント
同じことかもしれない同様の問題が一度ありました。
要するに、あなたはボタンを動的に作成しているので、ポストバックの後 それらは存在しません. 。したがって、ASP.NET Webformsがイベントを探すと、何も見つかりません。
リピーターはいつDataBoundを取得しますか?ポストバックでボタンをページに再度レンダリングしてみてください(テストであっても)それがトリックを行うかどうかを確認してください。
usercontrolのIDはすべてのポストバックで同じですか?