Потребителско контролно събитие 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