ASP.net中动态加载控件时一些问题的总结

asp.net|动态|加载|控件|问题

经常见到有人说在ASP.net中不要使用动态控件,我想主要的原因在于使用动态控件会带来一些问题,在做项目的过程中,我将由动态加载控件引发的总是作了一个小小的总结.
1 、在使用LoadControl加载控件后,用户控件中的某些控件不再响应事件。
这个问题主要是由于将控件加载放在if (!Page.IsPostBack)之内引起的,放在外面即可。在思归的blog上对此问题进行了详细的说明。
2、用户控件中某些控件的响应出现问题,如某个按钮第一次选择时不触发CLICK事件,第二次可以了。
这是由于没有给控件设置ID引起的,控件ID的作用在下面详细讲述。 如
Control userControl=(Control)Page.LoadControl(“Test.ascx”);
userControl.ID=“Test”;
AddControl(userControl);
3、如果用户控件中包括DataGrid控件,那么加载控件后可能出现不响应DataGrid事件的问题。
这好像是一个bug,必须要将加载的控件进行强制转换,如:
Test userControl=(Test)Page.LoadControl(“Test.ascx”);
注意:上面使用的是Test类型,而不是Control!
我在以前的Blog中曾提到过这个问题,这种方式将使系统的扩展性降低。 我有一个解决方案可以和大家讨论(运用策略模式):
public class BaseControl : System.Web.UI.UserControl
{
public virtual BaseControl ProcessThisControl();

}
所有的用户控件从BaseControl 继承,如果有Datagrid控件,由overide ProcessThisControl方法 ,如:
return this as Test;
按如下方式加载控件:
BaseControl userControl=(BaseControl )Page.LoadControl(“Test.ascx”);
userControl.ProcessThisControl();

4、在用户控件中如何使用JavaScript。
大家都知道,使用客户端的脚本将大大提高页面的响应速度,同时可以避免频繁地刷新页面。所以使用javascript来实现页面中部分控制是一个比较好的方式,但是在用户控件中如果访问某一个子控件呢?

使用方式如下: document.all.<%= TestControl.ClientID%>.disabled=true; //将TestControl设置为不可用
如果在C#脚本中应该这样写:Page.RegisterStartupScript("OnInitControl","<SCRIPT LANGUAGE='JavaScript'>document.all.Test_TestControl.disabled=true;</SCRIPT>"); //Test为用户控件,TestControl为用户控件中的子控件。

现在说一下控件ID,在访问aspx文件时,IIS会将aspx的脚本进行编译。编译的时候将用户控件中的内容写在同一个页面中,为了防止页面中的控件与用户控件中的控件名称相同,在编译的时候对用户控件中的控件名称修改为 : 用户控件名:子控件 ,控件ID则修改为 用户控件ID_子控件ID。 在动态加载控件时,如果不对控件的ID进行赋值,则控件ID为上一次加载的控件ID,因此在加载用户控件后应该立即对其设置ID.

时间: 2024-10-03 23:46:45

ASP.net中动态加载控件时一些问题的总结的相关文章

发现一个.Net中动态加载控件时关于焦点方面的Bug

动态|加载|控件 今天写一个系统框架的时候用到了动态加载,调试的时候发现程序经常会出现死锁的情况,而且死锁的时候还会打开一个"WindowsFormsParkingWindow"后台进程,跑到网上查了半天关于WindowsFormsParkingWindow的资料,结果中文的一篇没找到,蝇文的倒有几篇,对着金山词霸费了九牛二虎之力还没看出个道道来.后来干脆新建了一个项目,只写了几行代码,结果运行的时候发现还是会有死缩的情况: 1.新建一个windows应用程序 2.添加一个UserCo

在Asp.Net中动态加载控件

问题: 假设您有一个Aspx页面,其包含一个名为"Add New" 的Button,而您则想让用户每次点击Button,PostBack到Server,然后创建一个用 户控件的实列,并最终想动态的添加到该页面的ControlCollections中. 之所以我说用用户控件,是因为我们很容易把许多的控件组织到一个单独的控件 中,添加的时候,我们只需把该用户控件添加到页面上就可以了. 设计 解决方法: 我所想到的解决该问题的方法是在Aspx页面上放一个 PlaceHolder容器控件,该控

