我有一个列表框控件。当用户单击它时,它会告诉自定义控件使用某个ID。
自定义控件每次(动态)绘制相同的内容,只是根据此ID加载不同的内容(它从数据库加载到动态形式,如控件)。
好的,现在我遇到了viewstate溢出问题。当您单击列表框以加载说出ID#1时,它们看起来都很好。然后,单击ID#2,在自定义控件中创建的所有文本框控件都与ID#1中的相同。因此,当列表框索引发生更改时,我需要清除视图状态,但我无法使其工作。
所有控件也在Page_Load中创建。
我在Page_Load尝试了ViewState.Clear(),但没有做任何事情。
我的自定义控件来自INamingInterface,但我猜这些ID仍然匹配于viewstate。
我尝试将自定义控件ID更改为唯一的(例如“CONROL _”+ id.ToString())我也尝试使用包含自定义控件的面板执行相同的操作。
我似乎无法摆脱这种观点状态!
EDIT 好的,这是演示问题的代码
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”(最好不要完全禁用viewstate)
答案 0 :(得分:1)
如果我设置了Text控件的ID,那么它不会保留旧值。您是否为所有控件提供了唯一的ID?
void Create(string text)
{
TextBox t = new TextBox();
t.ID = text;
t.Text = text;
pnl.Controls.Add(t);
}
答案 1 :(得分:0)
你不能这样做。
要使viewstate正常工作,必须在加载所有控件之前创建所有控件并使用相同的id。因此,您必须将控件定义存储在会话中,然后使用相同的ID重新创建ASP.NET,从视图状态加载其属性。 Page_load为时已晚,请在PreLoad中进行。
但是在设计时创建所有控件并将可见设置设置为false更容易,并替换它们的可见性,以便viewstate正常工作。
答案 2 :(得分:0)
实际上这不再相关。我们通过为动态创建的控件禁用viewstate来修复它。这在所有情况下都不起作用,但在我们的例子中,用户可以按下两个按钮(与动态控件有关)或用于切换表单的列表框。这两个按钮都将控件的状态保存到数据库中,因此实际上并不需要viewstate。(在考虑viewstate以及它如何与控件交互时,我总是感到困惑。)
基本建议:如果您在控制视图状态时遇到问题,请确保确实需要它。