返回首页

 0;简介
当在运行时动态添加控件到ASP.NET页面对象 引用丢失在回传,因为他们没有在源代码的处理。 & #160; 访问这些对象时,由用户输入的值是不availible 回传后,他们似乎空。本文介绍了如何使用   ; ViewState的重建和重新插入对象的回传值 访问他们的价值观。 背景 & #160;
与ASP.NET应用程序使用动态生成控件的页面 需要保留在回传的状态。本文描述的解决方案  0;让您在运行时创建一个完全动态的控制数量  0; retreive后回传他们的价值观。 &# 160;  0; 解决方案
动态添加控件有没有对象引用变量在代码隐藏 类。他们只出现在包含控件的控件集合, 即Page.Controls集合。当页面回发到服务器   ; 作为用户互动的结果一个代码隐藏类的新实例 60; 实例化,类的所有变量值从 ViewState中。
这意味着,我们访问的对象从代码隐藏类,  0; 相同的对象一样的"感觉"作为我们的工作前回传,实际上是新的   ;那些通过ViewState和ASP.NET状态了他们的前辈值 & #160; 管理。
因此,动态创建的控件,已不再存在, 因此,从这些控件返回的值有没有地方可去。他们  0; 失去了在ViewState。  0;
为了赶上这些值动态生成的控件需要  0; 重新生成的Page_Load。最重要的是分配 相同的ID,每个控制。 ViewState的使用控件的ID属性 &# 160;恢复值的对象。
& #160; 添加以下内容System.UI.Page类:


public class DynamicallyAddingControls : System.Web.UI.Page

{

    // a Property that manages a counter stored in ViewState

    protected int NumberOfControls

    {

        get{return (int)ViewState["NumControls"];}

        set{ViewState["NumControls"] = value;}

    }



    private void Page_Load(object sender, System.EventArgs e)

    {

        if(!Page.IsPostBack)

            //Initiate the counter of dynamically added controls<

/span>

            this.NumberOfControls = 0;                

        else

            //Controls must be repeatedly be created on postback<

/span>

            this.createControls();

    }



    // This routine creates the controls and assigns a generic ID



    private void createControls()

    {

        int count = this.NumberOfControls;



        for(int i = 0; i < count; i++)

        {

            TextBox tx = new TextBox();

            tx.ID = "ControlID_" + i.ToString();

            //Add the Controls to the container of your choice

            Page.Controls.Add(tx);

        }

    }



    // example of dynamic addition of controls

    // note the use of the ViewState variable

    private void addSomeControl()

    {

        TextBox tx = new TextBox();

        tx.ID = "ControlID_" + NumberOfControls.ToString();



        Page.Controls.Add(tx);

        this.NumberOfControls++;

    }



}



 60;
注意createControls方法,以模拟的方式,  0; 你动态生成的前回传您的网页。这里最重要的 显然是要分配到正确的控制类型相同的ID值  60; 我们可以访问他们在回传。 兴趣点
此解决方案,因为ASP.NET的ViewState支持动态添加控件,但不执行为我们重新生成。只要ID属性匹配ASP.NET没有休息对我们的工作。
感谢埃里克Stter本文提供宝贵的意见!

回答

评论会员:BrightSoul 时间:2011/11/29
你总是应该添加PreInit事件动态控制(或init,如果你使用一个MasterPage)。否则你会失去asp.net主题功能,除非你明确地调用每个加入的控制ApplyStyleSheetSkin()

此外,必须指出,动态添加的控件状态不能保留在:尝试改变这些控件的知名度或宽度将不被保留。这是因为它不是谁负责保留每个控制值的ViewState,尝试解码ViewState值看到没有提到这些管制措施。你可以完全禁用它,这个例子仍然工作。在现实中,它的Asp.net做别的东西比其他解析和验证回发发生时的ViewState。 Asp.net枚举页面中的控件,如果其中任何一个实现的IPostBackDataHandler,通过Request.Form集合和一个作为参数的集合键,它会调用他们的LoadPostData方法。控制,然后找出如何设置其自身的价值(其Text属性,如果它是一个文本框,检查如果它是一个复选框等)

因此,标签值不保留,因为标签类没有实现的IPostBackDataHandler。这是可以理解的,它是一个标签不会呈现一种形式的控制。

检查此页(第3阶段 - 加载回发数据):
评论会员:pravin4work 时间:2011/11/29
优秀抓取这个问题的网站... ...本文解决的认识在minities
评论会员:。bigbulldawg 时间:2011/11/29
简单明显的例子,
评论会员:zazabzulla 时间:2011/11/29
未将对象引用设置到对象的实例。

some1可以帮助我为什么
评论会员:?Arash的Javadi 时间:2011/11/29
你如何可以通过点击一个添加按钮whitch,添加一个新的按钮到您的网页,其事件做工精细{S0}


