【问题标题】:C# Why does OnItemDataBound fire before Page_Load?C# 为什么 OnItemDataBound 在 Page_Load 之前触发?
【发布时间】:2018-11-14 06:25:06
【问题描述】:

我有一个关于 C# 中继器的问题。我有默认宽度设置,它会根据 Page_Load 中的某些条件而改变,我希望将更改传递给 OnItemDataBound 上的图像。但是,似乎 OnItemDataBound 在 Page_Load 之前触发了,因为我在 Page_Load 中将宽度更改为 700,但是当加载图像时,它总是显示 380。如果 OnItemDataBound 不是要使用的正确函数,我应该调用哪个函数以便在调用 Page_Load(设置自定义宽度的位置)后更改图像宽度?我尝试了 OnPreLoad、OnLoad,但都没有奏效。

 protected int width = 380;

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        width = 700;
    }
}

protected void Test_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    RepeaterItem item = e.Item;
    if ((item.ItemType == ListItemType.Item) || (item.ItemType == ListItemType.AlternatingItem))
    {
        Image Image = (Image)e.Item.FindControl("Image");

        Image.ImageUrl = Utilities.generateImage();
        Image.Width = width;
    }
}

【问题讨论】:

    标签: c# asp.net repeater asprepeater


    【解决方案1】:

    您可以为此使用 Page_Init。它在 ItemDataBound 之前触发:

      protected void Page_Init(object sender, EventArgs e)
      {         
         if (!Page.IsPostBack)
         {
            // load
         }
      }
    

    另请参阅: https://docs.microsoft.com/en-us/previous-versions/aspnet/ms178472(v=vs.100)

    【讨论】:

      【解决方案2】:

      如果您在标记中声明数据源,它可以更早地呈现所有内容,因为您没有进行手动数据绑定。这可能发生在 Page_Load 之前。

      尝试重载较早的事件,例如 OnLoad 或 OnPreLoad。这两个都发生在 Page_Load 之前。

      如果您正在显式执行数据绑定并在 Page_Load 之前发生的另一个事件中执行此操作,那么如果您想要更改某些内容,则必须确保转发器已反弹。一旦你调用数据绑定,它就会绑定。如果您需要更改某些内容,请先执行或重新绑定。

      【讨论】:

      • 我尝试了 OnLoad 和 OnPreLoad,但它们仍然没有获得我的新宽度。
      【解决方案3】:

      数据绑定在PrerenderComplete 事件上完成,该事件在PageLoad 之前的页面生命周期中触发。如需更多信息,请查看https://msdn.microsoft.com/en-us/library/ms178472.aspx#lifecycle_events 以查看生命周期事件及其顺序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-01
        • 2014-06-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多