Member 13174280 Ответов: 1

Кнопка перенаправить событие делегировать событие


У меня есть отдельный противоречи пользовательских элементов управления 1Panel + 2Button на WinForm

Что я уже пробовал:

namespace TestToolBar1
{
    public partial class UserControl1 : UserControl
    {
        private System.ComponentModel.Container components = null;

        public UserControl1()
        {
            InitializeComponent();
        }
      
        // define an event handler delegate which basically re-uses an existing
        // signature
        public delegate void EventHandler(object sender, System.EventArgs e);
        // decalre an event handler delegate
        EventHandler EventHandlerDelegate;
        // re-define the Click event
        new public event EventHandler Click
        {
            // this is the equivalent of Click += new EventHandler(...)
            add
            {
                this.EventHandlerDelegate += value;
            }
            // this is the equivalent of Click -= new EventHandler(...)
            remove
            {
                this.EventHandlerDelegate -= value;
            }
        }

        // forward the button's click event 
        private void button_Click(object sender, System.EventArgs e)
        {
            if (this.EventHandlerDelegate != null)
                this.EventHandlerDelegate(sender, e);
        }       
    }
}


а декларация по форме

namespace TestToolBar1
{
    public partial class Form2 : Form
    {
        private TestToolBar1.UserControl1 userControl11;
        private System.ComponentModel.Container components = null;

        public Form2()
        {
            InitializeComponent();


            UserControl1 myctrl = new UserControl1();
            myctrl.Top = 0;
            myctrl.Left = 0;
            myctrl.Parent = panel1;
            myctrl.Show();
        }
....

 private void userControl_Click1(object sender, System.EventArgs e)
        {
            Control ctrl = sender as Control;
            MessageBox.Show("message");
        }


проблема EventHandlerDelegate всегда имеет значение null, а не перенаправлять

private void button_Click(object sender, System.EventArgs e)
       {
           if (this.EventHandlerDelegate != null)
               this.EventHandlerDelegate(sender, e);
       }

1 Ответов

Рейтинг:
1

OriginalGriff

Это null, потому что вы никогда не добавляли к нему обработчик: вы предоставляете код, создаете экземпляр элемента управления, но не добавляете обработчик.

А если обработчик не добавлен, то в коллекции обработчиков нечего делать!
Вот как бы я это сделал:
Файл usercontrol1:

/// <summary>
/// Event to indicate SomethingHappened
/// </summary>
public event EventHandler SomethingHappened;
/// <summary>
/// Called to signal to subscribers that SomethingHappened
/// </summary>
/// <param name="e"></param>
protected virtual void OnSomethingHappened(EventArgs e)
    {
    EventHandler eh = SomethingHappened;
    if (eh != null)
        {
        eh(this, e);
        }
    }

// forward the button's click event
private void button1_Click(object sender, System.EventArgs e)
    {
    EventHandler eh = SomethingHappened;
    if (eh != null)
        {
        eh(this, e);
        }
    }

Форма:
UserControl1 myctrl = new UserControl1();
myctrl.Top = 0;
myctrl.Left = 0;
myctrl.Parent = panel1;
myctrl.SomethingHappened += myctrl_SomethingHappened;
myctrl.Show();
void myctrl_SomethingHappened(object sender, EventArgs e)
    {
    Console.WriteLine("It happened!");
    }
Если вы посмотрите сюда: Простой фрагмент кода для добавления события[^] он автоматизирует процесс добавления события (просто введите "evh" и нажмите tab, и он заполнит пробелы)