作者andymai (人生只有一次)
看板C_Sharp
标题Re: [问题] 如何触发动态产生的物件的Click事件
时间Sat Sep 15 18:21:41 2012
※ 引述《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
1F:推 stu87616:感谢大大的回答 经提醒似乎有直接抓名称的方法 而且似乎 09/15 19:29
2F:→ stu87616:会比较快 另外我应该是很确定有抓到我要的控制项 09/15 19:29
3F:→ stu87616:但是我不知道怎麽呼叫我先前写的Click事件 09/15 19:30
不知道怎麽呼叫?
如果照我说的~在动态产生的时候把事件加上去
那就不用特地去呼叫了啊? 因为已经绑上去了~不是吗?
※ 编辑: andymai 来自: 122.117.152.17 (09/15 19:44)
4F:推 stu87616:不太懂大大的意思..虽然绑了但还是给它命令才会动吧?! 09/15 20:02
绑了就会动了吧?有实际试过了吗?
5F:→ stu87616:我把我部分的cade贴上来 09/15 20:02
6F:→ stu87616:this.Controls.Add(Pic); 09/15 20:03
7F:→ stu87616:Pic.MouseDown += new MouseEventHandler(Pic_Click); 09/15 20:03
8F:→ stu87616:然後我下面再写 void Pic_Click(..)的内容 09/15 20:04
9F:→ stu87616:问题出在我不知道如何动态呼叫这个Pic_Click了 09/15 20:04
10F:→ stu87616:不知道是不是我哪里误解了@@ 09/15 20:05
11F:→ stu87616:啊 打太快打错了 是code 09/15 20:05
不用再额外去呼叫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)
12F:推 stu87616:那Pic的MouseDown要如何呼叫呢@@? 09/16 01:14
13F:→ stu87616:我写过Pic.MouseDown(); 出现只可以出现在+=或-=左边的 09/16 01:15
14F:→ stu87616:错误讯息 09/16 01:15
@@ 所以你是要在程式中动态呼叫Pic_Click?
而不是动态产生PictureBox之後
使用者按下动态产生的PictureBox才触发Pic_Click?
※ 编辑: andymai 来自: 114.39.141.191 (09/16 01:18)
15F:推 stu87616:对对 我需要动态呼叫 不过也同时需要使用者按下触发 09/16 01:20
16F:→ stu87616:动态呼叫会写在别的地方(别的函式) 09/16 01:20
@@?
那在程式动态呼叫时应该要先知道是要处理哪个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)
17F:推 stu87616:感谢大大热心解说 是我一直往错误的方向去思考... 09/16 01:44
18F:→ stu87616:以为要用thePic_Click这种方式去呼叫Click 09/16 01:45