asp.net 一个动态创建控件的问题

问题描述

protectedvoidPage_Load(objectsender,EventArgse)  {  CheckBoxListchk=newCheckBoxList();  if(!IsPostBack)  {  chk.Items.Add("Hello");  }  form1.Controls.Add(chk);  }  在Page上扔个Button,以便可以PostBack。运行后Postback的结果,“Hello”item没被保留。  改为:  protectedvoidPage_Load(objectsender,EventArgse)  {  CheckBoxListchk=newCheckBoxList();  form1.Controls.Add(chk);  if(!IsPostBack)  {  chk.Items.Add("Hello");  }  }  或者:  protectedvoidPage_Load(objectsender,EventArgse)  {  CheckBoxListchk=newCheckBoxList();  (chk.ItemsasIStateManager).TrackViewState();  if(!IsPostBack)  {  chk.Items.Add("Hello");  }  form1.Controls.Add(chk);  }为什么改写后的第一种写法就可以保持状态了?

解决方案

解决方案二:
没人?有没有人来
解决方案三:
因为这种ASP.NET本身是无状态的,每次请求时服务器根本不知道客户端上次是怎么样子的,动态添加的必须在Page_Load事件里面每次都要执行
解决方案四:
然后ASP.NET会根据ViewState进行各种数据恢复
解决方案五:
引用2楼starfd的回复:

因为这种ASP.NET本身是无状态的,每次请求时服务器根本不知道客户端上次是怎么样子的,动态添加的必须在Page_Load事件里面每次都要执行

这个我知道,但是两种方法就在一个form1.Controls.Add(chk)这句话放的位置的问题,为什么放在ispostback的后面就不行,我在  CheckBoxListchk=newCheckBoxList();  form1.Controls.Add(chk);两句话里面加了一句stringa=“aa”;貌似也是可以保持状态的
解决方案六:
asp.net要回填ViewState状态数据,就需要在控件树同一个位置找到ID相同的控件,然后才能填入ViewState,并且准备在Load结束之后触发相关xxxxChanged事件。如果找不到控件,那么就不填入,自然随后也就不会触发事件。这是asp.net的原理,没什么好奇怪的。你在vs的设计器上拖入到设计页面的控件,被自动生成的代码在页面的Init阶段写入了类似你的第一段那样的代码。因为它们不是动态加入的,不需要判断其它的Viewstate、Coolie、QueryString等等,因此可以在Init阶段加入。而你写的,通常需要判断各种参数,因此不能在页面对象的Init时动态产生,而应该在Page_Load过程中才动态产生。asp.net对于会在你使用Controls.Add新的子控件的时候,将页面回发得到的ViewState、PostData数据回填到你动态产生的控件内,这样你的动态产生的chk在Load结束之后,不但有了动态变化的属性值,而且会随后自动触发有关的xxxxChanged之类的事件。基本上,现在的asp.net程序员只学asp.net必备知识的20%甚至更少,而各种社会培训班只教asp.net组件设计的原理知识的10%都不到。因此我认为asp.net从生态和教育角度看其实已经“完了”,不会有什么发展了,它的复杂的一整套机制其实90%以上都被人忘记了。为了以后少发生类似的尴尬,可以考虑回避这些问题,绝不用asp.net进行UI处理。一切都用前端开发来完成!
解决方案七:
引用5楼sp1234的回复:

