Вложенный повторитель при нажатии кнопки не работает

У меня есть страница управления пользователем, т.е. шаблон (.ascx), где у меня есть повторитель, который загружается при выполнении хранимой процедуры. Существует также родительская страница, которая имеет свой собственный повторитель и кнопку в каждой строке, и этот повторитель также загружается с выполнением хранимой процедуры.

Теперь кнопка в каждой строке родительского повторителя, когда по ней щелкают первые два значения столбца этих конкретных строк (например, G6300 и Group Term Ife Insurance), должна быть передана в хранимую процедуру, присутствующую в шаблоне, где дочерний повторитель существует и дочерний ретранслятор должен быть виден.

До сих пор я успешно отображал родительский повторитель, передавал значения этой конкретной строки при нажатии кнопки дочерней хранимой процедуре, а также успешно получал результаты в списке, выполняя дочернюю хранимую процедуру. Но когда я пытаюсь присвоить этот список дочернему повторителю, присутствующему на странице шаблона, это дает исключение для дочернего повторителя (System.NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта).

Я предполагаю, что мне не хватает инициализации дочернего повторителя, и, следовательно, он нулевой. Но не совсем положительно об этом, а также о решении.

Пожалуйста, предлагает что-то.

// код шаблона (внутренний повторитель)

        protected void Page_Load(object sender, EventArgs e)
    {

        if (Page.IsPostBack)
        {
            return;
        }

    }

    public void LoadRepeater(string id, string policyNo, string desc) //gets called from parent repeater
    {
        //Loading the tempalte
        StringBuilder template1 = MembershipRepository.LoadPolicyDetailsTemplate("PolicyDetailsTemplate1.ascx");

        CustomerPortalWebContentEntities context = new CustomerPortalWebContentEntities();
        RetrievePolicyDetails policyDetails = new RetrievePolicyDetails();
        List<PolicyDetails> polDetails = policyDetails.GetPolicyDetails(id, policyNo, desc); //polDetails HAS ALL THE REQUIRED ROWS


        rptPolicyDetails.DataSource = polDetails; //EXCEPTION ON THIS LINE
        rptPolicyDetails.DataBind();




    }

// Событие нажатия кнопки для каждой строки на родительской странице (родительский повторитель), где вызывается шаблон / дочерний повторитель

protected void rptCoverage_ItemCommand(object source, RepeaterCommandEventArgs e)
    {
        if (e.CommandName == "CoverageDetails")
        {
            //Button was clicked
            var policy = e.Item.FindControl("lblPolicyNo") as Label;
            var description = e.Item.FindControl("lblDescription") as Label;
            var idPerson = id_person;

            var placeHolder = e.Item.FindControl("UCPlaceHolder") as Control;

            placeHolder.Controls.Add((PolicyDetailsTemplate1)Page.LoadControl("~/Shared/Controls/PolicyDetailsTemplate1.ascx")); 

            //this.placeHolder.Controls.Add((PolicyDetailsTemplate1)Page.LoadControl("~/Shared/Controls/PolicyDetailsTemplate1.ascx")); 

            //calling the specific tempalte with specific sp                                        /**/  will change w.r.t multiple templates
            PolicyDetailsTemplate1 template = new PolicyDetailsTemplate1();
            template.LoadRepeater(idPerson, policy.Text.Trim(), description.Text.Trim());



        }
    }

// Вот фрагмент вывода

1 ответ

Вы связываете данные с другим экземпляром PolicyDetailsTemplate1, чем тот, который вы добавляете в PlaceHolder.

Здесь вы добавляете один PolicyDetailsTemplate1 в PlaceHolder:

placeHolder.Controls.Add((PolicyDetailsTemplate1)Page.LoadControl("~/Shared/Controls/PolicyDetailsTemplate1.ascx")); 

Но затем вы создаете совершенно новый экземпляр:

//calling the specific tempalte with specific sp
PolicyDetailsTemplate1 template = new PolicyDetailsTemplate1();
template.LoadRepeater(idPerson, policy.Text.Trim(), description.Text.Trim());

Вместо этого вы можете попробовать просто создать один PolicyDetailsTemplate1, связать его Repeater, а затем добавить его в PlaceHolder:

PolicyDetailsTemplate1 template = (PolicyDetailsTemplate1)Page.LoadControl("~/Shared/Controls/PolicyDetailsTemplate1.ascx);
template.LoadRepeater(idPerson, policy.Text.Trim(), description.Text.Trim());
placeHolder.Controls.Add(template);
Другие вопросы по тегам