按钮上的嵌套转发器单击不起作用

时间:2014-07-14 21:18:36

标签: asp.net stored-procedures ascx nested-repeater

我有一个用户控制页面,即模板(.ascx),其中我有一个通过执行存储过程加载的转发器。还有一个父页面,它有自己的转发器以及每行上的一个按钮,这个转发器也会加载执行存储过程。

现在,父转发器的每一行上的按钮,当被点击时,该特定行的前两个列值(例如:G6300和Group Term Ife Insurance)需要传递给模板中存在的存储过程儿童中继器存在,应该可以看到儿童中继器。

直到现在,我成功地显示了父转发器,将按钮上的特定行值传递给子存储过程,并且还通过执行子存储过程成功地将结果放入列表中。但是当我尝试将此列表分配给模板页面上的子转发器时,它为子转发器提供了一个例外(System.NullReferenceException:对象引用未设置为对象的实例)。

我猜我错过了初始化子转发器,因此它是null。但对此并不是完全正面的,也是解决方案。

请提出建议。

//模板代码(内部中继器)

        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());



        }
    }

//这是输出的片段 enter image description here

1 个答案:

答案 0 :(得分:0)

您将数据绑定到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);