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

动态加载控件貌似给很多程序员都带来了困扰,经常收到这样的邮件,干脆就写下面这个示 例来演示如何解决那些常见的问题吧。

其实常见的问题通常有这样两个:

1. 通常他们都通过一个按钮来添加一个UserControl 并将它们加入PlaceHolder 容器的 Controls 中。然后页面上就会有一个另外一个按钮,这个按钮什么相关的事也没做,就是做了 一次回发。这样的情况动态添加的控件就不翼而飞了。

2. 今天收到了一封邮件说是要追加控件,和上面的情况看上去好像不一样,但实质就是同 一回事。

原因:

其实网上有很多帖子都不约而同地解释了这个问题,这里我还是不厌其烦地解释一下:

首先,要提到大家所熟知很多人一知半解的页面生命周期,以至于很多居然还停留在将 ASP.NET 和Winform 一样处理的层次上,因此就会有人试图将变量存在实例字段中,然后一如 既往地指望它能够用来共享数据,结果总是无功而返,以我所知这样的人居然还不在少数,当 然了,咱博客园的素质相对偏高,这种问题一般不在话下。事实上每次页面PostBack 都会从 Aspnet 线程池中返回一个空闲的用户线程,用于处理用户本次的请求。摆弄一下那种浏览器进 度条会动的控件基本也都算是回发事件了。两次回发之间可以当作没有什么关联的。但是你总 能看到很多控件等在回发之后还能保持状态比如文本框边上有个按钮。你填写完了文本后狂点 那个按钮,你会发现文本框中的文字还是你填写的那些而不会被清空。这就不得不说到 ViewState 这种神奇的双刃剑了。它的原理在MSDN 上讲的很清楚,找不到的留言或发邮件给我 我再慢慢给你找……

然后呢?还是查MSDN, 关键字“TemplateControl.LoadControl ” 我们在用PlaceHolder 中动态添加控件的时候就会用到这个方法了。我们注意到这里有一句:“ 在将控件加载到容器 控件时,该容器引发所添加控件的所有事件,直到所添加控件参与当前事件为止。但是,所添 加控件不参与回发数据处理。” 因为所添加的控件是不参与回发数据处理的,因此就会出现问 题1 中所遇到的按另一个按钮就消失的现象了。问题2 其实也是一样的问题,因为事实上它们 遇到的现象是一样的,只不过它的需求有所不同罢了。(可以理解成一个是i=1; 另一个是 i+=1; )

综上所述,问题的关键就是原本在页面加载的时候所有的控件初始化操作都应该完成,动态 加载将加载的过程延迟到了事件被触发之后,因此在页面回发后,因为会有一次新的页面加载 过程,显然这时候动态加载的控件是不存在的,但是用户预期的答案是显示已经加载的信息。 这时候如果可能我们最好在加载的过程中进行控件的重新加载和数据绑定。常见的方法中我们 呢通常通过LoadControl 来动态加载控件,因此只要在页面输出之前的所有事件节点上我们都 可以加载我们的控件。但是推荐的则是Init 事件。在Load 事件的时候进行数据绑定。

时间: 2024-10-02 12:22:58

动态加载控件: 常见问题解决之道的相关文章

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

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

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

asp.net|动态|加载|控件|问题 经常见到有人说在ASP.net中不要使用动态控件,我想主要的原因在于使用动态控件会带来一些问题,在做项目的过程中,我将由动态加载控件引发的总是作了一个小小的总结.1 .在使用LoadControl加载控件后,用户控件中的某些控件不再响应事件. 这个问题主要是由于将控件加载放在if (!Page.IsPostBack)之内引起的,放在外面即可.在思归的blog上对此问题进行了详细的说明.2.用户控件中某些控件的响应出现问题,如某个按钮第一次选择时不触发CLI

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

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

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

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

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

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

在Asp.Net中动态加载控件

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

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

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

简单的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()

java-Java GMF 加载控件的问题,求指教!

问题描述 Java GMF 加载控件的问题,求指教! 我在学习GMF的相关知识,由于刚入门,所以对于GMF的内部框架不清楚 我从数据库中取出相关的数据,自己生成文件后,把文件提交给GMF,生成图形控件 生成图形控件后 控件图标上面有个叉叉 求产生这个叉叉的原因是什么, 如何修改