[英]Maintaining Dynamically added controls in ASP.net
我被困在如何维护Webforms应用程序中动态添加的用户控件的viewstate。 我创建了一个名为Set.ascx的用户控件:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Set.ascx.cs" Inherits="CustomControlLab.Set" %>
 
<asp:Label ID="BodyArea" CssClass="SetLabel" runat="server" Text="Label"></asp:Label>
 
<asp:Label ID="Exercise" CssClass="SetLabel" runat="server" Text="Label"></asp:Label>
 
<asp:Label ID="SetNo" CssClass="SetLabel" runat="server" Text="Label"></asp:Label>
 
<asp:Label ID="Reps" CssClass="SetLabel" runat="server" Text="Label"></asp:Label>
用户将从下拉列表中选择项目以设置每个标签的值。 这是在按钮单击事件上设置的,如下所示:
protected void AddExercise_Click(object sender, EventArgs e)
{
Set set = (Set)Page.LoadControl("Set.ascx");
int currentSet = (int)ViewState["Sets"];
set._bodyArea = AreaSelect.SelectedValue;
set._exercise = ExerciseSelect.SelectedValue;
set._reps = RepNumbers.SelectedValue;
set._setNumber = currentSet.ToString();
int idCount = (int)ViewState["Sets"];
set.ID = string.Format("set{0}", idCount);
currentSet++;
ViewState["Sets"] = currentSet;
WeightList.Controls.Add(set);
}
这可以将我的用户控件正确添加到面板控件WeightList中。 我无法解决的是如何在页面初始化事件中成功地重新创建这些控件? 我想这与控件ID有关吗? 也许我的方法永远行不通。 任何反馈都将非常有帮助!
在Tims评论之后,我不确定如何使用ID重新加载UserCOntrol。 如果回发,我在Page_Load事件中尝试过此操作:
else
{
if(ViewState["Sets"] != null)
{
int sets = (int)ViewState["Sets"];
for (int i = 0; i < sets; i++)
{
Set set = new Set();
set = (Set)Page.FindControl(string.Format("MainContent_set{0}", i + 1));
WeightList.Controls.Add(set);
}
}
}
但它不会重新创建Set对象。 查看页面,每个Set UC加载后呈现以下内容:
 
<span id="MainContent_set1_BodyArea" class="SetLabel">All Exercises</span>
 
<span id="MainContent_set1_Exercise" class="SetLabel">Bench Press</span>
 
<span id="MainContent_set1_SetNo" class="SetLabel">1</span>
 
<span id="MainContent_set1_Reps" class="SetLabel">3</span>
控件上的每个标签都有一个公共属性来设置其值:
public partial class Set : System.Web.UI.UserControl
{
public string _exercise { get { return Exercise.Text; } set { Exercise.Text = value; } }
public string _bodyArea { get { return BodyArea.Text; } set { BodyArea.Text = value; } }
public string _setNumber { get { return SetNo.Text; } set { SetNo.Text = value; } }
public string _reps { get { return Reps.Text; } set { Reps.Text = value; } }
protected void Page_Load(object sender, EventArgs e)
{
}
}
按照页面呈现的内容,我可以执行以下操作(不起作用!)
else
{
if(ViewState["Sets"] != null)
{
int sets = (int)ViewState["Sets"];
for (int i = 0; i < sets; i++)
{
Set set = new Set();
Label templbl = (Label)Page.FindControl(string.Format("MainContent_set{0}_BodyArea", i + 1));
set._bodyArea = templbl.Text;
//Other code to get rest of control values
WeightList.Controls.Add(set);
}
}
}
但这也不起作用。 我想我这里缺少明显的东西吗?
在页面加载中尝试以下操作:
if(ViewState["Sets"] != null)
{
int sets = (int)ViewState["Sets"];
for (int i = 0; i < sets; i++)
{
Set set = new Set();
set.ID = string.Format("set{0}", i);
WeightList.Controls.Add(set);
}
}
只要您在页面上具有带有正确ID的控件,就会从viewstate中为您加载这些值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.