Arash的Javadi
{A}
评论会员:会员3232766 时间:2011/11/29
如果您的控件是在一个特定的条件下动态生成,然后看到
{A2}

scvfds
评论会员:MojtabaMadadyar 时间:2011/11/29
您好,
它指向一个错误
"控制"ControlID_0的"类型"文本框"必须放在具有runat = server的窗体标记内。"

如何解决...帮助我
评论会员:adhamzzz 时间:2011/11/29
。您好,感谢对这项有益的职位
我有一个GridView和我的asp.net 2.0页,我填的表在运行时动态。我插入检查箱在最后一列,由用户选择删除或编辑。但是当我按下按钮和页面调回,选中的复选框已失去(与他们的价值观)...!!{ BR}让我知道我该如何解决这个问题。

与问候,mojtaba madadyar(madadyar.com)

与问候。
M. Madadyar
评论会员:Gundamrx78 时间:2011/11/29
近3天我一直试图发现的问题,为什么我不能得到控制值后后回
这里是我的代码,请帮我。 使用系统;
使用System.Data;
使用System.Configuration;
使用System.Collections;
使用的System.Web;
使用System.Web.Security;
使用System.Web.UI程序;
使用System.Web.UI.WebControls程序;
使用System.Web.UI.WebControls.WebParts;
使用System.Web.UI.HtmlControls;

