对动态创建控件属性的访问

昨天和难得一蠢讨论如何对动态创建的控件属性进行访问.当时我的想法是两点:

1.使用Controls集合来访问
2.对于事件方式触发的,可以使用sender对象.sender为Object类型,其指向发送通知的对象(见<.NET框架程序设计(修订版)P231).由此.可以通过类型转换对发出事件的对象进行访问.


对于第一种方法,毫无疑问是可行的.不过我认为这种方法适用于批量修改,在事件触发的情况下,却不是一种好方法.因为此时并不知道触发该事件的控件对象在Controls集合里的下标值.

对于第二种方法,昨天晚上试了一下,非常方便.

private void Form1_Load(object sender, EventArgs e)
        
{
            PictureBox MyPic;
            Image image 
= Image.FromFile(@"F:\IMAGES\MUSIC.jpg");
            MyPic 
= new PictureBox();
            MyPic.Image 
= image;
            MyPic.Size 
= new Size(100100);
            MyPic.Location 
= new Point(1010);
            
this.Controls.Add(MyPic);
            MyPic.Click 
+= new System.EventHandler(CommonClick);
           
           
        }


        
private void CommonClick(object sender, EventArgs e)
        
{

            PictureBox Temp 
= sender as PictureBox ;
            
if (Temp != null)
            
{
                Image image 
= Image.FromFile(@"F:\IMAGES\PHOTO.JPG");
                Temp.Image 
= image;
            }

            
        }



   

posted @ 2005-08-08 10:10 怀沙 阅读(2895) 评论(12)  编辑 收藏 网摘 所属分类: C#

  回复  引用  查看    
#1楼 2005-08-08 11:33 | 春鱼      
注意这些东西,进行貌似有道理的归纳总结,对技术水准的提高没有好处。
  回复  引用  查看    
#2楼 [楼主]2005-08-08 11:52 | 怀沙      
@春鱼
谢谢你的批评.
不过我并不认为这些东西不值得注意.
实际中确实遇到这样的问题,才会去想解决的方案,难道不对么?呵呵

另外想请教:
怎么才算对技术水准提高有好处?

  回复  引用  查看    
#3楼 2005-08-08 13:20 | 难得一蠢      
To:春鱼
你能说说如何提高技术水准吗??你是怎么提高的??什么样的总结才不是貌似有道理的呢??如果说不清楚..请不要随便发表!!

其实这个问题是这样的.我昨天在OnPaint事件中动态创建PictureBox图片..然后给PIC注册了Click事件..需要在Click事件中获取当前PIC的名称..以便对此控件操作..不过我也是第一次接触winForm..所以就和怀沙讨论..我本来想如果不行,就重新写个自定义控件代替(笨办法)..

最后是怀沙给的解决办法就是将sender拆箱..还原PIC控件..这个办法不错啊..


  回复  引用  查看    
#4楼 2005-08-08 14:39 | neuhawk      
我一般都是这么做的啊.
  回复  引用    
#5楼 2005-08-08 14:42 | rbmxxx [未注册用户]
和asp.net里差不多~
不过既然你是已经知道了这个控件触发的,怎么会不知道控件名呢?
除非n多控件都触发了这个事件你需要判断哪个控件,对于这种情况用sender.Equals(this.MyPic),对情况遍历即可,如果用sender拆箱效率不是很好啊~尤其控件多了~
不知道我说了对不对,呵呵
  回复  引用  查看    
#6楼 [楼主]2005-08-08 14:55 | 怀沙      
@rbmxxx
这里为了方便我只放了一个控件
正如你所说的,实际上有一组控件,并且要去判断是哪个控件触发事件
我本身对这方面也很不熟悉,过会试一下你说的方法:)
  回复  引用  查看    
#7楼 2005-08-08 15:00 | 难得一蠢      
to:rbmxxx
你的办法不行的..因为循环加入了一组PIC控件..每个控件的名字是name+i..都指向了一个click事件..因为不知道鼠标点击的是那个控件.所以不能用Equals...
  回复  引用    
#8楼 2005-08-08 15:19 | rbmxxx [未注册用户]
这样的话,似乎是不能这样,因为你是动态生成的~
  回复  引用  查看    
#9楼 2005-08-08 15:25 | feelwindy      
以前在做一个winform开发时,也涉及到寻找动态添加的控件,由于在winform中没有webform中的FindControl方法,所以就到处找,在codeproject上找到一遍(但现在去找又找不到了,郁闷,),记下了当时的一段代码(由于是VB.NET的,看了就头痛,所以就交给别人做了)

Protected Overridable Function FindControl(ByVal Name As String) As Control
Dim propInfo As Reflection.PropertyInfo
propInfo = Me.GetType().GetProperty(Name, Reflection.BindingFlags.IgnoreCase
Or _
Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic Or
Reflection.BindingFlags.Public)
If Not propInfo Is Nothing Then
Dim value As Object = propInfo.GetValue(Me, Nothing)
If TypeOf value Is Control Then
Return CType(value, Control)
End If
End If
Return Nothing


后来自己在做一个游戏时,也要用到这个技术了,所以就自己搞了一下(没用上面的方法)
具体的思路,可以看一下我那个游戏的源码,
在源码中,MapEditor(地图编辑器)目录下MapEditor.cs文件里有,其实思路跟上面的也差不多
http://www.cnblogs.com/lovewindy/archive/2005/06/07/169196.html
  回复  引用  查看    
#10楼 [楼主]2005-08-08 15:42 | 怀沙      
@feelwindy
本来也的确找到FindControl方法,发现没有
不过VS2005中已经有Find方法了:)
  回复  引用  查看    
#11楼 [楼主]2005-08-08 16:22 | 怀沙      
刚才读了一下feelwindy的源码,和我的实现方法基本上是一样的
  回复  引用    
#12楼 2006-01-20 19:24 | young_l [未注册用户]
楼主的这两段代码在vb.net下如何实现?尤其是这句代码:MyPic.Click += new System.EventHandler(CommonClick);


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-10-04 12:31 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: