C# 在尝试更改视图时,“多视图”以编程方式添加视图并使其消失

C# 在尝试更改视图时,“多视图”以编程方式添加视图并使其消失,c#,asp.net,C#,Asp.net,我有一段代码,它将x个视图添加到多视图控件中。多视图控件存在于只有一个视图的页面上。在page init上,我创建了x个视图,其中每个视图都添加了GridView控件,当我循环查找要显示的视图时,Multiview控件表示它只有一个视图 protected void variantRepeat_ItemCommand(object source, RepeaterCommandEventArgs e) { if (e.CommandSource.GetType()

我有一段代码,它将x个视图添加到多视图控件中。多视图控件存在于只有一个视图的页面上。在page init上,我创建了x个视图,其中每个视图都添加了GridView控件,当我循环查找要显示的视图时,Multiview控件表示它只有一个视图

    protected void variantRepeat_ItemCommand(object source, RepeaterCommandEventArgs e)
    {
        if (e.CommandSource.GetType() == typeof(LinkButton))
        {
            string theID = ((LinkButton)e.CommandSource).CommandArgument.ToString();
            ViewCollection views = prodView.Views; //this has only 1 view the one that has been added on the source view of the .aspx page
            foreach (View toDisplay in views)
            {
                if (toDisplay.ID == theID)
                    prodView.SetActiveView(toDisplay);
            }
        }

    }
上面的代码循环查找视图并显示它。为什么所有的视图都消失了,我已经在init中进行了介绍,在它处理完数据库查询之后,在源代码视图中有x个视图>1

为什么此控件“丢失”视图

初始化代码:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (Request.QueryString == null || Request.QueryString.Count < 1)
            Response.Redirect(Server.MapPath("~/Packages/"));
        if (!Page.IsPostBack)
        {
            if (Request.QueryString["id"].ToString() == string.Empty)
                Response.Redirect(Server.MapPath("~/Packages/"));
            var id = Server.HtmlEncode(Request.QueryString["id"].ToString());
            Guid packID = Guid.Parse(id);
            using (var context = new GaleEntities())
            {
                var thePackage = context.PackageEnts.First(p => p.packageID == packID);
                var theVariants = thePackage.Variants;
                var mydatasource = new List<PackageEnt> { thePackage };
                var myVariantDataSource = new List<Variant>();
                foreach (Variant single in theVariants)
                {
                    myVariantDataSource.Add(single);
                }
                packageForm.DataSource = mydatasource;
                variantRepeat.DataSource = myVariantDataSource;
                RenderProductGridviews(theVariants);
                prodView.SetActiveView(prodView.Views[0]);
            }
            packageForm.DataBind();
            variantRepeat.DataBind();
            Page.DataBind();
        }
    }

    protected void RenderProductGridviews(System.Data.Objects.DataClasses.EntityCollection<Variant> variantCol)
    {
        foreach (Variant packVar in variantCol)
        {

            View newView = new View();

            GridView prodGrid = new GridView();
            var myProdDataSource = new List<vw_VariantProduct>();             
            using (var context = new GaleEntities())
            {
                var singleProd1 = context.vw_VariantProduct.Where(vp => vp.variantID == packVar.variantID);
                foreach (vw_VariantProduct extProd in singleProd1)
                {
                    myProdDataSource.Add(extProd);
                }
            }
            prodGrid.DataSource = myProdDataSource;

            BoundField _column = new BoundField();
            _column.DataField = "product_title";
            _column.HeaderText = "Product";
            prodGrid.Columns.Add(_column);

            _column = new BoundField();
            _column.DataField = "product_title";
            _column.HeaderText = "Product";
            prodGrid.Columns.Add(_column);

            _column = new BoundField();
            _column.DataField = "product_desc";
            _column.HeaderText = "Description";
            prodGrid.Columns.Add(_column);

            _column = new BoundField();
            _column.DataField = "product_time";
            _column.HeaderText = "Time (mins)";
            prodGrid.Columns.Add(_column);

            _column = new BoundField();
            _column.DataField = "quantity";
            _column.HeaderText = "Quantity";
            prodGrid.Columns.Add(_column);

            prodGrid.DataBind();
            newView.ID = packVar.variantID.ToString();
            newView.Controls.Add(prodGrid);
            prodView.Views.Add(newView);
        }
    }
