我有一个列表框控件。当用户单击它时,它会告诉自定义控件使用某个 ID 来使用。
自定义控件每次都(动态地)绘制相同的内容,只是根据此 ID 加载不同的内容(它从数据库加载到类似控件的动态表单中)。
好的,现在我遇到了视图状态溢出的问题。当您单击列表框以加载 ID #1 时,一切看起来都很好。然后,单击 ID #2,在自定义控件中创建的所有文本框控件都具有与 ID #1 相同的内容。因此,当列表框索引更改时,我需要清除视图状态,但我无法让它工作。
所有控件也是在 Page_Load 中创建的。
我在 Page_Load 尝试了 ViewState.Clear() ,但没有做任何事情。
我有从 INamingInterface 派生的自定义控件,但我猜 ID 仍然与视图状态匹配。
我尝试将自定义控件 ID 更改为唯一的(例如“CONROL_”+id.ToString()) 我还尝试对包含自定义控件的面板执行相同的操作。
我似乎无法摆脱这种视图状态!
编辑好的,这里是演示问题的代码
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (ddl.SelectedValue == "1")
{
Create("ID #1");
}
else if (ddl.SelectedValue == "2")
{
Create("ID #2");
}
}
void Create(string text)
{
TextBox t = new TextBox();
t.Text = text;
pnl.Controls.Add(t);
}
}
标记:
<div>
<asp:Panel ID="pnl" runat="server">
<asp:DropDownList ID="ddl" runat="server" AutoPostBack="True">
<asp:ListItem Text="id 1" Value="1">
</asp:ListItem>
<asp:ListItem Text="id 2" Value="2"></asp:ListItem>
</asp:DropDownList>
</asp:Panel>
</div>
如果您运行此代码,您会注意到,如果您更改文本框中的内容,然后更改下拉列表,那么您之前输入的内容将保留在那里,而不是被覆盖。
我的基本目标是获得它,以便当您更改为 ID #2 时,无论如何它都会将“ID #2”放在文本框中(最好不完全禁用视图状态)