基于DotNetNuke的动态窗体支持(一)
strParentID, strRelateRowID), _ objField.Required, bEnabled, objField.IsReadOnly, PublicFunction.FormatParameter(objField.Extended, strRowID, strParentID, strRelateRowID), _ objField.CssEnable, objField.CssDisable) c.Controls.Add(objCtl) Exit For End If Next End If Next 上面的代码,是遍历我们动态加载的ascx控件中的PlaceHolder控件,如果找到PlaceHolder控件的话,则判断,是不是我们已经对之有了定义,如果有了定义的话,则为其增加子控件,这样,就完成了用户界面的遍历过程。 上面的例子中,由于我们只是在动态加载的控件中找PlaceHolder控件,而对其他任何的控件(无论是服务器端,还是客户端)都置之不理,所以,对于ascx文件来说,我们并不在乎其他的东西,比如样式、风格、字体、图片等等,尽可以全部都放到这个ascx文件中,我们的解析程序都对之视而不见。比如,我们可以画一个Table,让控件在Table的某一个单元格中,所需要做的,只是在该单元格的代码中放置下面这样的一个标识符而已: <asp:PlaceHolder runat="server" ID="__RowName"></asp:PlaceHolder> <!--名称--> 当然,我们在PlaceHolder的ID的前面增加了双下划线(__),这是为了和控件的ID做一个区别(因为我们在PlaceHolder所动态增加的控件是没有下划线的,如果ID重复则会出现错误;) 还有一点需要说明的是,在上面的遍历ascx子控件的代码中,我们并没有对子控件做子控件的遍历,也就是说,如果我们的ascx控件中包含如下的内容的话:
我们遍历到tblAll这个控件的时候,就不会往下去遍历了;这也就要求美工在设计ascx的时候,必须要将我们的 PlaceHolder控件放在顶层;当然,我相信这个对美工不会造成障碍,因为他们在设计的时候,理论上应该不会使用到服务器端的Table控件,他们使用Client端的<table>应该已经足以完成所有的设计工作了。 我对UDT模块的扩展后,将“是否自定义界面”做成一个Settings,放在模块设置中,这样,一个模块是用系统自行产生的界面(相对比较死板),还是用动态加载ascx的方式产生界面(可以由美工设计,相对比较灵活),就可以由模块的管理员进行设置了。 这个系列的后面,我们谈一下产生的控件的过程,和一些其他的要素等等。 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |