添加带有 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
。我可以毫无问题地制作一般的EventHandler
、picBox_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的主要内容,如果未能解决你的问题,请参考以下文章
C# 在带有 Graphics.DrawLine() 的 PictureBox 上绘制不适用于 Paint 事件