iT邦幫忙

0

Winform UserControl應用問題

  • 分享至 

  • xImage

各位大大好:
想請問關於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應該只適合用來接收資料然後呈現不同資料的資訊畫面,若要實作主動的觸發事件好像就不適合~
以上認知不知道是否正確?

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
japhenchen
iT邦超人 1 級 ‧ 2021-07-15 08:34:03

把這個寫在你的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);// 你懂的
        }
    }
0
marlin12
iT邦研究生 5 級 ‧ 2021-07-15 19:22:28

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

[備註]如何:引發和使用事件

我要發表回答

立即登入回答