受保护的无效页面加载(对象发送方,事件参数e)
{
if(Request.QueryString==null | | Request.QueryString.Count<1)
重定向(Server.MapPath(“~/Packages/”);
如果(!Page.IsPostBack)
{
if(Request.QueryString[“id”].ToString()==string.Empty)
重定向(Server.MapPath(“~/Packages/”);
var id=Server.HtmlEncode(Request.QueryString[“id”].ToString());
Guid packID=Guid.Parse(id);
使用(var-context=new-entities())
{
var thePackage=context.PackageEnts.First(p=>p.packageID==packID);
var theVariants=包装。变体;
var mydatasource=新列表{thePackage};
var myVariantDataSource=新列表();
foreach(变体中的单个变体)
{
myVariantDataSource.Add(单个);
}
packageForm.DataSource=mydatasource;
variantRepeat.DataSource=myVariantDataSource;
RenderProductGridView(变体);
SetActiveView(prodView.Views[0]);
}
packageForm.DataBind();
variantRepeat.DataBind();
Page.DataBind();
}
}
受保护的无效RenderProductGridView(System.Data.Objects.DataClasses.EntityCollection variantCol)
{
foreach(variantCol中的变量packVar)
{
视图newView=新视图();
GridView prodGrid=新建GridView();
var myProdDataSource=新列表();
使用(var-context=new-entities())
{
var singleProd1=context.vw_VariantProduct.Where(vp=>vp.variantID==packVar.variantID);
foreach(singleProd1中的vw_VariantProduct extProd)
{
添加(extProd);
}
}
prodGrid.DataSource=myProdDataSource;
BoundField_column=新的BoundField();
_column.DataField=“产品名称”;
_column.HeaderText=“产品”;
prodGrid.Columns.Add(_column);
_列=新的边界字段();
_column.DataField=“产品名称”;
_column.HeaderText=“产品”;
prodGrid.Columns.Add(_column);
_列=新的边界字段();
_column.DataField=“产品描述”;
_column.HeaderText=“Description”;
prodGrid.Columns.Add(_column);
_列=新的边界字段();
_column.DataField=“产品\时间”;
_column.HeaderText=“时间(分钟)”;
prodGrid.Columns.Add(_column);
_列=新的边界字段();
_column.DataField=“数量”;
_column.HeaderText=“数量”;
prodGrid.Columns.Add(_column);
prodGrid.DataBind();
newView.ID=packVar.variantID.ToString();
newView.Controls.Add(prodGrid);
prodView.Views.Add(newView);
}
}

设置活动视图的第一个代码块是基于
ItemCommand
事件的,因此我假设它在
回发期间触发


Page\u Load
中添加附加视图的代码只有在没有回发的情况下才会运行。尝试删除条件
if(!Page.IsPostBack)
语句。您需要在每个页面生命周期中添加动态控件。

您要设置活动视图的第一个代码块是基于
ItemCommand
事件的,因此我假设在
回发期间触发此事件


Page\u Load
中添加附加视图的代码只有在没有回发的情况下才会运行。尝试删除条件
if(!Page.IsPostBack)
语句。您需要在每个页面生命周期中添加动态控件。

现在,与往常一样,ASP.Net Word中几乎所有带有动态控件的问题都有一个共同的问题

您需要在每篇文章上创建动态控件,您仅在第一次加载页面时创建它们。遵循以下简单规则:

  • 不使用母版页时,应在PreInit事件中创建动态控件,如果是,则在Init事件中创建控件
  • 避免在这些事件中设置可以在每个post中更改的属性,因为当应用视图状态(在post事件中)时,这些属性将被覆盖
  • 每次发布页面时都必须创建动态控件,如果(!this.IsPostBack)this.CreatemyDynamicControls(),请避免此操作
  • 在PreInit或Init事件中创建控件时,它们的状态将在post事件中自动设置,这意味着在LoadComplete事件中,控件将包含它们的状态,即使在每次post中再次创建控件时,甚至在没有显式设置其状态时。注意:当您处理在设计时创建的控件时,此行为是不同的,在这种情况下,设置状态的事件是加载事件
  • 事件订阅应在PageLoadComplete之前发生,否则不会发生
    public partial class DynamicControlsOnDemand : System.Web.UI.Page
    {
        public int NumberOfControls
        {
            get
            {
                if (this.ViewState["d"] == null)
                {
                    return 0;
                }
                return int.Parse(this.ViewState["d"].ToString());
            }
            set
            {
                this.ViewState["d"] = value;
            }
        }
    
        protected void Page_PreLoad(object sender, EventArgs e)
        {
            this.CreateDynamicControls();
        }
    
        protected void addControl_Click(object sender, EventArgs e)
        {
            this.NumberOfControls = this.NumberOfControls + 1;
            this.myPanel.Controls.Add(this.CreateTextbox(this.NumberOfControls));
        }
    
        private void CreateDynamicControls()
        {
            for (int i = 0; i < this.NumberOfControls; i++)
            {
                var t = this.CreateTextbox(i + 1);
                t.TextChanged += (x, y) => this.lblMessage.Text += "<br/>" + (x as TextBox).ID + " " + (x as TextBox).Text;
    
                this.myPanel.Controls.Add(t);
            }
        }
    
        private TextBox CreateTextbox(int index)
        {
            var t = new TextBox { ID = "myTextbox" + index.ToString(), Text = "de" };
    
            return t;
        }
    }
    
        <asp:Panel runat="server" ID="myPanel">
        </asp:Panel>
        <asp:Button Text="Add Control" runat="server" ID="addControl" OnClick="addControl_Click" />
        <asp:Label ID="lblMessage" runat="server" />