Событие User Control Page_Load не читает переменную, переданную с главной страницы

У меня проблема с передачей переменной с главной страницы, содержащей пользовательский элемент управления, в сам пользовательский элемент управления. Хотя переданная переменная обычно доступна в коде программной части пользовательского элемента управления, событие 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.

Я, вероятно, делаю ошибку новичка, но любая помощь будет принята с благодарностью.

Изменить - следуя предложению Алана в комментариях, я прошел через последовательность загрузки страницы, и оказалось, что событие Page_Load пользовательского элемента управления запускается ДО нажатия кнопки на главной странице, поэтому переменная еще не доступна. Последовательность после нажатия кнопки следующая:

  1. Пользовательский элемент управления Page_Load запускается
  2. Код в событии кнопки на главной странице
  3. Другой код (за пределами Page_Load) в пользовательском элементе управления запускается, поэтому переменная доступна здесь.

Это кажется немного странным, есть ли другой способ передать переменную в пользовательские элементы управления Page_Load?


person Howard Shaw    schedule 02.11.2011    source источник
comment
Откуда вы звоните SearchUcCCFList.SetCustID? Он должен быть до или в Page_Load страницы   -  person Tim B James    schedule 02.11.2011
comment
Я не думаю, что метод GetCustID помогает ... вы можете получить значение свойства из свойства? Похоже, проблема с порядком жизненного цикла событий страницы. Некоторые точки останова помогут вам увидеть, что происходит.   -  person Alan Stephens    schedule 02.11.2011
comment
Тим - SearchUcCCFList.SetCustID находится в событии нажатия кнопки на главной странице (т.е. той, которая включает в себя пользовательский элемент управления (id = SearchUcCCFList)). Я добавил это в свой пост.   -  person Howard Shaw    schedule 02.11.2011
comment
Алан - первая тестовая метка просто показывает, что значение SetCustID получено с главной страницы, хотя оно не может быть прочитано в событии Page_Load. Я последовал вашему предложению относительно точек останова и добавил результаты в исходный пост.   -  person Howard Shaw    schedule 02.11.2011


Ответы (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, включая взаимодействие с жизненным циклом пользовательских элементов управления.

person Jon Adams    schedule 02.11.2011
comment
Муфаса - это связано с тем, что я добавил при редактировании, и действительно работает - большое спасибо. - person Howard Shaw; 02.11.2011