asp.net我的列表正在回发中消失-can';我找不到我想要的东西;我失踪了?

asp.net我的列表正在回发中消失-can';我找不到我想要的东西;我失踪了?,asp.net,user-controls,postback,Asp.net,User Controls,Postback,这可能很简单,但我想不出来。啊 带有自定义用户控件的C#asp.net应用程序。我的自定义控件是包装在链接中的图像的简单列表,用作父页面的导航工具 当我点击链接时,它会进行回发:我的点击事件似乎不会触发,当页面重新加载时,图像列表消失 我在父页面和自定义控件中都有EnableViewState=“true”。我的理解是,这足以保留我的选项列表?如果每次重新加载列表并重新绑定事件处理程序,我会认为事件会丢失,对吗 下面是我将控件添加到面板中的(缩写代码) public void LoadM

这可能很简单,但我想不出来。啊

带有自定义用户控件的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的理解是,它将保留我动态加载的元素,但事实并非如此。

您在页面生命周期中构建控件太晚了。ViewState在初始化之后和加载之前加载。有关生命周期的页面,请参阅

这意味着您的自定义控件无法保持任何状态,因为在发生加载状态时,这些控件尚不存在。将控件构造移动到PreInit,它应该可以工作

控制事件在加载后但在onload完成之前触发。该事件实际上在请求中传递,并根据ID与控件匹配。如果在触发控件事件时可以找到该控件,则事件将触发。因此,事件通常不依赖于ViewState,更改事件除外。之所以更改事件,是因为ASP.NET需要能够将ViewState中保留的原始值与当前请求值进行比较,以便知道是否触发事件


要确保再次触发任何更改事件,您需要确保自定义控件中的控件是在PreInit上创建的。

您在页面生命周期中构建控件太晚了。ViewState在初始化之后和加载之前加载。有关生命周期的页面,请参阅

这意味着您的自定义控件无法保持任何状态,因为在发生加载状态时,这些控件尚不存在。将控件构造移动到PreInit,它应该可以工作

控制事件在加载后但在onload完成之前触发。该事件实际上在请求中传递,并根据ID与控件匹配。如果在触发控件事件时可以找到该控件,则事件将触发。因此,事件通常不依赖于ViewState,更改事件除外。之所以更改事件,是因为ASP.NET需要能够将ViewState中保留的原始值与当前请求值进行比较,以便知道是否触发事件


要确保再次触发任何更改事件,您需要确保自定义控件中的控件是在PreInit上创建的。

解决方案很简单:将changeControl放在Page\u Load方法中

protected void Page_Load(object sender, EventArgs e)
    {
        changeControl((UserControl)LoadControl("~/user-control.ascx"));
    }

解决方案很简单:将changeControl放在Page_Load方法中

protected void Page_Load(object sender, EventArgs e)
    {
        changeControl((UserControl)LoadControl("~/user-control.ascx"));
    }

请张贴您的密码。。。这真的能帮我们诊断。完成。实际上,我只是在条件之外使用LoadMediaOptions()方法,我的代码按预期工作,媒体选项加载正确,但更重要的是事件处理程序也正确,我完全不理解。如果清除媒体选项,然后每次都必须手动加载,包括重新绑定事件处理程序,那么服务器如何确定如何调用事件?请发布您的代码。。。这真的能帮我们诊断。完成。实际上,我只是在条件之外使用LoadMediaOptions()方法,我的代码按预期工作,媒体选项加载正确,但更重要的是事件处理程序也正确,我完全不理解。如果清除了媒体选项,然后每次都必须手动加载,包括重新绑定事件处理程序,那么服务器如何确定如何调用事件?这很有意义,并解释了我看到的奇怪行为。我将审阅你发送的文章-谢谢!在我的主页上,在PreInit事件处理程序中,尚未创建自定义用户控件来执行任何处理。它只存在于Init事件处理程序中。这个问题似乎扩展到了我想要持久化的私有变量。在回发期间,它们都重置为null或默认值。但仅适用于自定义控件。我在页面上还有其他正常的控件,可以正常工作。看起来我回答了我自己的问题。我没有意识到我们需要手动向ViewState添加/删除值。不知何故,我认为ASP.Net代码神奇地保留了所需的值。因此,这不是时间问题,而是我从未在ViewState中存储任何东西,以便在回发过程中保存。谜团解开了。感谢您为我指出页面生命周期的方向。。。它让我了解了ViewState及其实际工作原理。当我谈论事件时,我指的是自定义控件(而不是页面)中的事件。在Init上向自定义控件添加控件是可以的,我不记得控件是否有PreInit(怀疑没有)。ASP.NET控件具有用于ViewState的codemagic,但如果要在自定义控件中保留属性,则需要自己添加到ViewState中。很高兴你成功了。这很有道理,也解释了我看到的奇怪行为。我将审阅你发送的文章-谢谢!在我的主页上,在PreInit事件处理程序中,尚未创建自定义用户控件来执行任何处理。它只存在于Init事件处理程序中。这个问题似乎扩展到了我想要持久化的私有变量。他们都是