Controls.Add(officeResults);
В порядке. Вам просто нужно убедиться, что это WebControl (т.е. он наследуется от WebControl). На самом деле «Control» - это то, что ожидается, но лично, если я пишу «веб-элемент управления», я буду использовать / наследовать от WebControl.
Я обнаружил, что полезно добавить его "дважды":
Controls.Add(officeResults); // adds the control to the page (or parent controls) object collection.
myPanel.Controls.Add(officeResults); // adds the control to where you want it to appear.
Один раз на родительский элемент управления / страницу (в структурном смысле исполняемого файла), а затем один раз на контейнер, в котором я хочу, чтобы он появился (в визуальном / физическом иерархическом смысле). Я заметил, что постбэки, как правило, работали, как и ожидалось, когда я делал это, но это могло быть потому, что я делал что-то еще неправильно в то время. Я уверен, что другие поправят меня, если я сделаю это.
Я бы также посоветовал использовать интерфейс INamingContainer (вам не нужно добавлять код, он все делает сам во время выполнения).
Не уверен, что использовал бы фабрику - я не говорю, что это неправильно, но обычно, если я добавляю элемент управления на страницу (даже динамически), я буду знать, какой из них мне нужен. TextBoxes, Buttons и Tables - это WebControls, и вы бы не создавали и не добавляли их через Factory (по крайней мере, я этого не видел и не чувствовал себя обязанным это делать). Если бы вы использовали фабрику, разве у вас не было бы одного фабричного метода, который определял, какой WebControl возвращать, основываясь на явном параметре, или, возможно, на основе переданных данных?
Просто мысль, надеюсь, это поможет.
Кстати, я немного поработал над WebControl - я не говорю, что я мировой эксперт, но вы можете найти некоторые полезные идеи здесь : (смотрите в «Morphfolia.Core» sln; в проекте Morphfolia.PublishingSystem, папке WebControls и проекте Morphfolia.WebControls).