asp.net要回填ViewState状态数据,就需要在控件树同一个位置找到ID相同的控件,然后才能填入ViewState,并且准备在Load结束之后触发相关xxxxChanged事件。如果找不到控件,那么就不填入,自然随后也就不会触发事件。这是asp.net的原理,没什么好奇怪的。你在vs的设计器上拖入到设计页面的控件,被自动生成的代码在页面的Init阶段写入了类似你的第一段那样的代码。因为它们不是动态加入的,不需要判断其它的Viewstate、Coolie、QueryString等等,因此可以在Init阶段加入。而你写的,通常需要判断各种参数,因此不能在页面对象的Init时动态产生,而应该在Page_Load过程中才动态产生。asp.net对于会在你使用Controls.Add新的子控件的时候,将页面回发得到的ViewState、PostData数据回填到你动态产生的控件内,这样你的动态产生的chk在Load结束之后,不但有了动态变化的属性值,而且会随后自动触发有关的xxxxChanged之类的事件。基本上,现在的asp.net程序员只学asp.net必备知识的20%甚至更少,而各种社会培训班只教asp.net组件设计的原理知识的10%都不到。因此我认为asp.net从生态和教育角度看其实已经“完了”,不会有什么发展了,它的复杂的一整套机制其实90%以上都被人忘记了。为了以后少发生类似的尴尬,可以考虑回避这些问题,绝不用asp.net进行UI处理。一切都用前端开发来完成!

请问“asp.net对于会在你使用Controls.Add新的子控件的时候,将页面回发得到的ViewState、PostData数据回填到你动态产生的控件内”这句话,第一种写法不是也调用了controls.Add添加新的子控件,这样的话通过在pageload里面也应该是能通过id找到控件,把ViewState,数据回填到控件里面去的?为什么没有添进去。还有这个例子是在看TrackViewState()与视图状态保存一个作者举例出来的,但是确实是看不懂
解决方案八:
这种比较高端了别在Page_Load事件里写,要在它之前的事件写,比如Page_Init,或者比这个事件更早的页面事件多年之前我看书上老外是那样写的,我也没理解
解决方案九:
我今天找到了下,原来是第一种写法是ViewState在首次页面加载的时候,没有把chk的项的值加到ViewState里面去,第二种方法写的话,在saveviewstate的方法的时候就加进去了,如图
解决方案十:
突然理解了,原来是第一种方法没用是因为,在声明一个checkbox的时候,在pageload里面加了checkbox的项,但是没有调用Controls.Add方法,所以这时候,没有调用TrackViewState()这个方法,所以就没有把chk标记为Dirty,所以在第一次请求的时候对chk的任何的更改都不会保存到ViewState上,所以在saveviewstate是,是没有把chk的项的值存储到viewstate里面,这也是导致为什么第一次加载页面的时候viewstate里面没有值的原因,当然在回发的时候,在pageload的时候创建chk的时候,虽然调用了Controls.Add但是由于ViewState里面没有前面添加的值,所以导致chk的值没有还原。不知道我理解的对不对,请大家指正下

时间: 2024-10-21 21:51:51

asp.net 一个动态创建控件的问题的相关文章

ASP.NET动态创建控件之绝境求生

在ASP.NET中动态创建一个控件总是不那么顺利,特别是当对页面的Life Cycle不是那么了然的情况下!这里简单描述一下要求,然后提供一个解决方案,大家看看有没有更好的Idea,如果有的话就是我的大幸了,呵呵! 要求:页面上有一个Add按钮,每点击一次该按钮,页面上动态创建一个WebPartZone! 提醒:WebPartZone只能在OnInit或之前才能创建,否则报异常! 大家都知道,按钮的点击事件是在RaisePostbackEvent时触发的,这意味着点击事件在OnLoad阶段之后才

在ASP.NET2.0下动态创建控件,并能保持保持其状态,能获取其值的问题。

问题描述 在ASP.NET2.0下动态创建控件,并能保持保持其状态,能获取其值.在1.1下重载PageState,SaveViewState,LoadViewState等属性方法可以实现,在2.0下好多都无法实现.请教各位可有什么好的方法. 解决方案 解决方案二:属性用ViewState保存,都可以持久化的啊解决方案三:我动态生成那么多控件,难道都的手动ViewState保存??

如何对动态创建控件进行验证以及在Ajax环境中的使用

