2 Stimmen

Wie man einen EventHandler in einer übergeordneten Klasse aufruft

Ich habe einen EventHandler für das Click-Ereignis zu einer Picturebox hinzugefügt, aber zur Laufzeit wird dieser Handler nie aufgerufen (der Debugger zeigt mir, dass er dem Steuerelement direkt hinzugefügt wird, aber wenn ich auf die Picturebox klicke, passiert nichts).

Ich nehme an, es hat etwas mit meinem Erbe zu tun. Ich habe ein Benutzerkontrol namens AbstractPage (es ist nicht wirklich abstrakt, da der Designer nicht mag, dass), die nur aus einer Überschrift und diese picturebox besteht, aber es bietet einige Funktionen, die die tatsächlichen Seiten verlassen sich auf.

#region Constructor
public AbstractPage()
{
    InitializeComponent();
    lblHeading.Text = PageName;
    picLock.Click += new EventHandler(picLock_Click);
}
#endregion

#region Events
void picLock_Click(object sender, EventArgs e)
{
    ...do some stuff
}
#endregion

Die Seitenimplementierungen erben einfach diese Klasse und fügen ihre Steuerelemente und ihr Verhalten hinzu. Wir haben kürzlich herausgefunden, dass die Unterklassifizierung von UserControl nicht performant ist und wir dort etwas Leistung verlieren, aber es ist der beste Weg, es zu tun (ich möchte nicht c&p Funktion für 25 Seiten und pflegen sie).

Meine SeiteA sieht wie folgt aus

public partial class PageA : AbstractPage
{
    #region Constructor
    public PageA()
    {
    // I dont call the base explicitely since it is the 
    // standard constructor and this always calls the base
        InitializeComponent();
    }
    #endregion

    public override string PageName
    {
        get { return "A"; }
    }

    public override void BindData(BindingSource dataToBind)
    {
    ...
    }

Wie auch immer, die picLock_Click wird nie aufgerufen und ich weiß nicht warum?

Die Seiten werden alle in ein PageControl gesetzt, das aus einem TreeView und einem TabContainer besteht, in den die Seiten gesetzt werden, sobald ich addPage(IPage) aufrufe

public partial class PageControl {
    ...
protected virtual void AddPages()
{
    AddPage(new PageA());       
    AddPage(new PageD());
    AddPage(new PageC());
    ...
}

protected void AddPage(IPage page)
{
    put pagename to treeview and enable selection handling
    add page to the tabcontainer    
}

Vielen Dank im Voraus

1voto

Grzenio Punkte 34566

Wenn ich Ihr Problem richtig verstehe, funktionierte dies für mich out of the box (mit VS2k8). Mein Code:

public partial class BaseUserControl : UserControl
{
    public BaseUserControl()
    {
        InitializeComponent(); //event hooked here
    }

    private void showMsgBox_Click(object sender, EventArgs e)
    {
        MessageBox.Show("Button clicked");
    }
}

public partial class TestUserControl : BaseUserControl
{
    public TestUserControl()
    {
        InitializeComponent();
    }
}

Ich habe das TestUserControl in ein Formular verschoben, auf die Schaltfläche geklickt und wie erwartet das Meldungsfeld erhalten. Können Sie etwas mehr Code einfügen, z. B. wie Sie Ihre AbstractPage verwenden?

1voto

lostiniceland Punkte 3649

Ich habe das Problem gefunden. Wir verwenden Infragistics WinForms, aber in diesem Fall habe ich die Standard Picturebox verwendet. Ich habe sie durch die UltraPictureBox ersetzt und jetzt funktioniert es.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X