点击事件的功能

时间:2013-03-19 21:44:15

标签: c# picturebox mouseclick-event

我想实施Nine Men's Morris Game。 我有一个带24个图片框的电路板,左侧和右侧有9个红色图片框和9个绿色图片框。
我想将它们添加到列表中:

 List<PictureBox> ls = new List<PictureBox>();
 private void Form1_Load(object sender, EventArgs e)
    {


        for (int i = 1; i <= 24; i++)
        {
            PictureBox p = new PictureBox();
            p.Name = "pictureBox" + i;
            ls.Add(p);
        }

    }

没关系?

是否有可能做到这样的事情:我想点击24个图片框中的一个,并使该图片框的背景变成一次绿色和一次红色? 我的意思是递归函数或类似的东西可以识别当我点击图片框,在列表中搜索该图片框并更改他的背景颜色?

enter image description here

3 个答案:

答案 0 :(得分:4)

这里你不需要任何pictureBox列表。

for (int i = 1; i <= 24; i++)
{
     PictureBox p = new PictureBox();
     p.Click += p_Click;
     //of course, somecontrol.Controls.Add(p);
     //for ex: this.Controls.Add(p);
}

-

void p_Click(object sender, EventArgs e)
{
    ((PictureBox)sender).BackColor = Color.Green;
}

修改

您似乎正在尝试向所有pictureBox添加事件处理程序

**parentControl**.Controls.OfType<PictureBox>()
                 .ToList().ForEach(p => p.Click+=p_Click);

答案 1 :(得分:2)

我假设24张PictureBoxes的列表应该代表一个九人莫里斯板上可以定位玩家男人的点。

I4V是对的,您需要做的就是为每个图片框添加一个点击处理程序。如果您希望背景在绿色和红色之间交替显示,请保留原始列表,但在其中添加点击处理程序

for (int i = 1; i <= 24; i++)
{
    PictureBox p = new PictureBox();
    p.Name = "pictureBox" + i;
    p.Click += p_Click; // <----------
    ls.Add(p);
}

修改i4v的点击处理程序,使用当前背景颜色确定新的背景颜色。

void p_Click(object sender, EventArgs e)
{
    PictureBox p = (PictureBox)sender);
    p.BackColor = p.BackColor == Color.Green ? Color.Red : Color.Green;
}

其他几点。

  • 您没有设置初始背景颜色,因此在点击之前它将是默认颜色,此时它将设置为绿色(因为绿色不是默认背景颜色)。
  • 为什么要将您的图片框命名为其List index + 1?为什么不使用List索引和0的自然C#迭代:for (int i = 0; i < 24; i++)

答案 2 :(得分:0)

您概述的方法不起作用,但是使用传递给事件处理程序的sender对象还有另一种方法可以做同样的事情:

private void Form1_Load(object sender, EventArgs e)
{
    for (int i = 1; i <= 24; i++)
    {
        PictureBox p = new PictureBox();
        p.Name = "pictureBox" + i;
        p.Click += PictureBox_Click;
    }
}

void PictureBox_Click(object sender, EventArgs e)
{
    PictureBox event_picturebox = (PictureBox)sender;
    event_picturebox.BackColor = Color.White;
}

您只需将要运行此事件的每个图片框映射到同一事件,然后事件就可以对此pictureBox执行操作,因为传入了对它的引用。

如果您已经在表单中定义了图片框,则只需要执行以下操作:

private void Form1_Load(object sender, EventArgs e)
{
    pictureBox1.Click += PictureBox_Click;
    pictureBox2.Click += PictureBox_Click;
    // and keep going

    // OR
    // this is a bit dangerous if you don't want ALL 
    // your picture boxes to have this event
    // also assumes that you know picturebox1 exists.
    foreach (object f in this.Controls)
    {
        if (f.GetType().Equals(pictureBox1.GetType()))
        {
            ((PictureBox)f).Click += button_Click;
        }
    }
}