Я понял это. Вот мое решение:
Я изменил GetPostBackControl, чтобы искать не только кнопку ссылки, которая вставляет пользовательский элемент управления, но и элементы управления, содержащие идентификатор дочерних элементов управления для вставленного пользовательского элемента управления (чтобы захватить OnSelectedIndexChanged, который запускается изнутри моего пользовательского элемента управления) .
protected Control GetPostBackControl(System.Web.UI.Page page)
{
Control control = null;
string ctrlname = Page.Request.Params["__EVENTTARGET"];
if (ctrlname != null && ctrlname != String.Empty)
{
//if it contains options then it's a control inside my usercontrol
if (ctrlname.Split('$')[2].Contains("options"))
{
var c = new Control();
c.ID = ctrlname;
return c;
}
else
{
control = FindControlRecursive(page, ctrlname.Split('$')[2]);
}
}
else
{
string ctrlStr = String.Empty;
Control c = null;
foreach (string ctl in Page.Request.Form)
{
if (ctl.EndsWith(".x") || ctl.EndsWith(".y"))
{
ctrlStr = ctl.Substring(0, ctl.Length - 2);
c = page.FindControl(ctrlStr);
}
else
{
c = page.FindControl(ctl);
}
if (c is System.Web.UI.WebControls.CheckBox ||
c is System.Web.UI.WebControls.CheckBoxList)
{
control = c;
break;
}
}
}
return control;
}
Затем я изменяю событие OnPreInit для поиска элементов управления с идентификатором кнопки ссылки или идентификатором, который содержит «опции»:
protected override void OnPreInit(EventArgs e)
{
base.OnPreInit(e);
System.Web.UI.MasterPage m = Master;
Control control = GetPostBackControl(this);
if (control != null)
{
if ((control.ClientID == (lbAddAndCondtion.ClientID) || createAgain) || control.ID.Contains("options"))
{
createAgain = true;
CreateUserControl(control.ID);
}
}
}
Критическое исправление было в методе CreateUserControl. В моем исходном коде я пытался напрямую загрузить пользовательский элемент управления из моего общего списка, который был сохранен в Session. Я изменил это, чтобы фактически создать новый экземпляр пользовательского элемента управления, назначить этому новому экземпляру идентификатор, совпадающий с тем, который хранится в Session, а затем добавить его в заполнитель:
protected void CreateUserControl(string controlID)
{
try
{
if (createAgain && phConditions != null)
{
if (OptionControls.Count > 0)
{
phConditions.Controls.Clear();
foreach (var c in OptionControls)
{
FilterOptionsCollectionView foc = new FilterOptionsCollectionView();
foc = Page.LoadControl("~/Views/FilterOptionsCollectionView.ascx") as FilterOptionsCollectionView;
foc.ID = c.ID;
phConditions.Controls.Add(foc);
}
}
}
}
catch (Exception ex)
{
throw ex;
}
}
Единственное, что я изменил в пользовательском элементе управления, это переместил метод, который загружает мои выпадающие списки, и связал событие OnSelectedIndexChanged с событием OnInit. Теперь я могу динамически загружать столько экземпляров пользовательского элемента управления, сколько мне нужно, и все события внутри пользовательского элемента управления корректно запускаются, и состояние сохраняется во всех обратных передачах !!
Надеюсь, это поможет кому-то еще !!