Asp.net 在多视图中切换视图时,动态用户控件会丢失数据

Asp.net 在多视图中切换视图时,动态用户控件会丢失数据,asp.net,viewstate,multiview,dynamic-usercontrols,Asp.net,Viewstate,Multiview,Dynamic Usercontrols,我有一个包含两个视图的多视图(第一个视图带有表单,第二个视图用于查看在第一个视图中输入的数据)。第一个视图包含一个文本框和一个占位符。占位符用于保存动态添加的add UserControl。UserControl包含下拉列表、文本框和复选框。 工作正常:目前我可以通过添加按钮在页面中添加新的用户控件,这会导致页面回发,但不会丢失现有动态用户控件中的任何数据。 问题:在视图之间切换(使用SetActiveView)时,动态添加的用户控件中的数据丢失,但静态文本框中的数据保持不变 下面是代码片段 &

我有一个包含两个视图的多视图(第一个视图带有表单,第二个视图用于查看在第一个视图中输入的数据)。第一个视图包含一个文本框和一个占位符。占位符用于保存动态添加的add UserControl。UserControl包含下拉列表、文本框和复选框。 工作正常:目前我可以通过添加按钮在页面中添加新的用户控件,这会导致页面回发,但不会丢失现有动态用户控件中的任何数据。 问题:在视图之间切换(使用SetActiveView)时,动态添加的用户控件中的数据丢失,但静态文本框中的数据保持不变

下面是代码片段

<%@ Page Title="" Language="C#" MasterPageFile="~/M.master" AutoEventWireup="true" CodeFile="test.aspx.cs" Inherits="test" %>
<%@ Reference Control="dynamic_uc.ascx" %>
<%@ Register src="dynamic_uc.ascx" tagname="ucrange" tagprefix="uc1" %>

<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">

<div class="light_blue_background pad10 helvetica innerpad5">
    <asp:MultiView ID="mv_main" runat="server" ActiveViewIndex="0">
            <asp:View ID="vu_add" runat="server">
        <table>
            <tr style="border-bottom: 1px solid #ccc;">
                <td>
                     Name:
                </td>
                <td>
                    <asp:TextBox ID="txt_Name" runat="server" Columns="50" MaxLength="35" />
                </td>
            </tr>

        </table>

            <asp:Panel ID="pnl_TempRange_" runat="server">

    </asp:Panel>
 <asp:PlaceHolder ID="pl_Range" runat="server"></asp:PlaceHolder>
    </asp:View>
    <asp:View ID="vu_review" runat="server">
        review your data
    </asp:View>
    </asp:MultiView>

    <asp:Button ID="btn_addRange" runat="server" Text="Add Range" 
        CausesValidation="False" onclick="btn_addRange_Click" />

    <asp:Button ID="btn_submit" runat="server" Text="Submit" 
        onclick="btn_submit_Click" />

    <asp:Button ID="btn_modify" runat="server" Text="Modify" 
        onclick="btn_modify_Click" Visible="false"/>

</div>

</asp:Content>

姓名:
查看您的数据
C#代码:

