高难度问题!解决之后再加!高手进来看看

yuesongboy 2006-04-11 11:10:35
我一个窗体中有很多控件,
如它们的name为a,b,c,d
如果我要启用或者禁用就直接设置a.Enabled,b.Enabled的BOOL值,

但现在我不能通过这样直接实现,而我现在只有"a","b","c","d"这些字符
我想实现通过这些字符来实现这些控件的Enabled的属性,

高手回答我,如何实现,谢谢!!!
...全文
447 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
oldhunter 2006-04-12
  • 打赏
  • 举报
回复
反射要经过绑定和调用两步,前者要遍历类成员定义的元数据,然后进行字符串对较.至于和遍历所有控件哪个快不好说,性能都不怎么好.如果以后还要操作这些字段,建议不管用哪种方法,在得到某个字段的引用后,用一个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;
xwy2258588 2006-04-12
  • 打赏
  • 举报
回复
顶,GZ
tiaoci 2006-04-12
  • 打赏
  • 举报
回复
为什么不能用遍历啊?

你没有试过怎么知道慢?

而且就算慢,你也可以通过一次遍历创建一个对照表

以后的查找就快了
zhoujijunnt 2006-04-12
  • 打赏
  • 举报
回复
顶,GZ
wls12342004 2006-04-12
  • 打赏
  • 举报
回复
完了,来晚了,利用反射吧,楼上的方法感觉都可以的.我以前用过.行的
guodawu 2006-04-12
  • 打赏
  • 举报
回复
还是用Foreach循环遍历比较好,而且比较清晰易懂。
yuesongboy 2006-04-11
  • 打赏
  • 举报
回复
我需要反射的解决方案
wfhlxl 2006-04-11
  • 打赏
  • 举报
回复
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);
yuesongboy 2006-04-11
  • 打赏
  • 举报
回复
反射怎么用啊?我就是想知道用反射
copico 2006-04-11
  • 打赏
  • 举报
回复
同意楼上的解法
真相重于对错 2006-04-11
  • 打赏
  • 举报
回复
或者用反射
真相重于对错 2006-04-11
  • 打赏
  • 举报
回复
foreach( Control con in this.Controls)
{
if( con.Name == "a")
con.Enabled = false;
}
yuesongboy 2006-04-11
  • 打赏
  • 举报
回复
不能通过遍历当前控件来实现!!!
sweig0721 2006-04-11
  • 打赏
  • 举报
回复
foreach( Control con in this.Controls)
{
if( con.Name == "a")
con.Enabled = false;
}
zhouheng123456 2006-04-11
  • 打赏
  • 举报
回复
显然是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);
Kshatriya 2006-04-11
  • 打赏
  • 举报
回复
反射性能極差
winteryoung84 2006-04-11
  • 打赏
  • 举报
回复
同意用反射。不过我确实不知道反射跟 foreach 比哪个性能好。

如果楼主需要用反射,看看我的 blog: http://blog.csdn.net/efijki/archive/2006/04/06/652993.aspx

内容很初级,但你可以看个大概,然后自己写一下就明白了
yuesongboy 2006-04-11
  • 打赏
  • 举报
回复
如果我有100个控件,那我一个字符串都要遍历一次,每次都在100个中查找,如果我要设置50个控件状态怎么办,那不是很慢

我觉得反射可能更好一点
du9232 2006-04-11
  • 打赏
  • 举报
回复
反射性能不好,还不如用foreach
yuesongboy 2006-04-11
  • 打赏
  • 举报
回复
@serversql(啊初)
能不能解释一下呀~~谢谢
加载更多回复(3)

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