Вложенный повторитель при нажатии кнопки не работает
У меня есть страница управления пользователем, т.е. шаблон (.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);