动态控制的问题
大家好,
我想创建一些动态控件,并让它们在页面加载时保持其视图状态。很容易,对吧?我所要做的就是在每次页面加载时使用相同的 ID 重新创建控件。但是,这是一个问题 - 在我的 PreRender 事件中,我想清除控件集合,然后使用新值重新创建动态控件。造成这种情况的原因很复杂,我可能要花一页左右的时间来解释我为什么要这样做。所以,为了简洁起见,让我们假设我绝对必须这样做,并且没有其他方法。
在我在 PreRender 事件中重新创建控件后,问题就出现了。重新创建的控件永远不会绑定到视图状态,并且它们的值不会在页面加载时保持不变。我不明白为什么会这样。我已经在我的 OnLoad 事件中重新创建了控件。当我这样做时,只要我每次都使用相同的 ID,新创建的控件就可以很好地绑定到 ViewState。但是,当我尝试在 PreRender 事件中做同样的事情时,它失败了。
无论如何,这是我的示例代码:
命名空间 TestFramework.WebControls {
public class ValueLinkButton : LinkButton
{
public string Value
{
get
{
return (string)ViewState[ID + "vlbValue"];
}
set
{
ViewState[ID + "vlbValue"] = value;
}
}
}
public class TestControl : WebControl
{
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
Controls.Clear();
ValueLinkButton tempLink = null;
tempLink = new ValueLinkButton();
tempLink.ID = "valueLinkButton";
tempLink.Click += new EventHandler(Value_Click);
if (!Page.IsPostBack)
{
tempLink.Value = "old value";
}
Controls.Add(tempLink);
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
ValueLinkButton tempLink = ((ValueLinkButton)FindControl("valueLinkButton")); //[CASE 1]
//ValueLinkButton tempLink = new ValueLinkButton(); [CASE 2]
tempLink.ID = "valueLinkButton";
tempLink.Value = "new value";
tempLink.Text = "Click";
Controls.Clear();
Controls.Add(tempLink);
}
void Value_Click(object sender, EventArgs e)
{
Page.Response.Write("[" + ((ValueLinkButton)sender).Value + "]");
}
}
}
因此,让我们检查案例 1,其中 [CASE 1] 旁边的行没有被注释掉,但 [CASE 2] 旁边的行被注释掉了。在这里,一切正常。当我将此控件放在页面上并加载页面时,我看到一个显示“单击”的链接。当我点击链接时,页面输出文本“[new value]”,在下一行,我们看到熟悉的“Click”链接。每次我点击“点击”链接时,我们都会看到同样的事情。到现在为止还挺好。
但是现在让我们检查案例 2,其中 [CASE 1] 旁边的行被注释掉了,但 [CASE 2] 旁边的行没有被注释掉。在这里,我们遇到了问题。当我们加载页面时,我们会看到“点击”链接。但是,当我单击链接时,页面会输出文本“[]”而不是“[新值]”。点击事件正常触发。但是,我分配给控件的 Value 属性的“新值”文本不会保留。再一次,这对我来说有点神秘。为什么,当我在 OnLoad 中重新创建控件时,一切都很好,但当我在 PreRender 中重新创建控件时,值不会被持久化?
我觉得必须有一种方法可以做到这一点。当我在 PreRender 中重新创建控件时,有没有办法将新创建的控件绑定到 ViewState?
我已经为此苦苦挣扎了好几天。您能给我的任何帮助将不胜感激。
谢谢。