1

我有一个列表框控件。当用户单击它时,它会告诉自定义控件使用某个 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”放在文本框中(最好不完全禁用视图状态)

4

3 回答 3

1

如果我设置 Text 控件的 ID,则它不会保留旧值。你给所有控件一个唯一的ID吗?

void Create(string text)
{ 
    TextBox t = new TextBox();
    t.ID = text;
    t.Text = text;
    pnl.Controls.Add(t);
}
于 2009-10-29T20:54:02.713 回答
0

你不能那样做。

为了使视图状态正常工作,必须在加载之前创建所有控件并使用相同的 id。因此,您必须将控件定义存储在会话中,然后使用相同的 id 重新创建,以便 ASP.NET 从视图状态加载它们的属性。Page_load 为时已晚,请在 PreLoad 处执行。

但是更容易在设计时创建所有控件,并将可见设置为 false,并交替它们的可见性,以便视图状态能够正常工作。

于 2009-10-29T21:21:54.093 回答
0

实际上,这不再相关。我们通过禁用动态创建的控件的视图状态来修复它。这并非在所有情况下都有效,但在我们的例子中,用户可以按下两个按钮(与动态控件有关)或一个列表框来切换表单。这两个按钮都将控件的状态保存到数据库,因此实际上并不需要 viewstate。(在考虑 viewstate 以及它如何与控件交互时,我总是感到困惑..)

所以基本建议:如果您无法控制视图状态,请确保您确实需要它。

于 2009-10-30T19:04:36.913 回答