C# 将控件的MouseClick事件传递给其容器

C# 将控件的MouseClick事件传递给其容器,c#,visual-studio,mouseclick-event,C#,Visual Studio,Mouseclick Event,我会尽量简明扼要但易于理解。我有一个动态的二维PictureBox元素数组,它们都通过以下方式添加到相同的表单中: this.Controls.Add(PictureBoxArray[i,j]); 现在,我设计了一个算法,可以确定单击了这些PBs中的哪一个,但我将它放在了ParentForm_MouseClick方法中。现在我发现了一个悖论。我创建的算法返回正确的输出,但是ParentForm\u MouseClick方法仅在单击表单中的空白时调用,而不是在单击PictureBoxes时调用。

我会尽量简明扼要但易于理解。我有一个动态的二维PictureBox元素数组,它们都通过以下方式添加到相同的表单中:

this.Controls.Add(PictureBoxArray[i,j]);
现在,我设计了一个算法,可以确定单击了这些PBs中的哪一个,但我将它放在了ParentForm_MouseClick方法中。现在我发现了一个悖论。我创建的算法返回正确的输出,但是ParentForm\u MouseClick方法仅在单击表单中的空白时调用,而不是在单击PictureBoxes时调用。所以我的问题是-当用户单击表单中的任意位置时,我如何调用ParentForm\u MouseClick方法,即我是否可以以某种方式覆盖PictureBoxes的MouseClick事件,从而调用ParentForm\u MouseClick方法


编辑:这是我刚刚想到的,我是否可以创建一个自定义PictureBoxClass类来扩展.NET类,并重写MouseClick事件来调用我以前编写的方法?

看起来事情太复杂了。如果需要从不同的位置调用事件处理程序中的代码,最好将其抽象为不同的方法。您可以将相同的事件处理程序附加到PictureBoxes,然后PictureBoxes调用该方法

for(int i = 0; i < PictureBoxArray.GetLength(0); i++) 
{
    for(int j = 0; j < PictureBoxArray.GetLength(1); j++)
    {
        //attach handler
        PictureBoxArray[i,j].Click += pictureBox_Click;
    }
}


void pictureBox_Click(object sender, EventArgs e)
{
   MyMethod();      
}

void parentForm_Click(object sender, EventArgs e)
{
   MyMethod();       
}

private void MyMethod()
{
   //method to be called
}

为什么不给每个picturebox分配一个鼠标点击事件呢?然后没有任何算法,您只需使用事件的发送者,这是最简单的方法。但我有8x8数组,据我所知,.NET中没有Control.setOnClickEventMethod,因此我必须为每个数组单独实现它。您可以遍历数组并附加事件处理程序。对于为什么需要触发窗体的MouseClick事件,没有很好的解释。如果你不解释这一点的话,有太多的方法让你喜欢其中一种,没有一种特别漂亮。一种非常简单的方法是将PB的MouseClick事件的事件处理程序设置为表单的MouseClick事件处理程序。它们不一定是不同的方法。我应用了Hans和keyboardP的解决方案。我已附加ParentForm_MouseClick作为所有PB元素的事件处理程序。但是,如果您这样做是为了在try/catch块中封装该方法,请小心,因为当您在框外单击时,它显然会引发IndexOutOfBoundsException。谢谢你的帮助