在Windows窗体用户控件中单击子项时,触发父父点击事件

时间:2011-04-29 16:19:39

标签: user-controls delegates event-handling click windows-forms-designer

我有一个用户控件

    public partial class ButtonControl : UserControl

有两个标签和图片框控件

        this.pictureBox1 = new System.Windows.Forms.PictureBox();
        this.text = new System.Windows.Forms.Label();

我在windows窗体中使用过这个控件

this.appointmentButton = new DentalSoft.UI.Controls.ButtonControl();

创建了一个活动

            this.appointmentButton.Click += new System.EventHandler(this.appointmentButton_Click);

enter image description here

但问题是,如果我点击控件内部的图像或标签,则不会触发点击事件。 无论用户在控件内部单击何处,我都要触发此单击事件。有可能吗?

2 个答案:

答案 0 :(得分:8)

是的,这很简单。当您单击子控件时,他们会收到click事件,而用户控件则不会。因此,您可以订阅子控件单击事件,当它们发生时,只需引发usercontrol单击事件,无论鼠标位于何处,它都会显示为单击。

只需双击图片框和标签即可创建点击事件处理程序,然后添加一行代码以调用父usercontrol OnClick方法。

    private void text_Click(object sender, EventArgs e)
    {
        this.OnClick(new EventArgs());
    }

    private void pictureBox1_Click(object sender, EventArgs e)
    {
        this.OnClick(new EventArgs());
    }

答案 1 :(得分:0)

我通过以下方式解决了这个问题。我想在单击子Label时更改父PictureBox的背景图像。我玩了一些,发现可以通过以下方式调用事件处理程序。

    private void Label_Click(object sender, EventArgs e)
    {
        Label label = (Label)sender;
        Box_Click(label.Parent, e);
    }


    private void Box_Click(object sender, EventArgs e)
    {
        //
        PictureBox box = sender as PictureBox;

        //
        if (isMine[int.Parse(box.Name)])
        {
            box.Image = Image.FromFile(@"..\..\images\BoxRedX.jpg");
            MessageBox.Show("Game Over");
        }
        else
        {
            box.Image = Image.FromFile(@"..\..\images\BoxGray.jpg");
        }
    }

如您所见,我抓住了孩子,并使用它来引用其父对象并将其发送给父母click事件。这是我在项目中使用的代码。重要的方法是首先列出的。第二个是为了清楚起见,以了解它是如何通过和工作的。