0

一部のユーザー入力をキャプチャし、それを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

参考までに、行ごとに異なるコントロールを使用できるため、ItemTemplateでコントロールを指定するのではなく、実行時にコントロールをロードする必要があります。

ユーザーコントロールには、次のようなリンクボタンがあります。

<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','')
4

3 に答える 3

2

この問題は、Webフォームがそれ自体をどのように凌駕するかを示しています。

サブコントロールにイベントを発生させるには、再バインドまたはビューステートからリピーターを再構成する必要があります。支払う価格は、データソースへの別の旅行か、ビューステートのクライアントに保存されているすべての冗長データのいずれかです。恥ずかしい!

于 2010-06-04T23:37:51.740 に答える
1

私はかつて同じような問題を抱えていましたが、それは同じことかもしれません。

つまり、ボタンを動的に作成しているため、ポストバックの後にボタンは存在しません。したがって、ASP.NET Webformsがイベントを検索するとき、何も見つかりません。

リピーターはいつデータバウンドを取得しますか?ポストバックで(テストとしても)ボタンをページに再度レンダリングしてみて、それでうまくいくかどうかを確認してください。

于 2010-06-04T23:35:05.240 に答える
0

UserControlのIDはすべてのポストバックで同じですか?

于 2010-06-04T23:42:07.127 に答える