各位大大好:
想請問關於UserControl應用的問題~
例如我建立了一個UserControl,裡面放了一顆Button1,然後設定了button1_Click事件。
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("At Form1 do something...");
}
我將此UserControl引用至3個或更多個Form裡,例如:Form1, Form2, Form3
那這個Click事件如果要在不同的Form裡做不同的事,就還要去寫判斷目前是在那一個Form,然後分別要做什麼事,這樣的情境是否就不適合用UserControl來實作此元件?
UserControl通常是不是都用在不管這個元件被放在那裡,都要做同樣的事情的狀況下才適合。若有在不同的Form裡要做不同事情的狀況就不適合用UserControl來實做?
如果以上認知沒錯,那UserControl應該只適合用來接收資料然後呈現不同資料的資訊畫面,若要實作主動的觸發事件好像就不適合~
以上認知不知道是否正確?
把這個寫在你的UserControl的控制項上
你就知道該怎麼做了
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(((Button)sender).Parent.Parent.Name);
}
或是你也可以在你放UserControl的Form上,加掛委派到你的Form的程式裡
做法
1、到usercontrol的設計畫面上,在你要"暴露"的元件上按右鍵→屬性→modifiers→改成public
2、回到主要使用UC的form.load裡,加usercontrol的元件事件.....如
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
userControl11.button1.Click += 按鍵事件;
}
private void 按鍵事件(object sender, EventArgs e)
{
//todo 加上你要的工作
MessageBox.Show(this.Name);// 你懂的
}
}
在UserControl裏建立ButtonClicked事件
public class MyUserControl : UserControl
{
private void button1_Click(object sender, EventArgs e) {
this.OnButtonClicked( new ButtonClickedEventArgs((Button) sender) );
}
private void button2_Click(object sender, EventArgs e) {
this.OnButtonClicked( new ButtonClickedEventArgs((Button) sender) );
}
// 引發ButtonClicked事件
protected virtual void OnButtonClicked(ButtonClickedEventArgs e) {
this.ButtonClicked?.Invoke( this, e );
}
// 宣告ButtonClicked事件的委派
public event EventHandler<ButtonClickedEventArgs> ButtonClicked;
}
// 自訂ButtonClicked事件的資料
public class ButtonClickedEventArgs : EventArgs
{
public Button Button { get; set; }
public ButtonClickedEventArgs(Button btn) => this.Button = btn;
}
在父代Form裏面,引用UserControl的ButtonClicked事件
public class Form1 : Form
{
public Form1() {
InitializeComponent();
// 把ButtonClicked事件,委派給MyUserControl1_ButtonClicked事件處理程序
myUserControl1.ButtonClicked += MyUserControl1_ButtonClicked;
}
// myUserControl1的ButtonClicked的事件處理程序
private void MyUserControl1_ButtonClicked(object sender, ButtonClickedEventArgs e) {
MessageBox.Show( $"{e.Button.Name} is clicked !", "Information",
MessageBoxButtons.OK, MessageBoxIcon.Information );
}
}
[備註]如何:引發和使用事件