在Windows窗体用户控件中,当单击子元素时触发父元素的单击事件。

5

我有一个用户控件

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

输入图像描述

问题是,如果我单击控件内的图像或标签,则无法触发单击事件。我希望无论用户在控件内的哪个位置单击,都能触发此单击事件。这是否可能?

2个回答

8

是的,这是一个简单的问题。当您单击子控件时,它们会接收到点击事件,而用户控件不会。因此,您可以订阅子控件的点击事件,当它们发生时,只需触发用户控件的点击事件,无论鼠标位于何处,它都会表现为点击。

只需双击PictureBox和Label创建点击事件处理程序,然后添加一行代码调用父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());
    }

0
我是这样解决这个问题的。当单击子标签时,我想更改父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");
        }
    }

正如您所看到的,我抓取了子元素并使用它来引用其父元素,并将其发送到父元素的点击事件。这是我在项目中使用的代码。重要的方法是第一个列出的方法。第二个方法是为了清晰地看到它是如何传递和工作的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接