1

我有一个用户控制页面,即模板(.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());



        }
    }

//这里是输出的片段 在此处输入图像描述

4

1 回答 1

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);
于 2014-07-14T21:28:22.630 回答