2013-10-12 39 views
1

代碼:我創建了一個pictureBoxes數組我如何註冊一個事件到所有的pictureBoxes?

pbs = new PictureBox[8]; 
for (int i = 0; i < pbs.Length; i++) 
{ 
    pbs[i] = new PictureBox(); 
    pbs[i].MouseEnter += Form1_MouseEnter; 
    pbs[i].MouseLeave += Form1_MouseLeave; 
    pbs[i].Size = new Size(100, 100); 
    pbs[i].Margin = new Padding(0, 0, 0, 60); 
    pbs[i].Dock = DockStyle.Top; 
    pbs[i].SizeMode = PictureBoxSizeMode.StretchImage; 
    Panel p = i < 4 ? panel1 : panel2; 
    p.Controls.Add(pbs[i]); 
    pbs[i].BringToFront(); 
} 

我所做的:

pbs[i].MouseEnter += 

當我點擊TAB它做:Form1_MouseEnter 這不是我想要的。

我想,當我在每個pictureBoxes區域用鼠標移動它會做什麼。 所有pictureBoxes的一個事件。 如果我移到pictureBox1做某事pictureBox2一樣...

我該怎麼辦呢?我不想爲每個pictureBox創建8個事件,而是爲所有人輸入事件。

+0

我想,當我點擊TAB將增加:pbs_MouseEnter或類似的東西那。 –

+0

你也可以自己輸入處理程序名稱。 –

回答

1

你需要簡單的寫

pbs[i].MouseEnter += globalMouseEnterEvent; 
當然

,你需要有一個globalMouseEnterEvent地方在你的代碼

public void globalMouseEnterEvent(object sender, System.EventArgs e) 
{ 
    .... 
} 

但是,當您的事件與衆多控件共享時,需要另一條信息。您需要識別觸發事件的控件。使用sender參數傳遞控件實例,您可以將其轉換爲適當的控件類型,但需要爲控件提供唯一標識符。就像當你建立控制

for (int i = 0; i < pbs.Length; i++) 
{ 
    ..... 
    pbs[i].Tag = "PB" + i.ToString() 
    ... 
} 

所以在代碼的MouseEnter設置標籤或名稱的屬性,你可以寫

public void globalMouseEnterEvent(object sender, System.EventArgs e) 
{ 
    PictureBox p = sender as PictureBox; 
    if(p.Tag.ToString() == "PB1") 
     ..... 
    else if ...... 
} 
0

不使用form1_event,複製它的代碼並將其重命名

pbs[i].MouseEnter += yourEventName 

它足夠

0

你在做什麼是絕對正確的,你附加處理程序事件每個控制器在 轉,以便相同的處理器適用於每個PictureBox

我猜你的問題是,VS創建方法被命名爲Form1_MouseEnter。這完全無關緊要,決定什麼方法可以處理的是運營商,而不是其名稱。試着運行你的原代碼,它會做你想做的。

這似乎是在C#編輯器中的錯誤,雖然,因爲它應該有一個名爲自動生成的處理器更合適些,但無論如何,你可以事後重命名方法,以反映其真正的意義。

-1

我試着從別人的技巧適用於您的代碼:

pbs = new PictureBox[8]; 
for (int i = 0; i < pbs.Length; i++) 
{ 
    pbs[i] = new PictureBox(); 
    pbs[i].MouseEnter += Picturebox_MouseEnter; 
    pbs[i].MouseLeave += PictureBox_MouseLeave; 
    pbs[i].Name = string.Concat("PB", i); //Added to identify each picturebox 
    pbs[i].Size = new Size(100, 100); 
    pbs[i].Margin = new Padding(0, 0, 0, 60); 
    pbs[i].Dock = DockStyle.Top; 
    pbs[i].SizeMode = PictureBoxSizeMode.StretchImage; 
    Panel p = i < 4 ? panel1 : panel2; 
    p.Controls.Add(pbs[i]); 
    pbs[i].BringToFront(); 
} 

而且處理程序:

private void Picturebox_MouseEnter(object sender, EventArgs e) 
{ 
    PictureBox pb = sender as PictureBox; 
    if (pb != null) 
    { 
     if (pb.Name == "PB2") 
     { 
      //Do PB2 specific task 
     } 
     //Your code when mouse enters one of the pictureboxes 
     //Use Name property to determine wich one, if needed 
    } 
} 

private void PictureBox_MouseLeave(object sender, EventArgs e) 
{ 
    //Your code when mouse leaves one of the pictureboxes 
    //Use Name property to determine wich one, if needed 
} 
+0

爲什麼downvote ..? – TDull

相關問題