我一个窗体中有很多控件,
如它们的name为a,b,c,d
如果我要启用或者禁用就直接设置a.Enabled,b.Enabled的BOOL值,但现在我不能通过这样直接实现,而我现在只有"a","b","c","d"这些字符 
我想实现通过这些字符来实现这些控件的Enabled的属性,高手回答我,如何实现,谢谢!!!

解决方案 »

  1.   

    foreach( Control con in this.Controls)
    {
    if( con.Name == "a")
    con.Enabled = false;
    }
      

  2.   

    public void SetCtrlEnabled(Control parent, string name, bool enable)
    {

    foreach( Control con in parent.Controls)
    {
    if( con.Name == name)
    con.Enabled = enable;
    if(con.Controls.Count >0)
    {
       SetCtrlEnabled(con,name,enable);  
    }
    }


    }
    //调用
    this.SetCtrlEnabled(this,"button3",false);
      

  3.   

    http://blog.csdn.net/cnbabycrazy/archive/2005/11/30/539785.aspx
      

  4.   

    A objA = new A();
    Type typeA = objA.GetType();
    FieldInfo fiA = typeA.GetField("b",BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
    MethodInfo meA = typeA.GetMethod("sample",BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
      

  5.   

    @serversql(啊初) 
    能不能解释一下呀~~谢谢
      

  6.   

    反射性能不好,还不如用foreach
      

  7.   

    同意用反射。不过我确实不知道反射跟 foreach 比哪个性能好。如果楼主需要用反射,看看我的 blog: http://blog.csdn.net/efijki/archive/2006/04/06/652993.aspx内容很初级,但你可以看个大概,然后自己写一下就明白了
      

  8.   

    显然是foreach性能好.. 不信自己试~~~
    foreach( Control con in this.Controls)
    {
    if( con.Name == "a")
    con.Enabled = false;
    }
    -----我来解释吧
    A objA = new A(); -- 这个略
    Type typeA = objA.GetType(); -- 得到该类的类型对象
    FieldInfo fiA = typeA.GetField("b",BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);----- 在这个类型中获取属性(GetField),第一个是你的属性名,第二个是一组参数.  非公有|实例(非静态)|公有下面也相同之不过是执行反色的方法.可以有方法的参数与返回植,具体的去参照msdn.
    MethodInfo meA = typeA.GetMethod("sample",BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
      

  9.   

    foreach( Control con in this.Controls)
    {
    if( con.Name == "a")
    con.Enabled = false;
    }
      

  10.   

    反射要经过绑定和调用两步,前者要遍历类成员定义的元数据,然后进行字符串对较.至于和遍历所有控件哪个快不好说,性能都不怎么好.如果以后还要操作这些字段,建议不管用哪种方法,在得到某个字段的引用后,用一个Hashtable进行缓存,以备后用. 
    例如,如果用反射,像楼上提到的:FieldInfo fiA = typeA.GetField("b",BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);,你可以把fia缓存起来,以后再调用时可以这样来用,fiA.SetValue(value,obj),这里的value是要设置的值,obj是要设置的对像,在这里就是this.
    如果用遍历,得到某个可用字段的引用后可以缓存起来,以后直接调用.例如
    //缓存时
    Hashtable h = new Hashtable();
    h["b"] = b;
    //以后调用时
    Control c = (Control)h["b"];
    c.Enabled = false;
      

  11.   

    还是用Foreach循环遍历比较好,而且比较清晰易懂。