.NET WINDOWS 开发中如何查找一个控件,或者列出所有在WINFORM上的控件? 知道控件的句柄直接用就行了,除非是私有的,呵呵,所以没必要象web一样FINDCONTROL()要转换思维,毕竟表现的平台不同了! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Form theForm = new Form(……);theForm 就是句柄,你也可以叫它引用,呵呵,叫指针也可以,呵呵! 那handle是?我知道可以通过窗体定义的控件变量来访问,但是如果我现在知道这个控件的名称(字符串类型)如何找到这个控件?如你上面所说的,现在有Form theForm = new Form(……);那我知道“theForm”怎么找到这个FORM? 为什么一定要通过字符串来找呢,web中用字符传来传去,那是因为在b和s之间传递对象不方便快皆,现在你做win程序了,对象就在那里,不过是引用来引用去,还要那一套做什么啊,你知道“theForm”了,知道他的类型,那就直接Form newForm = theForm;就可以了,难道一定弄个Form newForm = this.FindContrl("theForm");,非得这样写才舒服?把FindContrl()方法反编译一下你会看到,其实也是声明了一个同类型对象的引用然后赋予id属性的!因为最开始建立的对象在发向客户端以后已经释放了!不知道表达清楚了吗! 也许我理解不了你的需求吧,我真的体会不到你这么做的出发点在那里,如果真的有必要这么做,自己写个哈希类,定义两个方法,一个是根据名称(string)注册对象(object类型),一个是根据名称检索对象并返回就可以了!每实例化一个对象就注册进去,就可以用于后期检索了!其他的帮不上什么了,希望你的问题早日解决!顺祝: 快乐!!! foreach(Control ctrl in this.Controls){........} 这个问题是不太好,要一个个的在Controls里找,但是在VS2005里面好像有一个IndexOfName(Name)这个方法,VS2003就没有这个方法. 用引用法并不是很方便,很多时候我们需要动态发现,这需用到反射,楼主的问题能得到很好地解决/// <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"); 如果需要遍历窗体下的控件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 ... }} iis掛機 winform 怎么 做报表 Form先最小化,然后恢复就出错。。。 字符串截取请大哥门指教一下 如何调用外部程序并等待它执行完毕 使用 mono.cecil,load 一个dll,创建里面定义的类的实例? Process.Start(ProcessStartInfo) 调用的程序退不出去?? 请问如何映射外键关系到DataSet的构架中? C#中怎样才能搜索文件呢? 一个控件动态显示问题 如何用dataset删除数据库的一个表里的所有记录 不同服务器间共享文件的问题?
theForm 就是句柄,你也可以叫它引用,呵呵,叫指针也可以,呵呵!
我知道可以通过窗体定义的控件变量来访问,但是如果我现在知道这个控件的名称(字符串类型)如何找到这个控件?
如你上面所说的,现在有Form theForm = new Form(……);那我知道“theForm”怎么找到这个FORM?
把FindContrl()方法反编译一下你会看到,其实也是声明了一个同类型对象的引用然后赋予id属性的!因为最开始建立的对象在发向客户端以后已经释放了!不知道表达清楚了吗!
快乐!!!
{
........
}
/// <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");
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 ...
}
}