0

我正在初始化一个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()...(等等)。因为我需要EventHandler每个PictureBox. 我可以通用EventHandlerpicBox_Click()没有任何问题,但是这样做我得到了一种方法,PictureBox点击不同后我不能做不同的事情PictureBox。任何想法将不胜感激。

提前致谢...

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

图框0 图框1 图框2

图框3 图框4 图框5

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

4

2 回答 2

2

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

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));       
}
于 2012-11-29T19:25:02.227 回答
1

无需在这里复杂化,这对您来说将是一个简单的解决方案

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

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);
    } 
} 
于 2012-11-29T18:38:44.563 回答