2015-08-28 60 views
2

我有一個自定義控件包含三個子控件(面板與PictureBox控件和標籤),我想發送一個子控件的所有事件到其父控件(自定義控件)。如何將子控件的所有事件發送到其父控件(自定義控件)?

我知道有很多關於這個問題的答案,但是我不能用簡單的解決方案來解決它。

這裏是我的榜樣

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     UserControl1 uc1 = new UserControl1(); 
     this.Controls.Add(uc1); 
    } 
} 

public partial class UserControl1 : UserControl 
{ 
    public PictureBox ChildPictureBox { get; set; } 

    public UserControl1() 
    { 
     PictureBox pictureBox1 = new PictureBox(); 
     pictureBox1.Size = new Size(150, 150); 
     pictureBox1.BackColor = Color.Red; 
     pictureBox1.Click += PictureBox1_Click; 
     this.Controls.Add(pictureBox1); 
     ChildPictureBox = pictureBox1; 

     this.Click += UserControl1_Click; 
    } 

    private void UserControl1_Click(object sender, EventArgs e) 
    { 
     MessageBox.Show("User control click"); 
    } 

    private void PictureBox1_Click(object sender, EventArgs e) 
    { 
     MessageBox.Show("pic clicked"); 
    }  
} 
+0

使用'winform'? –

+0

這裏是我寫的關於如何將一個事件從子控件註冊到父控件的示例。 http://stackoverflow.com/questions/31934376/main-control-to-close-child/31934727#31934727 如果你仍然不確定該怎麼做,問,然後我會嘗試並回答 – 2015-08-28 06:08:22

回答

2

下面的代碼的例子,這裏有UserControl1PictureBoxPanel他們的點擊事件被鉤到MainForm I-E MyForm作爲命名。您可以根據您的要求修改它。

UserControl1.cs

public partial class UserControl1 : UserControl 
{ 
    public delegate void PictureBoxClickHandler(object sender, EventArgs e); 
    public event PictureBoxClickHandler PictureBoxClick; 

    public delegate void PanelClickHandler(object sender, EventArgs e); 
    public event PanelClickHandler PanelClick; 

    public delegate void PictureBoxDoubleClickHandler(object sender, EventArgs e); 
    public event PictureBoxDoubleClickHandler PictureBoxDoubleClick; 

    public delegate void PictureBoxMouseMoveHandler(object sender, MouseEventArgs e); 
    public event PictureBoxMouseMoveHandler PictureBoxMouseMove; 

    public UserControl1() 
    { 
     InitializeComponent(); 
    } 

    private void pictureBox1_Click(object sender, EventArgs e) 
    { 
     if (PictureBoxClick != null) 
     { 
      PictureBoxClick(sender, e); 
     } 
    } 

    private void panel1_Click(object sender, EventArgs e) 
    { 
     if (PanelClick != null) 
     { 
      PanelClick(sender, e); 
     } 
    } 

    private void pictureBox1_DoubleClick(object sender, EventArgs e) 
    { 
     if (PictureBoxDoubleClick != null) 
     { 
      PictureBoxDoubleClick(sender, e); 
     } 
    } 

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (PictureBoxMouseMove != null) 
     { 
      PictureBoxMouseMove(sender, e); 
     } 
    } 
} 

MyForm.cs

public class MyForm : Form 
{ 
    public MyForm() 
    { 
     InitializeComponent(); 
     var userControl1 = new UserControl1(); 
     Controls.Add(userControl1); 
     userControl1.PictureBoxClick += userControl1_PictureBoxClick; 
     userControl1.PanelClick += userControl1_PanelClick; 

     userControl1.PictureBoxDoubleClick+=userControl1_PictureBoxDoubleClick; 
     userControl1.PictureBoxMouseMove+=userControl1_PictureBoxMouseMove; 
    } 

    private void userControl1_PanelClick(object sender, EventArgs e) 
    { 
     //Click: Panel on userControl1 
    } 

    private void userControl1_PictureBoxClick(object sender, EventArgs e) 
    { 
     //Click: PictureBox on userControl1 
    } 

    private void userControl1_PictureBoxMouseMove(object sender, MouseEventArgs e) 
    { 
     throw new NotImplementedException(); 
    } 

    private void userControl1_PictureBoxDoubleClick(object sender, EventArgs e) 
    { 
     throw new NotImplementedException(); 
    } 
} 

編輯:

public partial class UserControl1 : UserControl 
{ 

    public PictureBox ChildPictureBox { get; set; }   

    public UserControl1() 
    { 
     InitializeComponent(); 
     ChildPictureBox = pictureBox1; 
    } 
    //---- 
} 

現在形式

public class MyForm : Form 
{ 
    public MyForm() 
    { 
     InitializeComponent(); 
     PictureBox pictureBox = userControl1.ChildPictureBox; 
     //now work with pictureBox here 
     pictureBox.Click += pictureBox_Click; 
    } 

    private void pictureBox_Click(object sender, EventArgs e) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

好的,這是用於點擊事件中,我想讓子控件附加更多的事件,如鼠標雙擊,鼠標輸入,鼠標移動等。所以我必須爲子控件的每個事件編寫事件處理程序? – userg1

+0

是的,您需要添加這些事件,就像我添加了點擊事件一樣。它非常相似。 –

+0

@ X-TE因此,無法通過簡單的解決方案將子控件的所有事件路由到父項? – userg1

1

我認爲你可以做到這一點,但你應該知道,不常見的事件不能與其他控件相關聯。

public partial class UserControl1 : UserControl 
{ 
    public UserControl1() 
    { 
     InitializeComponent(); 

     foreach (Control control in this.Controls) 
     { 
      control.Click += new EventHandler(control_Click); 
     } 
    } 

    private void control_Click(object sender, EventArgs e) 
    { 
     this.UserControl1_Click(sender, e); 
    } 

    private void UserControl1_Click(object sender, EventArgs e) 
    { 

    } 
} 
相關問題