Re: [問題] 如何觸發動態產生的物件的Click事件
※ 引述《stu87616 (以光為名)》之銘言:
: 我動態new了幾個PictureBox出來,
: 並且+=給它們Click的事件,
: 讓使用者在按下這些圖片的時候會有所動作;
: 但另外我也想在別的地方,某些別的事件也會觸發按下那些圖片的事件。
: 通常已經存在的物件(並且有Click事件),
: 要從別的地方觸發Click很簡單,大概就像是:
: button_Click(null, e);
: 但動態生成出來的PictureBox就不知道怎麼寫了,
: 我現在的寫法是:
: var thePic = (PictureBox)Controls.Find("物件Name", true)[0];
: //先用Name屬性把我要的物件抓出來
: thePic_Click(null ,e);
: //就我所知道寫法是這樣...不過沒過,編譯器是完全看不懂的程度
: //順帶一提我的PictureBox Click觸發函式名稱就是Pic_Click,依樣畫葫蘆而已
依樣畫葫蘆? 所以實際上根本沒有 thePic_Click 這個方法?
可以試著在動態產生 PictureBox 時把 Click 事件加上去
都加同一個方法
原來的Click方法應該像這樣:
private void button1_Click(object sender, EventArgs e)
當事件觸發的時候~可以把 sender 轉回 PictureBox
靠 name 或其它方法去判斷出是哪個動態物件
: 不知道哪裡做錯了,Google半天也理不出所以然來,只好來板上問問看眾高手們。
: 另外再一問,像這樣使用Controls.Find找出那些動態生成的物件的做法,是好的嗎?
: 這樣問好像有點奇怪,只是我一直覺得這種做法似乎有點...大費周章?
感覺它是用for迴圈去找全部的控制項?
但是除了 Controls.Find之外
其實它還有 Controls["name"] 和 Controls[index] 可以用
所以...它應該不是走訪全部?
google 了一下沒找到答案
有請瞭解的版友解答 XD
: 比起.Find,.GetChildAtPoint直接抓座標的做法(假設我很確定它就在那裏)會比較優嗎?
: 懇請賜教
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 122.117.152.17
推
09/15 19:29, , 1F
09/15 19:29, 1F
→
09/15 19:29, , 2F
09/15 19:29, 2F
→
09/15 19:30, , 3F
09/15 19:30, 3F
不知道怎麼呼叫?
如果照我說的~在動態產生的時候把事件加上去
那就不用特地去呼叫了啊? 因為已經綁上去了~不是嗎?
※ 編輯: andymai 來自: 122.117.152.17 (09/15 19:44)
推
09/15 20:02, , 4F
09/15 20:02, 4F
綁了就會動了吧?有實際試過了嗎?
→
09/15 20:02, , 5F
09/15 20:02, 5F
→
09/15 20:03, , 6F
09/15 20:03, 6F
→
09/15 20:03, , 7F
09/15 20:03, 7F
→
09/15 20:04, , 8F
09/15 20:04, 8F
→
09/15 20:04, , 9F
09/15 20:04, 9F
→
09/15 20:05, , 10F
09/15 20:05, 10F
→
09/15 20:05, , 11F
09/15 20:05, 11F
不用再額外去呼叫Pic_Click啊
既然你已經寫了 Pic.MouseDown += new MouseEventHandler(Pic_Click);
那在Pic的MouseDown就會觸發Pic_Click這個方法啊...
原PO應該還沒搞清楚EventHandler的用意?
如果是這樣~建議看一下delegate並找個簡單的範例實做
然後想一下~這樣做的用義在哪裡?
接著有空再看delegate和eventhandler的差別...
※ 編輯: andymai 來自: 114.39.141.191 (09/16 01:15)
推
09/16 01:14, , 12F
09/16 01:14, 12F
→
09/16 01:15, , 13F
09/16 01:15, 13F
→
09/16 01:15, , 14F
09/16 01:15, 14F
@@ 所以你是要在程式中動態呼叫Pic_Click?
而不是動態產生PictureBox之後
使用者按下動態產生的PictureBox才觸發Pic_Click?
※ 編輯: andymai 來自: 114.39.141.191 (09/16 01:18)
推
09/16 01:20, , 15F
09/16 01:20, 15F
→
09/16 01:20, , 16F
09/16 01:20, 16F
@@?
那在程式動態呼叫時應該要先知道是要處理哪個PictureBox吧?
個人目前想到的會是下面這樣:
PictureBox p = null;
for(int i = 0; i < X; i++)
{
p = new PictureBox();
p.Name = "pic" + i;
p.MouseDown += new MouseEventHandler(Pic_Click);
this.Controls.Add(p);
}
private void Pic_Click(object sender, MouseDownEventArgs)
{
//經由sender判斷要處理哪一個PictureBox
MessageBox.Show("Click " + ((PictureBox)sender).Name);
}
這樣就可以在程式中也呼叫Pic_Click
把想要處理的PictureBox傳進去處理了
手邊沒VS~所以這段code沒編過
但我想應該差不多了...
※ 編輯: andymai 來自: 114.39.141.191 (09/16 01:37)
推
09/16 01:44, , 17F
09/16 01:44, 17F
→
09/16 01:45, , 18F
09/16 01:45, 18F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 6 篇):
C_Sharp 近期熱門文章
PTT數位生活區 即時熱門文章