Как вызвать EventHandler в родительском классе - PullRequest
2 голосов
/ 10 июля 2009

Я добавил EventHandler для события Click в picturebox, но во время выполнения этот обработчик никогда не вызывается (отладчик показывает мне, что он добавлен в элемент управления напрямую, но когда я нажимаю на picturebox, ничего не происходит). *

Я полагаю, это как-то связано с моим наследством. У меня есть usercontrol, называемый AbstractPage (он не совсем абстрактный, так как дизайнеру это не нравится), который состоит только из заголовка и этого графического окна, но он предоставляет довольно много функций, на которые опираются реальные страницы.

#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

Реализации страниц просто наследуют этот класс и добавляют свои элементы управления и поведение. Недавно мы выяснили, что создание подклассов UserControl не является производительным, и мы теряем некоторую производительность там, но это лучший способ сделать это (я не хочу, чтобы c & p работала на 25 страницах и поддерживала их).

Моя страница выглядит так

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

Так или иначе, picLock_Click никогда не вызывается, и я не знаю почему?

Все страницы помещаются в PageControl, который состоит из TreeView и TabContainer, куда страницы помещаются после вызова 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    
}

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 10 июля 2009

Я нашел проблему. Мы используем инфраструктуру WinForms, но в этом случае я использовал стандартную картинку. Я заменил его на UltraPictureBox, и теперь он работает.

1 голос
/ 10 июля 2009

Если я правильно понимаю вашу проблему, это сработало для меня из коробки (используя VS2k8). Мой код:

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();
    }
}

Я переместил TestUserControl в форму, нажал кнопку и получил окно сообщения, как и ожидалось. Можете ли вы вставить еще немного кода, например как вы используете ваш AbstractPage?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...