使用系统;
使用System.Collections.Generic;
使用System.Web;
使用System.Web.UI;
使用System.Web.UI.WebControl;
使用System.Data.SqlClient;
使用系统数据;
公共部分类测试:System.Web.UI.Page
{
私有静态int-ControlCount=0;
受保护的无效页面加载(对象发送方、事件参数e)
{
如果(!Page.IsPostBack)
{
ControlCount=0;
}
AddControls();
foreach(pnl_TempRange.控件中的控件c)
{
DropDownList ddl_UpLimit=(DropDownList)c.FindControl(“ddl_UpLimit”);
PopulateDropdownRange(ddl_上传,0100);
DropDownList ddl_LowLimit=(DropDownList)c.FindControl(“ddl_LowLimit”);
PopulateDropdownRange(ddl_下限,0,100);
}
响应、写入(测试);
}
公共静态控件GetPostBackControl(第页)
{
控制=空;
string ctrlname=page.Request.Params.Get(“\uu EVENTTARGET”);
if(ctrlname!=null&&ctrlname!=string.Empty)
{
控件=page.FindControl(ctrlname);
}
其他的
{
foreach(page.Request.Form中的字符串ctl)
{
控件c=page.FindControl(ctl);
if(c是System.Web.UI.WebControls.Button)
{
控制=c;
打破
}
}
}
返回控制;
}
私有void AddControls()
{
int ID=0;
控制cd=GetPostBackControl(第页);
如果((c!=null))
{
如果(c.ID.ToString()=“btn\U添加范围”)
{
动态uUC++;
}
}
pl_Range.Controls.Clear();

对于(int i=0;实际上我自己解决了这个问题。我所要做的就是添加代码,在Page_Init而不是Page_Load中创建用户控件。对我来说也是!!谢谢@Danger Scholar:)
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data;

public partial class Test : System.Web.UI.Page
{
    private static int ControlCount=0;
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
           ControlCount = 0;
        }
        AddControls();
        foreach (Control c in pnl_TempRange.Controls)
        {
            DropDownList ddl_UpLimit = (DropDownList)c.FindControl("ddl_Uplimit");
            PopulateDropdownRange(ddl_UpLimit, 0, 100);
            DropDownList ddl_LowLimit = (DropDownList)c.FindControl("ddl_Lowlimit");
            PopulateDropdownRange(ddl_LowLimit, 0, 100);
        }
        Response.Write(tests);
    }

    public static Control GetPostBackControl(Page page)
    {
        Control control = null;

        string ctrlname = page.Request.Params.Get("__EVENTTARGET");
        if (ctrlname != null && ctrlname != string.Empty)
        {
            control = page.FindControl(ctrlname);
        }
        else
        {
            foreach (string ctl in page.Request.Form)
            {
                Control c = page.FindControl(ctl);
                if (c is System.Web.UI.WebControls.Button)
                {
                    control = c;
                    break;
                }
            }
        }
        return control;
    }
    private void AddControls()
    {
        int ID = 0;
        Control cd =  GetPostBackControl(Page);
        if ((c != null))
        {
            if (c.ID.ToString() == "btn_addRange")
            {
                dynamic_uc++;
            }
        }
        pl_Range.Controls.Clear();
        for (int i = 0; i <= tempControlCount; i++)
        {
            Range DynamicUserControl = (Range)Page.LoadControl("dynamic_uc.ascx");

            while (IsInDeletedLog("uc" + ID) == true)
            {
                ID += 1;
            }
            DynamicUserControl.ID = "dyn_uc" + ID;

            DynamicUserControl.RemoveTempControl += this.HandleRemoveTempRange;
            pl_Range.Controls.Add(DynamicUserControl);
            ID += 1;
        }


    }

    protected void btn_addRange_Click(object sender, EventArgs e)
    {

    }

    private void PopulateDropdownRange(DropDownList ddl, int rangeMin, int rangeMax)
    {
        ddl.Items.Clear();
        ddl.Items.Add("--Select--");
        for (int i = rangeMin; i <= rangeMax; i++)
        {
            ddl.Items.Add(new ListItem(i.ToString(),i.ToString()));
        }
    }
    private void BindDDl(DropDownList ddl,string strQuery)
    {
        ddl.DataSource = GetDataFromQuery(strQuery);
        ddl.DataValueField = "VALUE";
        ddl.DataTextField = "NAME";
        ddl.DataBind();
        ddl.Items.Insert(0,"--Select--");
    }

    protected void btn_submit_Click(object sender, EventArgs e)
    {
        if (Page.IsValid)
        {         
            mv_main.SetActiveView(vu_reviewCmpd);
            btn_submitCompound.Visible = false;

            btn_confirmCompound.Visible = true;
            btn_modifyCompound.Visible = true;
        }
    }

    protected void btn_modify_Click(object sender, EventArgs e)
    {
        mv_main.SetActiveView(vu_add);
        btn_submit.Visible = true;

        btn_confirm.Visible = false;
        btn_modify.Visible = false;
    }