日期:2014-05-18  浏览次数:20890 次

关于类的一个问题,大家帮看看
在C#使用类时,有时经常会用到这么一种

比如在界面上有一个Lable1或者Textbox1什么的
我们在某些事件中要访问这些控件时,有时不能直接访问的话,我们就会做个处理
比如: 
Textbox T1=this.parent.findcontrol("Textbox1");
T1.Text="xxx";

这时操作的就是Textbox1的Text属性,我想问下,这是使用到类的什么?多态性吗?还是什么?
从变量的角度来说,这种操作T1不是一个新的实例吗?为什么能反应到Textbox上去呢?怎么感觉象是引用?望请高手指点,谢谢!

------解决方案--------------------
Textbox T1=this.parent.findcontrol("Textbox1"); 
T1.Text="xxx"; 
----------------
Control T1=this.parent.findcontrol("Textbox1"); 
T1.Text="xxx"; 

不可能直接使用findControl就能匹配一个具体的类“TextBox”,而是应使用Control类,
在Control类里,有属性Text,所以可以直接使用Text了。虽然TextBox的Text属性意义可能会和其它的不同,但是都属性String类型,名称都是Text就足够了。

这只相当于把找到的对象“指针”给到一个变量,由这个变量来操作找到的对象了。
如果一定要按TextBox来访问,需要转换,比如:
Textbox T1=(TextBox)this.parent.findcontrol("Textbox1"); 
或:
Textbox T1=this.parent.findcontrol("Textbox1") as TextBox;
------解决方案--------------------
到一个对象的内部去找到一个引用 那不就是反射吗?
反射的范围很广的,为什么要局限在System.Reflection命名空间。

试想,如果用依赖注入,那么在配制文件中的那个程序集和类名只是一个可变的string,我们取得他,动态得创建它,因为不可能直接new一个变量的内容所代表的内容。那毫无疑问是用了反射。

而这里,我们也只有一个string变量,这个变量保存了控件的id,同样不可能直接new或者直接匹配他是什么控件,也要动态在Control类里找到匹配它的信息的属性成员,那为什么不是反射呢。

个人愚见,各位高手指教...
------解决方案--------------------
正因为只是一个字符串信息,而不是一个指向堆具体对象的变量,所以我认为findcontrol属于反射。

Type t = MyType.GetType(); Object o = t.GetField("name").GetValue(null); 虽然实现完全不同,但我认为和这句的思想是很相似的.
findcontrol只是在Control对象中的控件树成员对象中去寻找名字是xxx的对象。
因此仅仅从一个id上是不能判断其是什么类型的,因为这个id不是指针,要通过这个id去寻找指针。也就和上面2句一样,仅仅通过字段名是不能判断该字段的类型的,也要找到该字段名所代表的指针所指向的对象,再转换成你所确定的该对象的类型

------解决方案--------------------
... 看来我的个人理解把你弄糊涂了,你就当我只说了这2句话吧 呵呵。

“因此仅仅从一个id上是不能判断其是什么类型的,因为这个id不是指针,要通过这个id去寻找指针。” 
“再转换成你所确定的该对象的类型”
------解决方案--------------------
要解除你的疑惑...首先你得搞清楚FindControl方法...此方法在命名容器中搜索指定的服务器控件...也就是说只有容器类控件才可以FindControl...

然后你得搞清楚ControlCollection类...容器类控件由此属性提供使ASP.NET服务器控件能够维护其子控件列表的集合容器...

最后你得搞清楚Collections类...集合是一组组合在一起的类似的类型化对象...

所以Control.Controls其实就是一组Control的集合...

Textbox T1=(Textbox)this.Parent.FindControl("Textbox1");
-----------------------
这一句就是在this.Parent这个容器里根据参数id搜索一个Control...结果显然是一个Control的引用...所以要转换为Textbox赋值给Textbox类型的变量T1...那你认为这个是不是引用呢?

现在你明白没有?
------解决方案--------------------
ASP.NET的框架是如此的庞大,以至于很多人只知怎么用,却很少知道他的运作原理,一些生僻的概念,例如命名容器、分层绑定,也知者寥寥。这与当前ASP.NET重解决问题而轻框架的大环境有关,也给很多人ASP.NET不如什么什么的错觉。事实上ASP.NET框架是目前Web开发领域最庞大最完善的框架。

FindControl方法的定义是在当前命名容器中查找指定ID的控件。
什么是命名容器,大体上可以理解为命名空间,在这个命名容器及其上层命名容器内每个控件的ID必须唯一。
肯定有人会问,控件的ID不是全Page唯一的么?否则是无法通过编译的。
的确,在同一个Page里,不可能有两个控件的ID一样,不过这只是在编译期。因为ASP.NET有一个模板的机制,模板一般用在数据绑定控件上,使用模板的数据绑定称为模板数据绑定控件。
模板内的控件很可能因为数据而被重复很多次,这样就会造成很多控件的ID相同。所以ASP.NET引入了命名容器的概念来解决这个问题,所有的模板数据绑定控件都有一个命名容器的控件来重复模板。如DataGrid的DataGridItem