2009-07-10 7 views
2

J'ai ajouté un EventHandler pour l'événement Click à une imagebox mais à l'exécution ce gestionnaire n'est jamais appelé (le débogueur me montre qu'il est ajouté au contrôle directement mais quand je clique sur la photo, rien ne se passe). Je suppose que cela a quelque chose à voir avec mon héritage. J'ai un usercontrol appelé AbstractPage (ce n'est pas vraiment abstrait puisque le concepteur n'aime pas ça) qui se compose seulement d'un en-tête et de cette image mais il fournit assez de fonctions dont les pages réelles dépendent.Comment appeler un EventHandler dans une classe parent

#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 

Les implémentations de page héritent simplement de cette classe et ajoutent leurs contrôles et leur comportement. Nous avons récemment découvert que le sous-classement UserControl n'est pas performant et que nous y perdons des performances, mais c'est la meilleure façon de le faire (je ne veux pas c & p fonctionner pour 25 pages et les maintenir).

Mon pageA ressemble à ceci

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) 
    { 
    ... 
    } 

Quoi qu'il en soit, le picLock_Click est jamais appelé et je ne sais pas pourquoi?

Les pages sont tous mis dans un PageControl qui consiste en un TreeView et un TabContainer où les pages sont déposées une fois que j'appelle addPage (Ipage)

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  
} 

Merci à l'avance

+0

J'ai eu le même problème que je n'ai jamais résolu. J'ai travaillé autour de lui en implémentant le gestionnaire dans chaque classe dérivée et appelé la méthode de base – Calanus

+1

Le concepteur n'aime pas abstrait? Depuis quand est abstrait un cas de goût? – Dykam

+1

Pour être plus précis: le concepteur ne peut pas travailler avec des classes abstraites car il appelle toujours le constructeur standard. En Java, j'ai aimé avoir des classes d'interface utilisateur abstraites puisque vous pouvez gagner beaucoup de temps avec eux. – lostiniceland

Répondre

1

J'ai trouvé le problème. Nous utilisons l'Infragistics WinForms mais dans ce cas j'ai utilisé l'image standard. Je l'ai remplacé avec l'UltraPictureBox et maintenant ça marche.

1

Si je comprends votre problème correctement, cela a fonctionné pour moi hors de la boîte (en utilisant VS2k8). Mon 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(); 
    } 
} 

J'ai déplacé le TestUserControl à un formulaire, cliqué sur le bouton et a la boîte de message comme prévu. Pouvez-vous coller un peu plus de code, par ex. Comment utilisez-vous votre AbstractPage?

+0

étrange que cela a fonctionné tout de suite ... mais c'est ce que je m'attendrais de toute façon :) J'ai ajouté un peu plus de code à ma question . J'ai joué mais ça n'a jamais marché. – lostiniceland

Questions connexes