我创建了一个pictureBoxes数组,我如何注册所有pictureBoxes的事件?

时间:2013-10-12 13:40:23

标签: c# winforms

代码:

pbs = new PictureBox[8];
for (int i = 0; i < pbs.Length; i++)
{
    pbs[i] = new PictureBox();
    pbs[i].MouseEnter += Form1_MouseEnter;
    pbs[i].MouseLeave += Form1_MouseLeave;
    pbs[i].Size = new Size(100, 100);
    pbs[i].Margin = new Padding(0, 0, 0, 60);
    pbs[i].Dock = DockStyle.Top;
    pbs[i].SizeMode = PictureBoxSizeMode.StretchImage;
    Panel p = i < 4 ? panel1 : panel2;
    p.Controls.Add(pbs[i]);
    pbs[i].BringToFront();
}

我做了:

pbs[i].MouseEnter +=

当我点击TAB时,它确实:Form1_MouseEnter 这不是我想要的。

我希望当我用鼠标移动到每个pictureBoxes区域时,它会做一些事情。 所有pictureBoxes的一个事件。 如果我移动pictureBox1做某事...... pictureBox2相同......

我该怎么办?我不想为每个pictureBox创建8个事件,而是为所有人创建一个事件。

4 个答案:

答案 0 :(得分:1)

你只需要写

pbs[i].MouseEnter += globalMouseEnterEvent;

当然,您需要在代码中的某处globalMouseEnterEvent

public void globalMouseEnterEvent(object sender, System.EventArgs e)
{
    ....
}

但是,当您在多个控件之间共享事件时,需要另一条信息。您需要识别触发事件的控件。控件实例使用您可以强制转换为适当控件类型的sender参数传递,但需要为控件提供唯一标识符。就像在构建控件时设置Tag或Name属性一样

for (int i = 0; i < pbs.Length; i++)
{
  .....
  pbs[i].Tag = "PB" + i.ToString()
  ...
}

所以在MouseEnter代码中你可以编写

public void globalMouseEnterEvent(object sender, System.EventArgs e)
{
    PictureBox p = sender as PictureBox;
    if(p.Tag.ToString() == "PB1")
        .....
    else if ......
}

答案 1 :(得分:0)

不要使用form1_event,复制它的代码并重命名

pbs[i].MouseEnter += yourEventName

够了

答案 2 :(得分:0)

您所做的是绝对正确的,您将处理程序附加到每个控件的事件中 转,这样同一个处理程序适用于每个PictureBox

我猜您的问题是VS创建的方法名为Form1_MouseEnter。这完全无关紧要,决定方法将处理什么的是+=运算符,而不是它的名称。只需尝试运行您的原始代码,它就能完成您想要的任务。

它似乎是C#编辑器中的一个错误,因为它应该将自动生成的处理程序命名为更合适的东西,但无论如何,您可以在之后重命名该方法以反映其真实含义。

答案 3 :(得分:-1)

我尝试将其他人的提示应用到您的代码中:

pbs = new PictureBox[8];
for (int i = 0; i < pbs.Length; i++)
{
    pbs[i] = new PictureBox();
    pbs[i].MouseEnter += Picturebox_MouseEnter;
    pbs[i].MouseLeave += PictureBox_MouseLeave;
    pbs[i].Name = string.Concat("PB", i); //Added to identify each picturebox
    pbs[i].Size = new Size(100, 100);
    pbs[i].Margin = new Padding(0, 0, 0, 60);
    pbs[i].Dock = DockStyle.Top;
    pbs[i].SizeMode = PictureBoxSizeMode.StretchImage;
    Panel p = i < 4 ? panel1 : panel2;
    p.Controls.Add(pbs[i]);
    pbs[i].BringToFront();
}

处理程序:

private void Picturebox_MouseEnter(object sender, EventArgs e)
{
    PictureBox pb = sender as PictureBox;
    if (pb != null)
    {
        if (pb.Name == "PB2")
        {
            //Do PB2 specific task
        }
        //Your code when mouse enters one of the pictureboxes
        //Use Name property to determine wich one, if needed
    }
}

private void PictureBox_MouseLeave(object sender, EventArgs e)
{
    //Your code when mouse leaves one of the pictureboxes
    //Use Name property to determine wich one, if needed
}