添加带有 Picturebox 数组的单个 EventHandler

Posted

技术标签:

【中文标题】添加带有 Picturebox 数组的单个 EventHandler【英文标题】:Add individual EventHandler with array of Picturebox 【发布时间】:2012-11-17 21:39:43 【问题描述】:

我正在初始化一个PictureBox 的数组。问题是,我不能为每个单独添加EventHandler。我在 for 循环中有这段代码:

picBoxs[i] = new PictureBox();
picBoxs[i].Anchor = AnchorStyles.None;
picBoxs[i].Location = new Point(x, y);
picBoxs[i].Size = new Size(104, 104);
picBoxs[i].SizeMode = PictureBoxSizeMode.Normal;
picBoxs[i].BorderStyle = BorderStyle.FixedSingle;
//this.picBoxs[i].Click += new System.EventHandler(this.picBoxs_Click); //Single EventHandler for all PictureBox(s)
this.picBoxs[i].Click += new System.EventHandler(this.picBoxs[i]_Click); //Generates error

我想要picBoxs1_Click()picBoxs2_Click()picBoxs3_Click() ...(等等)。因为每个PictureBox 都需要EventHandler。我可以毫无问题地制作一般的EventHandlerpicBox_Click(),但是这样做我得到了每个PictureBox 的方法,单击不同的PictureBox 后我不能做不同的事情。任何想法将不胜感激。

提前谢谢...

编辑: 我想,当我单击 PictureBox 时,会出现一个消息框,告诉我二维数组的索引。假设我的图片框是这样排列的:

picBox0 picBox1 picBox2

picBox3 picBox4 picBox5

点击picBox2:MessageBox会说“[0][2]”,和点击picBox4:MessageBox会说“[1][1]”一样……

【问题讨论】:

“生成错误”非常模糊,我们不知道您尝试使用哪种方法。请给出更完整的代码。见tinyurl.com/so-list 现在请阅读编辑(下面的代码)。 【参考方案1】:

使用单个事件处理程序,如下所示:

this.picBoxs[i].Click += picBoxs_Click;

在该事件处理程序中,您可以查找有关您的图片框的信息:

void picBoxs_Click(object sender, EventArgs e)

    var box = sender as PictureBox;
    int i = Array.IndexOf(picBoxs, box);

    int columnCount = 3;
    int row = i / columnCount;
    int col = i % columnCount;

    Messagebox.Show(string.Format("[0][1]", row, col));       

【讨论】:

【参考方案2】:

这里不用太复杂,这对你来说是一个简单的解决方案

首先,声明一个带有每个框大小的全局常量

const int BOX_SIZE = 128;

然后创建所有这些盒子

this.picBoxs[i].Click += new System.EventHandler(Boxes_Click);
picBoxs[i].Location = new Point(x*BOX_SIZE, y*BOX_SIZE);
picBoxs[i].Size = new Size(BOX_SIZE,BOX_SIZE);

最后是事件处理程序:

void Boxes_Click(object sender, EventArgs e)

    PictureBox theBox = sender as PictureBox;
    if(theBox != null)
    

         MessageBox.Show("Box was clicked, x: 0 y:1", 
                         theBox.Location.X / BOX_SIZE, 
                         theBox.Location.Y / BOX_SIZE);
     
 

如果这不适合您,请创建一个派生 PictureBox 的类,并添加一个名为 Coordinates 的属性或其他内容,然后您可以在其中存储 Box 的坐标。

class MyPictureBox : PictureBox

    public Point Coordinates  get; set;

然后:

int size_w = 128;
int size_h = 128;

...

MyPictureBox[] picBoxs = new MyPictureBox[1000];

...

picBoxs[i].Click += new System.EventHandler(Boxes_Click);
picBoxs[i].Coordinates = new Point(x,y);
picBoxs[i].Position = new Point(x * size_w, y*size_h);
picBoxs[i].Size = new Size(size_w, size_h);

...

void Boxes_Click(object sender, EventArgs e)

    MyPictureBox theBox = sender as MyPictureBox;
    if(theBox != null)
    

     MessageBox.Show("Box was clicked, x: 0 y:1", 
                     theBox.Coordinates.X, 
                     theBox.Coordinates.Y);
     
 

【讨论】:

谢谢。但我不知道会有多少个PictureBox。可以是5,也可以是500 :( 那么你需要用它们做 500 件不同的事情还是什么? 您可以直接告诉我们您想要实现的实际目标。 np。请考虑@Joel Coehororn 的独奏。它的方式更容易。

以上是关于添加带有 Picturebox 数组的单个 EventHandler的主要内容,如果未能解决你的问题,请参考以下文章

带有动画 GIF 的 C# PictureBox 跳过帧

C# 在带有 Graphics.DrawLine() 的 PictureBox 上绘制不适用于 Paint 事件

带有缩放和平移功能的 Windows 窗体的 PictureBox

单个休息“放置”端点是不是足以更新带有嵌套数组的文档?

vb中 怎么样给picturebox加滚动条?

PHP遍历函数将单个数组转换为带有子元素的嵌套数组 - 基于父ID