6

問題は次のとおりです。

ボタンが 2 つある単純な ASP.NET フォームがあります。

1 つはツールからボタンをドラッグして作成したもので、もう 1 つは HTML で直接作成したものです。

<body>
<form id="Form1" method="post" runat="server">
    <asp:Button OnClick="ABC" Runat="server" Text="rrr" id="Button1"></asp:Button>
    <asp:Button  id="Button2" runat="server" Text="Button"></asp:Button>
</form>
</body>

Button2 はツールを使用して作成され、次のイベント ハンドラーがあります。

 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim s As String = ""
 End Sub

この「プライベート イベント ハンドラは問題なく実行されます。

ただし、 HTML で作成されたボタンには、次のイベント ハンドラーがあります。

Private Sub ABC(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim a As Integer = 0

End Sub

この場合、次のコンパイル エラーが発生します。

Compiler Error Message: BC30390: 'WebApplication9.WebForm1.Private Sub ABC(sender As Object, e As System.EventArgs)' is not accessible in this context because it is 'Private'.

イベント ハンドラーのスコープを Private から protected に変更すると、これが機能します。問題は、プライベートが一方のイベントハンドラーでは機能するのに、もう一方のイベントハンドラーでは機能しない理由です。

4

1 に答える 1

10

基本的に、aspx ページは2 つのクラスとして実装されます。これらのクラスの 1 つにコード ビハインド コード ( .aspx.vb) (および、使用している ASP.Net のバージョン/モデルによっては、一部のデザイナー生成コード ( .aspx.designer.vb)) が含まれます。

2 番目のクラスは、ページが最初に要求されたとき (またはサイトが事前にコンパイルされたとき) に作成され、.aspxページからのインライン コードと ASP.Net によって生成されたその他のコードが含まれ、たとえば で宣言されたコントロールのコードが含まれますrunat="server"

この 2 番目のクラスは、最初のクラスを継承します。

そのため、最初のクラスがそのイベント ハンドラーを接続する責任を負う場合は、Handles*:を使用します。

Private Sub ABC(...) Handles Button1.Click

Button1デザイナーが生成したコードによってそこに配置されたため、このクラスに属します。すべてがこのクラスに対してローカルであるため、メソッドはPrivate.

2 番目のクラスがイベント ハンドラーの接続を担当する場合、次のように、サーバー コントロールの属性を使用してそれを行います。

<asp:Button OnClick="ABC" Runat="server"

現在、メソッドがファイルABC内でインラインで宣言されていない限り、それは最初のクラス (または最初のクラス自体が継承する任意のクラス) からものでなければなりません。.aspx

2 番目のクラスのコードが1番目のクラスのコードを参照したい場合があります。そのため、.NET の規則では、アクセスしようとしているメンバーは .NET にはできないと規定されています。Private


質問にあるように、両方のクラスが (同じ) イベントハンドラーを接続する責任を負うべきではありません。


*句を使用する必要はありません。たとえば、イベント内、または適切な他の場所Handlesを使用して、イベント ハンドラーを設定することもできます。VB のページ上の静的コントロールの慣用句です。C# には に相当するものがないため、イベント ハンドラーは C# の , に相当するものに接続されます。AddHandlerPage_LoadHandlesHandlesAddHandler+=

于 2013-06-14T13:12:59.110 に答える