Если вы хотите играть с пользовательскими элементами управления ASP.NET, вы должны играть по его правилу и привередливы!Когда вы начинаете играть с OnPreRender в пользовательском элементе управления, вы знаете, что находитесь на неправильной дорожке 90% времени.
Как правило, лучший способ использовать ViewState - объявить свойство, для которого создана резервная копия.этим, как и стандартные элементы управления ASP.NET (.NET Reflector был моим учителем в течение многих лет!).Таким образом, он будет прочитан и сохранен естественным образом в течение жизненного цикла события.
Вот код, который, кажется, выполняет то, что вы хотите, вполне естественно, без всяких уловок:
public class AddManyControl : CompositeControl
{
private void AddControl(int index)
{
var div = new HtmlGenericControl("div");
var textBox = new TextBox();
textBox.ID = "tb" + index;
div.Controls.Add(textBox);
Controls.AddAt(index, div);
}
protected override void CreateChildControls()
{
for (int i = 0; i < ControlsCount; i++)
{
AddControl(i);
}
var btnAdd = new Button();
btnAdd.ID = "Add";
btnAdd.Text = "Add text box";
btnAdd.Click += new EventHandler(btnAdd_Click);
Controls.Add(btnAdd);
var btnPostBack = new Button();
btnPostBack.ID = "PostBack";
btnPostBack.Text = "Do PostBack";
Controls.Add(btnPostBack);
}
private int ControlsCount
{
get
{
object o = ViewState["ControlCount"];
if (o != null)
return (int)o;
return 0;
}
set
{
ViewState["ControlCount"] = value;
}
}
void btnAdd_Click(object sender, EventArgs e)
{
int count = ControlsCount;
AddControl(count);
ControlsCount = count + 1;
}
}