Как вызвать EventHandler в родительском классе

2

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

Я предполагаю, что это имеет какое-то отношение к моему наследованию. У меня есть 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    
}

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

  • 0
    У меня была та же проблема, которую я никогда не решал. Я обошел его, реализовав обработчик в каждом производном классе и вызвав базовый метод
  • 1
    Дизайнеру не нравится абстракция? С каких это пор абстракция - дело вкуса?
Показать ещё 3 комментария
Теги:
winforms
inheritance
event-handling

2 ответа

1
Лучший ответ

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

1

Если я правильно понимаю вашу проблему, это сработало для меня из коробки (используя 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?

  • 0
    странно, что это сработало сразу ... но это то, чего я ожидал в любом случае :) Я добавил еще немного кода в свой вопрос. Я играл вокруг, но это никогда не работало.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню