我有一个用户控制页面,即模板(.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());
}
}
//这是输出的片段
答案 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);