求一个高效的方法:在一个FORM上查找指定名称的控件,并返回 return this.FindControl("ControlName"); 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在win form上没有FindControl这个方法啊 /// <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 ); } } 没有明白楼上的意思。我是想查找一个WIN FORM上有没有指定名称的控件,有,则返回 这个静态方法用于动态加载\设置对象用法如: GetMember(frmMain,"txtName"); GetMember(frmMain,"txtName.Size") ; GetMember(frmMain,"txtName.Size.Width"); GetMember(frmMain,"txtName"); frmMain是你的窗口,txtName是字符型表示的控件名称,怎么不能解决你的问题了????? 而且是最优的解决方法 就算winform有findControl或用遍历算法,都没这个好,因为在Form下的控件并不一定包含在Form.Controls中,而可能在某个Panel中或其他控件的子控件中,而这个方法可以获得一个类的所有指定成员,包括子控件,属性,甚至事件,而且可以是私有的,静态的. 你可以改一下,将出错提示改成返回null啊,不就可以判断是否找到了指定名称的控件,晕倒 public Control Find(string ControlName,Control FormControl ){ if(FormControl.Controls.IndexOf(ControlName) >= 0) { return FormControl.Controls[FormControl.Controls.IndexOf(ControlName)]; }} foreach(Control c in this.Controls){ if(c.Name == "button1") // 也可以是 if(c.GetType().Name == "Button") 一个是判断名字, 另一个是判断类型 { //... }} C#没有“eval()”这样的函数吗? 大量数据查询导致界面卡好一会儿 C# 怎么在静态类里面定义静态数组?? DataGridView中,我绑定数据(DATASET),为什么设置不了某条记录visiable=false为不可见? 局域网中如何获取所通过的代理网关的公网IP? 公司今天顺利通过CMM3级认证!高兴!散分!!! E-R图,求救 WCF相关问题,你敢看吗?等待大神~ C#引用C++函数指针参数的问题 简单问题送分!关于文本框与数据表。 如何通过软件将信息发布到网上呢? 二进制转换的问题,帮帮忙,谢谢了 弹出子窗体时隐藏父窗体
/// 根据给定的对象和路径,获得其子孙成员
/// </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");
就算winform有findControl或用遍历算法,都没这个好,因为在Form下的控件并不一定包含在Form.Controls中,而可能在某个Panel中或其他控件的子控件中,而这个方法可以获得一个类的所有指定成员,包括子控件,属性,甚至事件,而且可以是私有的,静态的.
{
if(FormControl.Controls.IndexOf(ControlName) >= 0)
{
return FormControl.Controls[FormControl.Controls.IndexOf(ControlName)];
}
}
{
if(c.Name == "button1") // 也可以是 if(c.GetType().Name == "Button") 一个是判断名字, 另一个是判断类型
{
//...
}
}