知道控件的句柄直接用就行了,除非是私有的,呵呵,所以没必要象web一样FINDCONTROL()
要转换思维,毕竟表现的平台不同了!

解决方案 »

  1.   

    Form theForm = new Form(……);
    theForm 就是句柄,你也可以叫它引用,呵呵,叫指针也可以,呵呵!
      

  2.   

    那handle是?
    我知道可以通过窗体定义的控件变量来访问,但是如果我现在知道这个控件的名称(字符串类型)如何找到这个控件?
    如你上面所说的,现在有Form theForm = new Form(……);那我知道“theForm”怎么找到这个FORM?
      

  3.   

    为什么一定要通过字符串来找呢,web中用字符传来传去,那是因为在b和s之间传递对象不方便快皆,现在你做win程序了,对象就在那里,不过是引用来引用去,还要那一套做什么啊,你知道“theForm”了,知道他的类型,那就直接Form newForm = theForm;就可以了,难道一定弄个Form newForm = this.FindContrl("theForm");,非得这样写才舒服?
    把FindContrl()方法反编译一下你会看到,其实也是声明了一个同类型对象的引用然后赋予id属性的!因为最开始建立的对象在发向客户端以后已经释放了!不知道表达清楚了吗!
      

  4.   

    也许我理解不了你的需求吧,我真的体会不到你这么做的出发点在那里,如果真的有必要这么做,自己写个哈希类,定义两个方法,一个是根据名称(string)注册对象(object类型),一个是根据名称检索对象并返回就可以了!每实例化一个对象就注册进去,就可以用于后期检索了!其他的帮不上什么了,希望你的问题早日解决!顺祝:
                                                 快乐!!!
      

  5.   

    foreach(Control ctrl in this.Controls)
    {
    ........
    }
      

  6.   

    这个问题是不太好,要一个个的在Controls里找,但是在VS2005里面好像有一个IndexOfName(Name)这个方法,VS2003就没有这个方法.
      

  7.   

    用引用法并不是很方便,很多时候我们需要动态发现,这需用到反射,楼主的问题能得到很好地解决
    /// <summary>
      /// 根据给定的对象和路径,获得其子孙成员
      /// </summary>
      /// <param name="pTopObject">要获得的成员是此对象的子孙,一般为Form</param>
      /// <param name="pObjPath">依此路径获取,例如: TextBox1 或TextBox1.Size</param>
      /// <param name="Index">用索引化属性的可选索引值返回</param>
      /// <returns>子孙</returns>
      public static object GetMember(object pTopObject, string pObjPath,object[] Index)
      {
       string[] strMember;
       string MemberName="";
       object obj=null;
       Type objType=null;   try 
       {
        strMember=pObjPath.Split ('.');
        for (int i=0; i<strMember.Length && strMember[i]!="" ;i++)
        {
         if (i==0) 
         {
          obj=(object)pTopObject;
          objType=pTopObject.GetType ();
         }
         MemberName=strMember[i];     obj = (object) objType.InvokeMember(MemberName, 
          BindingFlags.Public | BindingFlags.NonPublic |BindingFlags.IgnoreCase | 
          BindingFlags.Instance | BindingFlags.Static| BindingFlags.GetField |  BindingFlags.GetProperty , null, obj, null);
         if (obj!=null)     objType=obj.GetType ();
         else throw new Exception ("不能根据:" + pObjPath + "获得" + pTopObject.ToString() + "的成员:" + MemberName);
        }
        return obj;   }
       catch ( System.Exception ex  ){ throw new Exception ("获取 " + pObjPath  + " 的成员:" + MemberName + "时发生错误:\n" + ex.Message );  }
      
      }这个静态方法用于动态加载\设置对象
    用法如:
            GetMember(frmMain,"txtName");
            GetMember(frmMain,"txtName.Size")  ;
            GetMember(frmMain,"txtName.Size.Width");
      

  8.   

    如果需要遍历窗体下的控件Type objType=frmXXX.GetType();
    MemberInfo [] memberInfo= objType.GetMembers (BindingFlags.Instance | BindingFlags.GetField | BindingFlags.Public  |BindingFlags.NonPublic); 
    foreach (MemberInfo mbi in memberInfo)
    {
       if (mbi.MemberType==System.Reflection.MemberTypes.Field )       
         {
            object obj=mbi.ReflectedType.GetField (mbi.Name );       
            if ( obj is MenuItem)                                     
               //todo ... 
         }
    }