这可能很简单,但我无法理解。啊...
带有自定义用户控件的C#asp.net应用程序。我的自定义控件是一个包含在链接中的简单图像列表,用作父页面的导航工具。当我点击链接时,它会进行回发:我的点击事件似乎没有触发,当页面重新加载时,图像列表就会消失。
我在父页面和自定义控件中都有EnableViewState="true"
。我的理解是,这足以保留我的选项列表?如果我每次重新加载列表并重新绑定我的事件处理程序,我会认为事件会丢失,对吗?
这是(缩写代码),我将控件添加到我的面板。
public void LoadMediaOptions() {
loop through a datareader {
LinkButton b = new LinkButton();
b.Click += new EventHandler(navOption_Click);
b.Attributes.Add("mediaID", mediaID.ToString());
HtmlImage i = new HtmlImage();
i.Src = strThumbLink;
i.Width = 120;
i.Height = 90;
b.Controls.Add(i);
_loadedMediaHtml.Add(b);
panMediaOptions.Controls.Add(b);
}
}
此方法目前仅在Page_Load方法的父页面中调用一次:
protected void Page_Load(object sender, EventArgs e)
{
try
{
if (!Page.IsPostBack)
uxMediaNav.LoadMediaOptions();
}
catch (Exception ex)
{
throw ex;
}
}
页面回发后,没有为我加载媒体选项。我对EnableViewState的理解是它会保留我动态加载的元素,但事实并非如此。
答案 0 :(得分:1)
您在页面生命周期中过晚构建控件。在init之后和Load之前加载ViewState。有关页面生命周期,请参阅here。
这意味着您的自定义控件无法保持任何状态,因为在发生加载状态时控件尚不存在。将您的控件结构移动到PreInit,它应该工作。
控制事件在加载后但在onLoadComplete之前触发。事件实际上在请求中传递,并与基于ID的控件匹配。如果可以通过触发时间控制事件找到控件,则事件将触发。因此,事件通常不依赖于ViewState,但更改事件除外。更改事件的确如此,因为ASP.NET需要能够将ViewState中持久保存的原始值与当前请求值进行比较,以了解是否触发事件。
要确保任何更改事件再次触发,您需要确保自定义控件中的控件是在PreInit上创建的。
答案 1 :(得分:0)
解决方案很简单:将changeControl放在Page_Load方法中。
protected void Page_Load(object sender, EventArgs e)
{
changeControl((UserControl)LoadControl("~/user-control.ascx"));
}