2013-03-19 57 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