2013-03-19 70 views
0

我想实施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

+0

你高兴地使用Javascript – Sico 2013-03-19 21:48:52

+0

不..我不知道Javascript – 2013-03-19 21:51:26

回答

4

你并不需要在这里的任何图片框列表。

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; 
} 

编辑

似乎您试图将事件处理程序添加到所有pictureBoxes

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

不工作...是否可以添加pictureboxes列表?他们已经存在于设计 – 2013-03-19 21:51:08

+0

@LuciC当然,它正在工作。如果您想使用您在设计时添加的PictureBox,请在它们上面循环并添加事件处理程序。 – I4V 2013-03-19 21:53:07

+0

,但它是如何将它们添加到列表中? – 2013-03-19 21:56:47

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; 
} 

你只需要你想运行此事件相同的事件每一个图片框图,该事件随后将能够对这个图片框执行操作,因为。提到它在传递

如果您已经在表格中定义的图片框,您需要做的仅仅是这样的:

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; 
     } 
    } 
} 
+0

它是我如何将它们添加到列表中?他们已经存在于设计 – 2013-03-19 21:58:15

+0

如果我想在有限的时间内做到这一点,该怎么办?说18次...所以我只改变18个图片盒?然后做另一个点击事件,将做一些检查......这可能吗? – 2013-03-19 22:06:00

+0

是的,你可以在任何时候重新映射事件,但这似乎不是做事的最佳方式,你确定你想要所有的点击事件吗?为什么不制作一个按钮,当点击它时会做所有的检查? – Serdalis 2013-03-19 22:19:47

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; 
} 

其他几点。

  • 你不设置初始背景颜色,所以这将是默认的颜色,直到点击,当它会被设置为绿色(绿色是不是默认的背景色)。
  • 为什么将你的图片框命名为列表索引+1?为什么不直接使用List索引和0:for (int i = 0; i < 24; i++)的自然C#迭代?
+0

我在设计中手动添加了pictureboxes,所以从“pictureBox1”开始......等等,我不知道我在这里写的代码片段是以编程方式添加它们的...所以这不是我想要的......我已经拥有了主题需要把它们放在一个列表中......我不能指定所有图片盒的点击事件,因为我有超过24个,而且我只需要这些的事件处理程序24 – 2013-03-19 22:34:33

+0

所以你说这些图片框是在xaml中指定?为什么不能为xaml中的每一个指定点击处理程序? – 2013-03-19 22:55:21

+0

不,他们是在形式..我把他们拖放...但现在没关系...谢谢你的帮助 – 2013-03-19 23:04:53