用户控制Page_Load事件不读取从主页传递的变量

时间:2011-11-02 12:41:53

标签: asp.net user-controls scope

我在将包含用户控件的主页中的变量传递给用户控件本身时遇到问题。虽然传递的变量通常在用户控件的代码隐藏中可用,但是page_load事件似乎无法读取它。

我的代码 -

在主页面代码隐藏:

protected void FindCCFsButton_Click(object sender, EventArgs e)
    {
        if (CustomerDropDown.SelectedIndex != 0)
        { SearchUcCCFList.SetCustID(CustomerDropDown.SelectedValue); }
    }

(SearchUcCCFList是主aspx页面中用户控件的实例)。 在后面的用户控制代码中:

public partial class ucCCFList : System.Web.UI.UserControl
{
    public string srchCust { get; set; }

    public void SetCustID(string custID)
    {
        srchCust = custID;
        testCustLabel.Text = GetCustID(); //this works
    }

    public string GetCustID()
    {
        return srchCust;
    }

protected void Page_Load(object sender, EventArgs e)
    {
        CCFGridView.DataSource = DAL.SearchCCFs(custID : GetCustID());  //doesn't work
        CCFGridView.DataBind();
        test2CustLabel.Text = GetCustID();  //doesn't work
    }

在Page_Load事件中,GetCustId()不返回任何内容(因此不会过滤记录并返回所有记录),尽管可以在Page_Load之外的方法中读取。

我可能会犯一个初学者错误,但任何帮助都会受到赞赏。

编辑 - 按照Alan在评论中的建议,我逐步完成了页面加载序列&看起来用户控件的Page_Load事件正在运行之前,主页面按钮中的代码单击,因此该变量尚不可用。单击按钮后的顺序是:

  1. 用户控制Page_Load运行
  2. 主页上按钮事件中的代码
  3. 用户控件运行的其他代码(在Page_Load之外)因此可以使用变量。
  4. 这看起来有点奇怪,是否有另一种方法将变量传递给用户控件Page_Load?

1 个答案:

答案 0 :(得分:1)

在这种情况下,甚至在主页面上的点击处理也会在用户控制页面加载调用后调用。您的变量正在设置,但直到在用户控件中数据绑定之后才会设置。

将用户控件切换为声明性绑定,它将以正确的顺序处理调用方法。或者,更简单的解决方法是在主页单击处理调用之后将用户控件数据绑定从Page_Load更改为Page_PreRender,这将在生命周期的后期调用。

protected void Page_PreRender(object sender, EventArgs e)
{
    CCFGridView.DataSource = DAL.SearchCCFs(custID : GetCustID());  // will work now
    CCFGridView.DataBind();
    test2CustLabel.Text = GetCustID();  // will work now
}

要获得更全面的答案,请阅读ASP.NET页面生命周期,包括与用户控件生命周期的交互。