在ASP.NET中动态加载内容(用户控件和模板)

asp.net|动态|加载|控件|模板 在ASP.NET中动态加载内容(用户控件和模板)要点:1. 使用Page.ParseControl2. 使用base.LoadControl第一部分:加载模板 下面是一个模板"<table width=100%><tr><td width=100% colspan=2 runat=server id=ContainerTop></td></tr><tr><td width=30%

解决tableView中cell动态加载控件的重用问题

解决tableView中cell动态加载控件的重用问题 tableView的cell,有时候需要在运行时取得对应的数据后才能够动态的创建该cell中的控件并加载到该cell中,此时,你一定会遇到重用问题,即使你能做到该cell只根据数值加载了一回控件,你也没法保证不出现重用问题:) 效果(请注意查看,移动下面的格子时,上面出现了重用的问题) 源码: YXCell.h // // YXCell.h // YXTableView // // Copyright (c) 2014年 Y.X. All

动态加载控件: 常见问题解决之道

动态加载控件貌似给很多程序员都带来了困扰,经常收到这样的邮件,干脆就写下面这个示 例来演示如何解决那些常见的问题吧. 其实常见的问题通常有这样两个: 1. 通常他们都通过一个按钮来添加一个UserControl 并将它们加入PlaceHolder 容器的 Controls 中.然后页面上就会有一个另外一个按钮,这个按钮什么相关的事也没做,就是做了 一次回发.这样的情况动态添加的控件就不翼而飞了. 2. 今天收到了一封邮件说是要追加控件,和上面的情况看上去好像不一样,但实质就是同 一回事. 原因:

如何动态加载控件以及插件编程思想(C#)

编程|动态|加载|控件 关键词:动态加载,控件,插件 控件,在实现快速开发中起着非常重要的作用,它可以将某一特定功能封装起来,供可户程序员调用,更重要的是它还可以实现插件式开发,使软件的灵活性.可扩充性大大增强.在网络上,也有很多动态加载控件.动态调用类成员等的资料.下面,我就将动态加载控件总结一下,以供大家参考.(不过由于本人水平有限,不一定有参考价值,写出来一方面是为了总结自己,以求提高,另一方面也希望各为朋友看到我的不足,给我提出宝贵意见)一.动态加载控件 动态加载,最基本用到的就是反射机

急,急!!!!!请大家帮忙,如何根据TREEVIEW选择项的不同,动态加载控件,谢谢.

问题描述 如题, 解决方案 解决方案二:用框架可以实现解决方案三:根据TREEVIEW选择项的不同,动态加载控件是不是动态加载结点啊解决方案四:TreeViewtreeView1ButtonbtnOktreeView1.SelectObject=btnOK;试试这个将相应的控件实力复制给SelectObject就行了解决方案五:这个上面有

简单的ASP.NET 动态加载控件实现代码

下面示范一个最简单的 范例,就是大家最常见的 Hello World 来示范    代码如下 复制代码 <%@ Page Language="C#" AutoEventWireup="True" %> <script language="C#" runat=server> void SubmitBtn_Click(Object sender, EventArgs e){Label message = new Label()

C# winform程序动态加载控件,总是窗体先出现,窗体上的控件出现屏幕背景,闪一下 才出现控件,出现的时间也不同步

问题描述 初始化显示控件,或者是alt+tab切换页面,的时候都是整个页面先出来,就是有个别的控件出来的很慢,而且带有屏幕的背景色一闪而过,才完全加载出来 解决方案 解决方案二:Up,求解答啊,界面现在初始化的时候,有点闪,接受不了,解决方案三:vs自动生成的Form1.Designer.cs中,控件都是用下面代码包裹起来的.你就没想过是为什么吗?this.SuspendLayout();......this.ResumeLayout(false);this.PerformLayout();解决