我正在尝试创建某种论坛,并且每次单击按钮时都想添加一个新div(其中包含一些文本)。 (当我从数据库中获取所有内容时,这将在以后更改)所以这个想法是;单击按钮,出现div,再次单击该按钮,出现另一个div,位于最后一个div下方,无限重复。 我创造了1个div,但它不会再做了。这是我的代码:
protected void Button1_Click(object sender, EventArgs e)
{
i += 1;
top += 60;
try
{
Panel div = new Panel();
div.ID = "panel" + i;
div.CssClass = "postdiv";
div.Style["position"] = "absolute";
div.Style["top"] = top.ToString();
form1.Controls.Add(div);
}
catch (Exception er)
{
Console.Write(er);
}
}
我认为我的问题在于div.Style [“top”] = top.ToString();但我不确定。有人知道解决方案吗?
答案 0 :(得分:2)
问题是每次单击按钮时i
和top
值始终为0,因此您需要使用ViewState或HiddenFields来保持回发之间的值。
每次发生回发时,您还需要在Page_Load中重新创建动态创建的div。
以下是我使用ViewState所做的事情:
private int Counter
{
get
{
if (ViewState["Counter"] == null)
{
return 0;
}
else
{
return (int)ViewState["Counter"];
}
}
set
{
ViewState["Counter"] = value;
}
}
protected void Page_Load(object sender, EventArgs e)
{
if (this.IsPostBack)
{
if (this.Counter > 0)
{
for (int i = 0; i < this.Counter; i++)
{
Panel div = new Panel();
div.ID = string.Format("panel{0}", i + 1);
div.CssClass = "postdiv";
div.Style["position"] = "absolute";
div.Style["top"] = string.Format("{0}px", (60 * (i + 1)));
form1.Controls.Add(div);
}
}
}
}
protected void Button1_Click(object sender, EventArgs e)
{
this.Counter += 1;
try
{
Panel div = new Panel();
div.ID = string.Format("panel{0}", this.Counter);
div.CssClass = "postdiv";
div.Style["position"] = "absolute";
div.Style["top"] = string.Format("{0}px", (60 * this.Counter));
form1.Controls.Add(div);
}
catch (Exception er)
{
Console.Write(er);
}
}
答案 1 :(得分:2)
分配顶级样式时请添加“px”:
div.Style["top"] = top.ToString() + "px";
答案 2 :(得分:1)
您需要考虑到每次浏览器往返服务器(无论是第一次还是后续时间 - 回发)时,都需要从头开始重新创建页面的对象模型。
您在后面的代码中创建的变量,控件或对象都不会在回发中存在。
因此,您需要添加执行后面代码的控件每个时间。这就是为什么你需要一种像@ekad所提供的方法的原因。您的控件生成例程需要在循环内。