C# 在尝试更改视图时,“多视图”以编程方式添加视图并使其消失
我有一段代码,它将x个视图添加到多视图控件中。多视图控件存在于只有一个视图的页面上。在page init上,我创建了x个视图,其中每个视图都添加了GridView控件,当我循环查找要显示的视图时,Multiview控件表示它只有一个视图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()
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" />