C#面试1
查看最新精华文章 请访问博客首页相关文章
C#中的delegate和event在.NET运行时了解类型信息(2)实现基于事件通知的.Net套接字.NET系统学习----AssemblyAssembly学习心得第七课 策略模式c# 反射 的一些基本知识130道.net面试题farawayplace613 发表于2008年8月28日 17:51:09 IP:举报回复删除
1. different between event and delegate
事件与委托的区别
事件只是委托的一个特殊形式.委托能实现的,事件也能实现.同理把事件代码中的event去除掉,变成委托,代码也不会出现问题.
当使用event关键字,标识一个事件时,事件成员不能使用赋值将委托链表中的其他代码注册的方法去除掉.这样会破坏订阅的完整性,当用event标识后,使用事件时,只能使用+=或-=来添加和删除订阅.保证一行代码访问事件时不会产生误操作.同时在asp.net中,使用事件,框架会解析页面标签中的On
2. GAC的理解及其作用.
GAC全称是Global Assembly Cache
作用是可以存放一些有很多程序都要用到的公共Assembly,例如System.Da
除了系统默认放置在GAC中的Assembly如System.Windows.Forms以外,我们也可以添加自己的Assembly:
1)创建一个strong-name的Assembly,例如ToolbarComponent.dll
2)运行gacutil -i ToolbarComponent.dll,把这个Assembly添加到GAC
3)在程序中动态装载:
System.Reflection.Assembly ass=Assembly.Load("ToolbarComponent, Version=1.0.934.20434, Culture=neutral, PublicKeyToken=65f45658c8d4927f");
MessageBox.Show("Is the assembly loaded from GAC? "+ass.GlobalAssemblyCache);
在上面的程序中,ToolbarComponent就是从GAC装载而不是从程序的运行目录下的dll文件中装载,程序目录下不需要放置ToolbarComponent.dll程序也能正常运行。另外,Assembly.Load()中的参数可以通过"gacutil -l"查到。
另外,上面提到了GAC中的Assembly必须是strong-name的。创建strong-name的Assembly的步骤大致如下:
a) 在命令行运行“sn -k keyPair.snk”创建一个密钥文件。这里的sn.exe也是.NET附带的一个工具。
b) 在VS.NET里面farawayplace613 发表于2008年8月28日 17:52:00 IP:举报回复删除
3. HTTP module/HTTP handler
HTTP modules are .NET components that implement the System.Web.IHttpModule interface. These components plug themselves into the ASP.NET request processing pipeline by registering themselves for certain events. Whenever those events occur, ASP.NET invokes the interested HTTP modules so that the modules can play with the request.
HTTP handlers are the .NET components that implement the System.Web.IHttpHandler interface. Any class that implements the IHttpHandler interface can act as a target for the incoming HTTP requests. HTTP handlers are somewhat similar to ISAPI extensions. On
4. Viewstate
ViewState 是由 ASP.NET 页面框架管理的一个隐藏的窗体字段。当 ASP.NET 执行某个页面时,该页面上的 ViewState 值和所有控件将被收集并格式化成一个编码字符串,然后被分配给隐藏窗体字段的值属性(即 <input type=hidden>)。由于隐藏窗体字段是发送到客户端的页面的一部分,所以
ViewState 值被临时存储在客户端的浏览器中。如果客户端选择将该页面回传给服务器,则 ViewState 字符串也将被回传。
回传后,ASP.NET 页面框架将解析 ViewState 字符串,并为该页面和各个控件填充 ViewState 属性。然后,控件再使用 ViewState 数据将自己重新恢复为以前的状态。 farawayplace613 发表于2008年8月28日 17:53:21 IP:举报回复删除
5. How to create a thread?
创建线程是通过创建新的Thread对象来实现的。Thread类的构造函数需要一个ThreadStart委托或ParameterizedThreadStart委托作为参数。
ThreadStart委托和ParameterizedThreadStart委托表示在Thread上执行的方法。它们的定义如下:
public delegate void ThreadStart ();
public delegate void ParameterizedThreadStart (Object obj);
其中的参数obj包含该线程过程的数据对象。
在调用Thread对象的Start()方法之前,该线程不会开始执行。Start方法立即返回,经常是在实际启动新线程之前返回。新的线程将从ThreadStart或ParameterizedThreadStart委托表示的方法的第一行开始执行。只能调用一次Start()方法,多次调用将引发ThreadStateException异常。
线程启动后可以使用ThreadState和IsAlive属性来确定任何时刻的线程状态,但是绝不应该将这些属性用于同步线程的活动
Thread InstanceCaller = new Thread(new ThreadStart(serverObject.InstanceMethod)); //线程声明
InstanceCaller.Start();//线程启动
2、匿名方法创建线程:
Thread thread1 = new Thread(delegate())
{
Console.WriteLine("进入子线程1");
for (int i = 1; i < 4; ++i)
{
Thread.Sleep(50);
Console.WriteLine("\t+++++++子线程1+++++++++");
}
Console.WriteLine("退出子线程1");
});
thread1.Start();
3、声明线程+函数
Thread _hThread;
_hThread = new Thread(ThreadCallBack);
public void ThreadCallBack()
{
// Do Something
}
farawayplace613 发表于2008年8月28日 17:57:16 IP:举报回复删除
6. How to create a process?
要使用C#达到您的目的,你可以使用System.Diagnostics namespace下的Process对象。下面是一个例子:
p = new System.Diagnostics.Process();
// Handle the Exited event fired by the Process class
this.p.Exited += new System.EventHandler(this.p_Exited); //p_Exited是你的Event处理函数
p.EnableRaisingEvents = true;
p.SynchronizingObject = this;
p.StartInfo.FileName = "notepad.exe";
p.Start();
farawayplace613 发表于2008年8月28日 18:02:54 IP:举报回复删除
7. How to add a cookie/application?
this.Page.Application.Add(string names,object ValueType);
如何建立Cookie:ASP.NET建立Cookie的标准代码写法是
HttpCookie myCookie = new HttpCookie("someCookie");
这句代码建立了一个名为myCookie的Cookie对象
2. 接收Cookie对象:接收ASP.NETCookie对象的标准代码写法是
HttpCookie getCookie = Request.Cookies["someCookie"];
设置getCookie为一个Cookie对象,它是请求页面中Cookie对象数组中someCookie的子集。如果名为someCookie的Cookie数组不存在,则getCookie的null属性为true。
3. 给Cookie增加键值:ASP.NET增加键值的标准代码写法是
myCookie.Values.Add("auth", "admin");
给名为myCookie的Cookie对象(必须实现建好)增加一个auth键名,其值为admin。
4. 附加键值,使Cookie生效:标准代码格式为
Response.Cookies.Add(myCookie);
上句代码把名为myCookie的对象附加到Cookie数组内。注意,在设定Cookie完毕之后一定要加上这句代码才能生效,
4. 设定生存期:设置生存期的标准代码形式如下
myCookie.Expires = DateTime.Now.AddDays(3);
设定名为myCookie的Cookie对象生存期为当前时间加上3天。需要注意的是,设定Cookie之后如果页面不刷新,是不会显示任何效果的。
5. 获取Cookie的值:获取Cookie值的标准代码格式为
myCookie.Values["auth"];
上句代码可以获取名为myCookie的Cookie对象键名为auth的键值。如果不存在,则返回null
farawayplace613 发表于2008年8月29日 9:42:55 IP:举报回复删除
10. 抽象类和接口的区别.
一、抽象类:
抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。
二、接口:
接口是引用类型的,类似于类,和抽象类的相似之处有三点:
1、不能实例化;
2、包含未实现的方法声明;
3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员);
另外,接口有如下特性:
接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类)。
farawayplace613 发表于2008年8月29日 9:50:32 IP:举报回复删除
11 .NET Generic的理解.
泛型是 2.0 版 C# 语言和公共语言运行库 (CLR) 中的一个新功能。泛型将类型参数的概念引入 .NET Framework,类型参数使得设计如下类和方法成为可能:这些类和方法将一个或多个类型的指定推迟到客户端代码声明并实例化该类或方法的时候。例如,通过使用泛型类型参数 T,您可以编写其他客户端代码能够使用的单个类,而不致引入运行时强制转换或装箱操作的成本或风险.泛型类最常用于集合,如链接、堆栈、队列、树等,其中,像从集合中添加和移除项这样的操作都以大体上相同的方式执行,与所存储数据的类型无关。farawayplace613 发表于2008年8月29日 9:58:35 IP:举报回复删除
12. Const/read-on
1. const 字段只能在该字段的声明中初始化。 readonly 字段可以在声明或构造函数中初始化。因此,根据所使用的构造函数,readonly 字段可能具有不同的值。
2. const 字段是编译时常数,而 readonly 字段可用于运行时常数。
3. const 默认就是静态的,而 readonly 如果设置成静态的就必须显示声明。
4.const 对于引用类型的常数,可能的值只能是 string、值类型和 null 。 readonly可以是任何类型
需要注意的一个问题是:
对于一个 readonly 的 Reference 类型,只是被限定不能进行赋值(写)操作而已。而对其成员的读写仍然是不受限制的。
farawayplace613 发表于2008年9月8日 15:57:10 IP:举报回复删除
Winform的DataGridView和database
1、DataGridView是database的显示形式。
2、database是DataGridView显示形式的数据来源
3、两者通过dataAdapter实现数据的填充与通讯
farawayplace613 发表于2008年9月8日 15:57:18 IP:举报回复删除
Winform的DataGridView和database
1、DataGridView是database的显示形式。
2、database是DataGridView显示形式的数据来源
3、两者通过dataAdapter实现数据的填充与通讯
farawayplace613 发表于2008年9月8日 16:08:10 IP:举报回复删除
Handler/Module, or how MasterPage works
Handler/Module前面说了,这里不再讲了。
说MasterPage
MasterPage其实是一种模板,它可以让你快速的建立相同页面布局而内部不同的网页,如果一个网站有多个MasterPage,那么新建aspx文件的时候就可以选择需要实现页面布局的MasterPage。另外,在你没有使用MasterPage之前,如果N个相同的页面布局需要改动成另外一个样式,那么你就要做很多无聊而又不得不做的工作,对N个页面进行一一更改,如果使用了MasterPage,你只要改动一个页面也就是MasterPage文件就可以了。还有,你是否发现你要要部署的web程序越来越大,使用MasterPage在一定程度上会减小web程序的大小,因为所有的重复的html标记都只有一个版本。
farawayplace613 发表于2008年9月8日 16:10:40 IP:举报回复删除
面向对象
一 、面向过程与面向对象的区别:
前者是一种谓语和宾语的关系;后者是一种主语和谓语的关系 。
二、面向对象的三个特征:
??封装 ??继承 ??多态
三、类与对象:
对象又称作实例,是实际存在的该类事物的每个个体。类是对某一类事物的描述,是抽象的、概念上的 定义。 *面向对象的设计的重点是类的设计。
四、对象的比较:
1 “= =”运算符与equals()方法的区别: 前者辨别实质是否相等;后者辨别长相是否相等。
五、 实现类的封装性:
1不能让外面的类随意修改一个类的成员变量;2在定义一个类的成员(包括变量和方法),使用private关键字说明这个成员的访问权限,只能被这个类的其他成员方法
调用,而不能被其他的类中的方法所调用; 3为实现封装性,常将类的成员变量
声明为private,再通过public的方法来对这个变量进行访问。对一个变量的操作,一般都有 读取和赋值操作,我们一般定义两个方法来实现这两种操作,即:getXxx()与setXxx();
4一个类就是一个模块,我们应该让模块仅仅公开必须要让外界知道的内容,而隐藏其他的一切内容。再进行程序设计时,应尽量避免一个模块直接修改或操作另一个模块的数据,模块设计追求强内聚(许多功能尽量在类的内部独立完成,不让外面干预),弱耦合(提供给外部尽量少的方法调用)。
六、构造函数的定义与作用:
1、 特征:??名称与类相同;??不含返回值;??不能在方法中用return返回一个值注意:构造方法里不含返回值的概念是不同与void的,在定义构造方法时加了void,结果这个方法就不再被自动调用了。
2作用:当一个类的实例对象刚产生时,这个类的构造方法就会被自动调用,
我们可以在这个方法中加入要完成初始化工作的代码。
七、若类中已定义了一个构造方法,编译器就不再自动产生类似public Person(){ }的构造方法。
八、this引用句柄的应用:
1、 类的成员名和对其进行赋值的成员方法的形参变量同名时,使用this便于理解;
2、 假设我们有一个容器类和一个部件类,在容器类的某个方法中要创建部件类的实例对象,而部件类的构造方法要接收一个代表其所在容器的参数。
3、 构造方法是在产生对象时被java系统自动调用的,我们不能在程序中象调用其他方法一样去调用构造方法。不是用构造方法名,而是用this的形式,根据其中的参数列表,选择相应的构造方法。
九 、 垃圾回收过程分析:java中的finalize()方法;System.gc的作用。
Finalize()的调用是在无用对象被回收前发生的。
一○、 static 静态方法:1、 在静态方法中只能直接调用同类中其他的静态成员,而不能直接访问类中的非静态成员。原因是对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象;2、 静态方法不能以任何方式引用this和super关键字;3、 main()方法是静态的,因此,JVM在执行main方法时不创建main方法所在的类的实例对象,因此在main()方法中,我们不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员。
一一、 JVM在程序执行时,只有在调farawayplace613 发表于2008年9月8日 16:14:18 IP:举报回复删除
讲讲你对.NET Framework 的理解 :
.NET Framework 是一种新的计算平台,它简化了在高度分布式 Internet 环境中的应用程序开发。.NET Framework 旨在实现下列目标:
·提供一个一致的面向对象的编程环境,而无论对象代码是在本地存储和执行,还是在本地执行但在 Internet 上分布,或者是在远程执行的。
·提供一个将软件部署和版本控制冲突最小化的代码执行环境。
·提供一个保证代码(包括由未知的或不完全受信任的第三方创建的代码)安全执行的代码执行环境。
·提供一个可消除脚本环境或解释环境的性能问题的代码执行环境。
·使开发人员的经验在面对类型大不相同的应用程序(如基于 Windows 的应用程序和基于 Web 的应用程序)时保持一致。
·按照工业标准生成所有通信,以确保基于 .NET Framework 的代码可与任何其他代码集成。
===============
上面来自于.NET Framework文档
farawayplace613 发表于2008年9月8日 16:23:58 IP:举报回复删除
SQL, 对表的理解, 对表的主键, 外键的理解, 视图, 为什么要有视图, 视图有什么功能, 视图与表有什么区别, 使用过其他数据库吗? SQL 与其他数据库的不同点在哪:
表:同一类实体或关系记录的集合
主键:记录的在该集合(表)中的唯一标识
外键:其它集合(表)对非本表的标识的引用
视图:物理集合(表)的一种特殊表现形式
视图作用:物理集合(表)的一种特殊表现形式,可真对同一个或相关几个物理集合定制多中视图。
用过:MySql,Orcal等均不支持top语句,令外稳定和吞吐率也有差异。
farawayplace613 发表于2008年9月8日 16:31:22 IP:举报回复删除
ADO.net的理解:
ADO.NET 对 Microsoft SQL Server 和 XML 等数据源以及通过 OLE DB 和 XML 公开的数据源提供一致的访问。数据共享使用者应用程序可以使用 ADO.NET 来连接到这些数据源,并检索、处理和更新所包含的数据。
ADO.NET 通过数据处理将数据访问分解为多个可以单独使用或一前一后使用的不连续组件。ADO.NET 包含用于连接到数据库、执行命令和检索结果的 .NET Framework 数据提供程序。您可以直接处理检索到的结果,或将其放入 ADO.NET DataSet 对象,以便与来自多个源的数据或在层之间进行远程处理的数据组合在一起,以特殊方式向用户公开。ADO.NET DataSet 对象也可以独立于 .NET Framework 数据提供程序使用,以管理应用程序本地的数据或源自 XML 的数据。
farawayplace613 发表于2008年9月8日 16:48:05 IP:举报回复删除
对TCP/IP的理解:
TCP/IP(传输控制协议/网际协议)是互联网中的基本通信语言或协议。在私网中,它也被用作通信协议。当你直接网络连接时,你的计算机应提供一个TCP/IP程序的副本,此时接收你所发送的信息的计算机也应有一个TCP/IP程序的副本。从这句话可以看出TCP就是控制传输的协议,IP是网际协议是基于地址解析的。
TCP/IP是一个两层的程序。高层为传输控制协议即TCP的概念,它负责聚集信息或把文件拆分称更小的包。这些包通过网络传送到接收端的TCP层,接收端的TCP层把包还原为原始文件。低层是网际协议即IP的概念,它处理每个包的地址部分,使这些包正确的到达目的地。网络上的网关计算机根据信息的地址来进行路由选择。即使来自同一文件的分包路由也有可能不同,但最后会在目的地汇合。IP地址都知道他的意思,不用贴上来了。
TCP/IP使用客户端/服务器模式进行通信。TCP/IP通信是点对点的,意思是通信是网络中的一台主机与另一台主机之间的。TCP/IP与上层应用程序之间可以说是“没有国籍的”,因为每个客户请求都被看做是与上一个请求无关的。正是它们之间的“无国籍的”释放了网络路径,才是每个人都可以连续不断的使用网络。
许多用户熟悉使用TCP/IP协议的高层应用协议。包括万维网的超文本传输协议(HTTP),文件传输协议(FTP),Telnet和简单邮件传输协议(SMTP)。这些协议通常和TCP/IP协议打包在一起。
使用模拟电话调制解调器连接网络的个人电脑通常是使用串行线路接口协议(SLIP)和点对点协议(PPP)。这些协议压缩IP包后通过拨号电话线发送到对方的调制解调器中。
有TCP/IP协议相关的协议还包括用户数据报协议(UDP),它代替TCP/IP协议来达到特殊的目的。其他协议是网络主机用来交换路由信息的,包括Internet控制信息协议(ICMP),内部网关协议(IGP),外部网关协议(EGP),边界网关协议(BGP)。
farawayplace613 发表于2008年9月8日 16:50:58 IP:举报回复删除
存储过程, 什么是存储过程等等 :
存储过程(stored procedure)是一组为了完成特定功能的sql 语句集,经编译后存储在数据库。
在sql server 的系列版本中存储过程分为两类:系统提供的存储过程和用户自定义存储过程。系统过程主要存储在master 数据库中并以sp_为前缀,并且系统存储过程主要是从系统表中获取信息,从而为系统管理员管理sql server 提供支持。通过系统存储过程,ms sql server 中的许多管理性或信息性的活动(如了解数据库对象、数据库信息)都可以被顺利有效地完成。尽管这些系统存储过程被放在master 数据库中,但是仍可以在其它数据库中对其进行调用,在调用时不必在存储过程名前加上数据库名。而且当创建一个新数据库时,一些系统存储过程会在新数据库中被自动创建。用户自定义存储过程是由用户创建并能完成某一特定功能(如查询用户所需数据信息)的存储过程。在本章中所涉及到的存储过程主要是指用户自定义存储过程。
好处:
1) 存储过程允许标准组件式编程
2) 存储过程能够实现较快的执行速度
3) 存储过程能够减少网络流量
4) 存储过程可被作为一种安全机制来充分利用
farawayplace613 发表于2008年9月12日 21:33:08 IP:举报回复删除
21. 对数据结构单链表的理解,”树”数据结构的理解.
单链表:
链接方式存储的线性表简称为链表(Linked List)。
链表的具体存储表示为:
① 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的)
② 链表中结点的逻辑次序和物理次序不一定相同。为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点的地址(或位置)信息(称为指针(pointer)或链(link))
树:
树型数据结构是一类重要的非线性数据结构,其中以树和二叉树最为常用。它描述了客观世界中事物之间的层次关系,树在计算机领域内也有广泛的应用,如在编译程序中,可用树表示源程序的语法结构。在数据库系统中的文件索引机构一般采用树来表示。
farawayplace613 发表于2008年9月12日 21:48:01 IP:举报回复删除
如表A
AID OtherA
1 2
2 3
表B
BID OtherB
2 3
3 4
Inner left和right join的区别.
Inner join :
Select * from A Inner join B on A.AID=B.BID
求A,B中AID=BID链接链接集合
AID OtherA BID OtherB
2 3 2 3
Left Join :
Select * from A Left join B on A.ID=B.ID
求A,B中AID=BID链接链接集合,加A中
和B匹配的集合,A中照旧,B的字段以空填。
AID OtherA BID OtherB
1 2 Null Null
2 3 2 3
Right Join :
Select * from A Rright join B on A.AID=B.BID
求A,B中AID=BID链接链接集合,加B中
和A匹配的集合,B中照旧,A的字段以空填。
AID OtherA BID OtherB
2 3 2 3
Null Null 3 4
farawayplace613 发表于2008年9月12日 21:50:27 IP:举报回复删除
如表A
AID OtherA
1 2
2 3
表B
BID OtherB
2 3
3 4
Inner left和right join的区别.
Inner join :
Select * from A Inner join B on A.AID=B.BID
求A,B中AID=BID链接链接集合
AID OtherA BID OtherB
2 3 2 3
Left Join :
Select * from A Left join B on A.ID=B.ID
求A,B中AID=BID链接链接集合,加A中
和B不匹配的集合,A中照旧,B的字段以空填。
AID OtherA BID OtherB
1 2 Null Null
2 3 2 3
Right Join :
Select * from A Rright join B on A.AID=B.BID
求A,B中AID=BID链接链接集合,加B中
和A不匹配的集合,B中照旧,A的字段以空填。
AID OtherA BID OtherB
2 3 2 3
Null Null 3 4farawayplace613 发表于2008年9月15日 17:13:46 IP:举报回复删除
Override与overload的区别
override 表示重写,用于继承类对基类中虚成员的实现
overload 表示重载,用于同一个类中同名方法不同参数(包括类型不同或个数不同)的实现
farawayplace613 发表于2008年9月15日 17:19:56 IP:举报回复删除
链表删除结点的用法:
如有链表 A B C 三节点
要删B
A->next=B->next;
要删除 A
list.Header=B;
要删除C
B->next=NULL;
如果是双向链表要稍微复杂一点。farawayplace613 发表于2008年9月15日 17:24:12 IP:举报回复删除
成员初始化顺序,值类型/引用类型,异常处理,同步等.
先是成员变量,再是成员方法。
值类型/引用类型:类C中的(传)值和(传)地址
异常处理:try{}catch(Exception e){}finally{}
同步:线程同步,类Java
farawayplace613 发表于2008年9月15日 17:27:09 IP:举报回复删除
Page calls Construct
Page finishes Construct
Page calls New
Page finishes New
Page calls DeterminePostBackMode
Page finishes DeterminePostBackMode
Page calls AddParsedSubObject
Page calls CreateControlCollection
Page finishes CreateControlCollection
Page calls AddedControl
Page finishes AddedControl
Page finishes AddParsedSubObject
ChildControl calls Construct
ChildControl finishes Construct
ChildControl calls New
ChildControl finishes New
* -- Page parses templated properties here and calls Set for those properties on the ChildControl (e.g., FirstName=擜dam?LastName=擶ayne?DisplayBothNames=擳rue?/u> />)
Page calls AddParsedSubObject
Page calls AddedControl
Page finishes AddedControl
Page finishes AddParsedSubObject
Page calls AddParsedSubObject
Page calls AddedControl
Page finishes AddedControl
Page finishes AddParsedSubObject
ChildControl calls On
ChildControl raises Init
ChildControl finishes On
ChildControl calls TrackViewState
ChildControl finishes TrackViewState
Page calls On
Page raises Init
Page finishes On
Page calls TrackViewState
Page finishes TrackViewState
Page calls On
Page raises Load
Page finishes On
ChildControl calls On
ChildControl raises Load
ChildControl finishes On
Page calls EnsureChildControls
Page calls CreateC