2013-06-14 11 views
5

Hier ist das Problem:Warum ein privater Ereignishandler in ASP.NET nicht funktioniert

Ich habe ein einfaches ASP.NET-Formular mit 2 Schaltflächen.

Einer von ihnen wird durch Ziehen der Taste von den Werkzeugen erstellt und die andere ich direkt in HTML erstellt:

<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 wird mit Werkzeugen erstellt und hat die folgenden Event-Handler:

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

Dieser "Private Event-Handler läuft ohne Probleme.

Aber für die Schaltfläche, die unter HTML erstellt wird, haben wir den folgenden Event-Handler:

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

     Dim a As Integer = 0 

End Sub 

Für diese ich folgende complile Fehler:

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'. 

Wenn ich den Event-Handler Rahmen von Private zu schützen ändern dies funktionieren wird. Frage ist, warum privat für einen Event-Handler arbeitet, aber nicht für den anderen.

+2

Wenn Sie 'OnClick' ** und **' Handles' haben, versuchen Sie, es zweimal zu verbinden - einmal aus dem Code dahinter und einmal aus dem HTML. Wenn Sie zu 'Protected' wechseln, werden Sie feststellen, dass der Event-Handler zweimal aufgerufen wird (wie Sie ihn gerade haben). Entfernen Sie das 'OnClick' im HTML –

+0

Ich habe gerade versucht," Hanldes "hinzuzufügen, nachdem ich den Kompilierungsfehler sah. Ich bekomme den gleichen Kompilierungsfehler mit oder ohne das Handler-Schlüsselwort. –

+0

Ich sagte, entfernen Sie die 'OnClick' im HTML, nicht die' Handles'. –

Antwort

8

Grundsätzlich ist eine aspx-Seite als zwei Klassen implementiert. Eine dieser Klassen enthält Ihren Code hinter dem Code (.aspx.vb) (und je nachdem, welche Version/Modell von ASP.Net Sie verwenden, auch einen vom Designer generierten Code (.aspx.designer.vb)).

Die zweite Klasse wird erstellt, wenn die Seite zum ersten Mal angefordert wird (oder die Site vorkompiliert ist) und enthält Inline-Code von der .aspx-Seite und anderem von ASP.Net generierten Code und enthält z. Code für alle mit runat="server" deklarierten Steuerelemente.

Diese zweite Klasse erbt von der ersten.

Also, wenn die erste Klasse Verantwortung Handler für Einhaken seine Veranstaltung findet, verwendet er ein Handles clause *:

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

Button1 zu dieser Klasse gehört, weil es dort gesetzt wurde von der Designer-Code generiert. Alles ist lokal für diese Klasse, und so kann die Methode Private sein.

Wenn die Sekunden Klasse Verantwortung einen Ereignishandler für Einhaken nimmt, tut sie es durch Attribute auf Server-Steuerelemente verwenden, wie hier:

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

Nun, es sei denn, ABC ein Verfahren inline innerhalb deklariert ist die .aspx Datei, hat es von der ersten Klasse (oder einer Klasse, von der die ersten selbst erbt von) seine

Wir haben jetzt ein situa tion, wo Code in der zweite Klasse auf Code in der ersten Klasse beziehen möchte. Und so sagen die Regeln von .NET, dass das Mitglied, auf das es zuzugreifen versucht, nicht Private sein kann.


Was sollten Sie nicht haben, wie Sie in Ihrer Frage haben, ist beide Klassen die Verantwortung für die (gleichen) Event-Handler Einhaken.


* Es ist nicht eine Handles Klausel verwenden - es könnte auch die Event-Handler mit AddHandler innen zum Beispiel einrichten das Ereignis Page_Load oder irgendwo anders, das angemessen ist. Handles ist idiomatisch für statische Steuerelemente auf einer Seite in VB. In C# gibt es kein Äquivalent zu Handles, daher sind die Ereignishandler mit C# 's Äquivalent von AddHandler, += verbunden.

+1

großartige Erklärung –

+0

Gute Erklärung, aber nicht alles erklärt ist privated: Button1 selbst ist als Protected deklariert: Geschützt WithEvents Button1 As System.Web.UI.WebControls.Button –

Verwandte Themen