公共部分类问题的System.Web.UI.Page
{
& #160; 保护无效的Page_Load(对象发件人,EventArgs的发送)
&# 160; {
如果(!的IsPostBack)
  ; {

ViewState.Add("模式","0"); }
}
保护覆盖无效LoadViewState(对象savedState)
{

base.LoadViewState(savedState); (ViewState的"模式"]。的ToString()=="1")
 60; {
(TextBox1.Text ="")
{
 0; (I = 0; I
/ / /调用功能"CreateControls"这将创建一个基于在TextBox eneterd的数量控制数量。
 0;/ / /
/ / /
/ / /
保护无效BTN_Submit_Click(对象发件人,EventArgs的发送)
{
(TextBox1.Text ="")
{
& #160;(I = 0; I
/ / /检查用户输入的值并计算总的结果。
/ / /
/ / /
/ / /
保护无效BTN_Result_Click(对象发件人,EventArgs的发送)
{
& #160; (TextBox1.Text ="")
  ;{
(I = 0; I
  ; / / /创建控件的动态页面。
/ / /
保护无效CreateControls(int i)以
{
ASP.mcq_ascx newc =新ASP.mcq_ascx()
newc.ID ="newc"i.ToString()
this.Q_PlaceHolder.Controls.Add(newc);
}
}


评论会员:DiskJunky 时间:2011/11/29
我有问题得到复选框的值后回,有没有问题时产生的动态控制,我只是无法得到的"真实"的价值后,我选中复选框,打在ImageButton {。 BR}
我会得到"假"值后,我回传,连我自己都的复选框选中,是,我错过什么?

帮助表示感谢。

这里是我的代码:

Defualt.aspx:
-------------------------------------------------- --------------------------------------------{ BR}<%@页面语言="C#"的AutoEventWireup ="TRUE"的CodeFile ="Default.aspx.cs"的Inherits ="_Default"的EnableSessionState ="真"的EnableViewState ="真正的"%>
LT;!DOCTYPE HTML PUBLIC" - / / W3C / / DTD XHTML 1.0 / / EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
LT; HTML的xmlns ="htt​​p://www.w3.org/1999/xhtml">
LT;头RUNAT ="服务器">
<标题>无题Pagelt; / TITLE>


&# 160; LT;形式ID ="Form1的"RUNAT ="服务器">
 0; LT; ASP的ImageButton ID ="AddToCartButton"的onclick ="AddToCartBtn_Clicked"的ImageUrl ="图像/ btn_addtocart.gif"RUNAT ="服务器"/>
LT; ASP:占位符ID ="BestDiscountPlaceHolder"可见="假"RUNAT ="服务器"/>
& #160;


-------------------------------------------------- ----------------------------------------------{ BR}
在default.aspx.cs
-------------------------------------------------- ----------------------------------------------{ BR}使用系统;
使用System.Collections;
使用System.ComponentModel;
使用System.Data;
使用System.Drawing;
使用的System.Web;
使用System.Web.SessionState;
使用System.Web.UI程序;
使用System.Web.UI.WebControls程序;
使用System.Web.UI.HtmlControls;
使用System.Web.Mail;
使用System.Web.Security;
使用System.Globalization;
使用System.Security.Cryptography;
使用System.Text;

公共部分类_Default的System.Web.UI.Page
{
保护System.Web.UI.WebControls.Label BestDiscountLabel;
  ;保护System.Web.UI.WebControls.CheckBox BestDiscountChkbox;

保护无效的Page_Load(对象发件人,EventArgs的发送)
{
 60; 十进制的价格= Convert.ToDecimal(99.99)
& #160; 新标签BestDiscountLabel =()
& #160; BestDiscountLabel.Text ="Book1的
评论会员:jugomkd 时间:2011/11/29
每次单击"图像"按钮,回传occurs.This意味着,页面将被再次装入
。 &# 160; 因为,你是建立在每一页上负载复选框,您选中的复选框死亡被发布到服务器的回发事件ie.on的发生,你最终会看到每一个新的复选框反正从来没有检查的时间。
所以,你需要ViewState来坚持之间的回传值。

解决方案:

*执行你写在Page_Load只有一次ie.during第一次请求页面的代码。
*在您单击图像按钮,保存在ViewState中的状态,这样可以在随后的页面加载检索页面。

Saswata Purkayastha
Satyam计算机服务公司。

评论会员:游客 时间:2011/11/29
嵌入式|但你们如何控制值保存在ViewState?!!
比托尔雨果巴罗斯
评论会员:游客 时间:2011/11/29
我同意你的,我想这将是一个新的属性,例如Textvalue将被分配到视图状态,但我不知道,如果你可以仅几行如何真正应该像。我很困惑,添加新的标签的文本值视图状态。感谢
smair
评论会员:游客 时间:2011/11/29
我投票项目,但我的问题时,如何找到动态控制,我..我使用它来创建动态控制:保护保护WithEventsPilBoxSystem.Web.UI.WebControls.TextBoxSystem.Web.UI.WebControls.Table保护WithEventsCreateOptionButton作为System.Web.UI程序WithEvents表。WebControls.ButtonSystem.Web.UI.WebControls.ButtonNBSP保护WithEventsSaveButton,分CreateOptionButton_Click(BYVAL作为System.Object的,BYVALe由于发件人)处理CreateOptionButton.Click{BR}昏暗的温度为整数DIM我为整数=PilBox.TextTEMP=1到iNBSP;-;作为新System.Web.UI.WebControls.TextBoxNBSP昏暗的结核病;NBSP-;tb.ID="PIL"放大器;温度NBSP;-;DIMmycell作为新的TableCellNBSP;-;作为新的TableCellNBSP昏暗的彗星;NBSP;-;c.Controls.Add(是LiteralControl("答案选项"放大器;温度放大器":"))NBSP-;mycell.Controls.Add(TB)-;DIMmyrow作为新的TableRowmyrow.Cells。(三)myrow.Cells.Add(mycell)-;Table1.Rows.Add(myrow)NBSP;-;下一步温度ENDSUB当我把它称为由单击SaveButton:分SaveButton_Click(BYVAL作为System.Object的,BYVALe由于发件人)把手SaveButton.Click昏暗的温度为整数DIM我为整数=PilBox.Text{BR}TEMP=1到i-;DIM作为文本框NBSPmyexisttb;NBSP;-;myexisttb=Table1.FindControl("太平船务"放大器;温度)NBSP"保存到数据库通过调用myexisttb下一步温度ENDSUBBR}当我点击SaveButton,动态控制,我之前消失..错误:对象引用设置到对象的实例有人可以帮我吗??前感谢..NBSP风流Christmast和2006年新年快乐给你所有....{BR}{BR}ryuki
比托尔雨果巴罗斯
评论会员:游客 时间:2011/11/29
喜好文章!我想这是真的对我有用,但你不解释我怎样才能获得的数据更新/插入的文本框上的DB。谁能告诉我该怎么办呢?我做的是一个动态列表文本框夹具填补的结果(更新-一个接一个-在DB)。多谢了!
biktor81
评论会员:游客 时间:2011/11/29
这可能是为您为时已晚,但我希望它可以帮助关于在文本框的数据,你可以使用命名的HttpContext一类,你应该特别定义下面的System.Web.HttpContextctxRecieved=System.Web.HttpContext.Current;,那么你可以通过在页面中的元素的循环,你的代码可能看起来是这样的:(I=0;ILT=ctxRecieved.Request.Form.Count;I){//获取当前元素NBSP的关键和价值;关键=ctxRecieved.Request.Form.GetKey(I);VAL=ctxRecieved.Request。表[关键]{BR}...{BR}val是文本框中的文字里面,关键是一个字符串值,表示在页面元素的名称{BR}注意:此过程是有用的,如果所谓的OnInit(..)方法艾哈迈德Alsmair
smair
评论会员:游客 时间:2011/11/29
非常感谢您{!BR}其实我已经做了另一种方式......但surelly这种方式将在如下因素的方法有用我的项目!THX一个再次,比托尔雨果巴罗斯
kannadasan
评论会员:游客 时间:2011/11/29
出的好奇,怎么你结束后回传检索你动态创建的控件的值?,瑞安