首先给一个常规的动态创建控件,并进行验证的代码 [前端aspx代码] <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test.aspx.cs" Inherits="Test" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http

泛型-c# 动态创建控件 及触发事件 即插即用。

问题描述 c# 动态创建控件 及触发事件 即插即用. 各大大好,初来驾到,请大家多多关照,问题是这样的.需求 :需要动态添加控件.然后需要项目做出来后要实现"即插即用"的特点.(即插即用:我们要是更新一个功能,用户只要更新这个控件就可以直接使用,而不用更新整个客服端)问题 :知道要用泛型来写,但是看了一天了,不知道如何下手,现已写了如下代码:using System;using System.Collections.Generic;using System.Linq;using Sys

在.NET上如何根据字符串动态创建控件

创建|动态|控件|字符串   在.Net上用字符串动态创建控件是通过反射来实现. 首先,利用System.Type.GetType方法,获得字符串中指定的控件的类型实例. 这里需要注意这个字符串的语法,根据msdn的解释: 按名称和签名隐藏会考虑签名的所有部分,包括自定义修饰符.返回类型.参数类型.标记和非托管调用约定.这是二进制比较. 对于反射,属性和事件按名称和签名隐藏.如果基类中有同时带 get 访问器和 set 访问器的属性,但派生类中仅有 get 访问器,则派生类属性隐藏基类属性,并且

动态创建控件支持事件响应并可保存与读取

VC++6.0中创建动态控件是比较偏离基础的知识,也有一定的难度.它的完整功能是要动态创建控件后再动态响应控件中的事件,两者全部做到才算完整. 这里我将展示一个完整的动态控件示例,它可以动态创建控件,然后再动态响应控件事件,并可以保存控件信息至ini配置文件,然后再根据ini文件读取出控件信息来动态创建控件.相信它能够解决你在动态控件中所遇到的许多问题. 当然,动态控件的方法有许多种,我展示的只是给我认为较好的. 这里以VC++6.0创建对话框工程为例,添加菜单,分别添加子项按钮,文本框,标签.

dll动态库-MFC 动态创建控件不响应消息

问题描述 MFC 动态创建控件不响应消息 按照工程的要求,我必须建立一个类(动态链接库中),这个类是从CWnd派生的,里面的控件全部要求动态生成,而我这个类会作为一个Dialog的成员变量. 目前动态创建控件可以实现,但是控件却不响应消息,我认为是消息只在Dialog中,没法传到其成员变量中,不知道是不是这个原因--请大神帮忙! 我做了一个很简单的程序,请大神帮忙分析一下,灰常灰常感谢~ 解决方案 // MFCApplication1Dlg.h : 头文件 protected: CTestWnd

请问lotus如何动态创建控件

问题描述 在开发的过程中,小弟有几个疑问,希望大家能帮帮:1.在lotus里(C/S)能否动态创建控件,如按纽,热点连接等,还要能点击后传值给相应的表单,在另一个表单里能获取传值,像b/s里的连接一样2.点击表单,弹出自定义的子表单,在子表单里填写相应的内容,然后传值到父表单里.以上两个问题,希望高手能帮忙解答下,最好有代码示例,谢谢 解决方案 解决方案二:怎么没人,很急啊解决方案三:我没实现过这样的.为什么会有这样的需求呢?解决方案四:因为我们现在有个这样的需求,假如某个员工的档案,有几个表,

MFC中动态创建控件以及事件响应实现方法_C 语言

本文实例讲述了MFC中动态创建控件以及事件响应实现方法,分享给大家供大家参考.具体实现方法如下: 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态控件: 为了对照,我们先来看一下静态控件的创建. 放置静态控件时必须先建立一个容器,一般是对话框,这时我们在对话框编辑窗口中,从工具窗口中拖出所需控件放在对话框中即可,再适当修改控件ID,设置控件属性,一个静态控件就创建好了,当对话框被显示时,其上的控件也会显示. 静态控件不需要调用Create()