Как сделать событие в пользовательском контроле и обработать его в главной форме? - PullRequest
55 голосов
/ 24 октября 2011

У меня есть пользовательский контроль пользователя, и я хочу сделать что-то относительно простое.

Если в значении этого пользовательского элемента управления изменяется числовое значение вверх-вниз, главная форма обновляет окно отображения.

Это не проблема, если NUD не был в пользовательском контроле, но я не могу понять, как обрабатывать событие с помощью основной формы, а не пользовательского контроля.

Ответы [ 4 ]

119 голосов
/ 24 октября 2011

Вам необходимо создать обработчик событий для пользовательского элемента управления, который вызывается при запуске события из пользовательского элемента управления.Это позволит вам накапливать событие вверх по цепочке, чтобы вы могли обработать событие из формы.

При нажатии Button1 в пользовательском элементе управления я запускаю Button1_Click, который вызывает UserControl_ButtonClick в форме:

Элемент управления пользователя:

public event EventHandler ButtonClick;

protected void Button1_Click(object sender, EventArgs e)
{
    //bubble the event up to the parent
    if (this.ButtonClick!= null)
        this.ButtonClick(this, e);               
}

Форма:

UserControl1.ButtonClick += new EventHandler(UserControl_ButtonClick);

protected void UserControl_ButtonClick(object sender, EventArgs e)
{
    //handle the event 
}
19 голосов
/ 24 октября 2011

Попробуйте сопоставить это. Попробуйте разместить этот код в вашем UserControl:

public event EventHandler ValueChanged {
  add { numericUpDown1.ValueChanged += value; }
  remove { numericUpDown1.ValueChanged -= value; }
}

тогда ваш UserControl будет иметь событие ValueChanged, которое вы обычно видите с помощью элемента управления NumericUpDown.

11 голосов
/ 24 октября 2011

вы можете сделать это ..... в приведенном ниже примере показано, как изменилось значение текстового поля (пользовательский элемент управления)

   // Declare a delegate 
public delegate void ValueChangedEventHandler(object sender, ValueChangedEventArgs e);
public partial class SampleUserControl : TextBox 
{    
    public SampleUserControl() 
    { 
        InitializeComponent(); 
    }

    // Declare an event 
    public event ValueChangedEventHandler ValueChanged;

    protected virtual void OnValueChanged(ValueChangedEventArgs e) 
    { 
        if (ValueChanged != null) 
            ValueChanged(this,e); 
    }    
    private void SampleUserControl_TextChanged(object sender, EventArgs e) 
    { 
        TextBox tb  = (TextBox)sender; 
        int value; 
        if (!int.TryParse(tb.Text, out value)) 
            value = 0; 
        // Raise the event 
       OnValueChanged( new ValueChangedEventArgs(value)); 
    }    
}
0 голосов
/ 06 апреля 2018

Один из простых способов сделать это - использовать функцию Ланды без проблем, как

.
userControl_Material1.simpleButton4.Click += (s, ee) =>
            {
                Save_mat(mat_global);
            };
...