0

コードビハインドでユーザーコントロールを作成し、そのコントロールのイベントに応答しようとしています。おそらく、コンパイル時にコントロールが存在しないため、Visual Studioは、コントロールのイベントをキャッチするために作成したハンドラーサブルーチンをコンパイルできません。重要なのは、実行時にコントロールのタイプを決定したいということです(これが、単にハードコーディングしているのではない理由です)。

[先に進む前に、XAMLでコントロールを作成する「通常の」方法で使用される場合のイベントやイベントハンドラーなど、コントロールは正しく機能します。99%同一のページの重複を避けるために、コードビハインドでコントロールインスタンスを作成したい]

この「動作」(ただし、必要な柔軟性は得られません):

        Public WithEvents AnswerPanel As MyControls.ScrollerControl

...(およびNew()サブでの初期化):

        AnswerPanel = New MyControls.ScrollerControl
        ItemStack3.Children.Add(AnswerPanel)

        AddHandler AnswerPanel.GuessMade, AddressOf CheckAnswer

...(これは、ScrollerControlのカスタムイベントに応答するハンドラーサブです)

        Public Sub CheckAnswer(answer As String) Handles AnswerPanel.GuessMade

上記のコードを使用すると、すべてが期待どおりに機能します。コントロールは実行時に作成され、そのイベントは正しく処理されます。

私が達成したいのは、コントロールを初期化するときに別のユーザーコントロール(たとえば、ScrollerControl2、ScrollerControl3など)を選択できるようにすることです。最初の行を次のように変更することで、この方法でコントロールを作成できます。

        Public WithEvents AnswerPanel As UserControl

しかし、その変更が行われると、(おそらく)コンパイラーがカスタムGuessMadeイベントを含まない汎用UserControlと見なすため、ハンドラーでカスタムイベントを参照できなくなります。コンパイラはイベント名にエラーがあり、存在しないと通知します。

私はここで何か間違ったことをしていると確信しています。私のコードではなく、理論/概念の問題だと思います。

私は正しい方向に進んでいますか、それとも間違った方法でこれを行っていますか?

4

2 に答える 2

1

私がこの権利を読んでいる場合、あなたはイベントを発生させるユーザーコントロールを持っていて、親ページがそれをキャッチしたいですか?その場合は、イベントを発生させる必要があります。これにより、イベントが親にバブルされます。IE:

Partial Class user_controls_myControl
    Inherits System.Web.UI.UserControl
    Public Event DataChange As EventHandler
End Class

これにより、DataChangeと呼ばれるパブリックイベントを使用してコントロールが作成されます。ここで、ユーザーコントロールをインスタンス化する親ページのコードを見ると、「OnDataChange」というイベントがあることがわかります。onCLickイベントと同様に、これを親ページでメソッドに割り当てることができます。ここで、ユーザーコントロールでイベントを発生させる必要があります。これは、ボタンクリックやラジオボタン変更イ​​ベントなど、コントロールのイベントで追加できます。

RaiseEvent DataChange(Me, New EventArgs)

これは、送信者引数とイベント引数の2つのオブジェクトを取ります。通常、私はユーザーコントロールであるMEを渡します。リフレクションを使用してすべてのコントロールのパブリックプロパティを取得できるため、これは素晴らしいことです。これを使用して、オブジェクトをコントロールタイプにキャストすることもできます。イベント引数を渡すことはめったにありませんが、確かに渡すことができます。

私はここで同様の質問に答えました:リストビュー内のユーザーコントロールのイベントの処理

これがあなたが考えていたものではない場合は、私に知らせてください

編集:ユーザーコントロールを動的に追加し、イベントを添付するには:

まず、コントロールを使用するページで、プレースホルダーを追加する必要があります。

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

また、ページの先頭にあるユーザーコントロールへの参照(ページの設定方法によっては、これは必要ない場合があります。ページディレクティブエラーが発生した場合は、削除してください)。

<%@ Reference="" Control="~/user_controls/myControl.ascx"%>

親ページで、ユーザーコントロールを作成し、プレースホルダーに追加できます。次のようなイベントでユーザーコントロールを宣言する必要があります。

Private WithEvents myNewControl As New user_controls_myControl

次に、いくつかの方法で、次のようにページに追加できます。

Dim getPh As New PlaceHolder   

'create an instance of the user control
newMyControl = CType(LoadControl("~/user_controls/myControl.ascx"), user_controls_myControl)

'get a handle on the place holder
getPh = me.placeHolder1

'add the user control to the place holder
getPh.Controls.Add(newMyControl)

次に、イベントメソッドがあることを確認します。

Protected Sub myEvent(ByVal sender As Object, ByVal e As EventArgs) Handles myNewControl.DataChange

End Sub

したがって、前に提案したようにRaiseEventをユーザーコントロールに追加した場合、これはうまくいくはずです。

于 2013-03-27T13:46:16.847 に答える
0

私は今これに対する答えを持っています。思った通り、間違った角度から問題を考えていました。

一言で言えば、ユーザーコントロールからイベントを発生させようとしていましたが、基本クラスでイベントを発生させ、ユーザーコントロールからそれを呼び出す必要がありました。

したがって、私の基本クラス(ユーザーコントロールが継承する)には、次のものが含まれています。

    Public Event GuessMade(answer As String)

    Protected Sub RaiseGuessEvent(answer As String)

         RaiseEvent GuessMade(answer)

    End Sub

次に、ユーザーコントロールで、イベントを発生させる必要がある場合、次のようにRaiseGuessEventサブを呼び出すだけです。

     Me.RaiseGuessEvent(CurrentValue)

さらに、もちろん、サブクラス/ユーザーコントロールからイベントを削除する必要がありました。

于 2013-03-28T00:30:52.117 に答える