【问题标题】:Read custom user control state读取自定义用户控件状态
【发布时间】:2011-10-25 08:47:17
【问题描述】:

我向我的页面添加了一个自定义用户控件,带有文本框和单选框,但在每次回发后,内容都会被删除,我不知道如何读取其中输入的值。

据我所知,您必须在每次刷新时添加用户控件,但这不会恢复它们的状态。我希望将值存储在 ViewState 中,但由于某种原因这不会发生。

注意:我需要在一个页面上添加多个用户控件,因此我需要通过 ID 或从我的页面中选择该用户控件的 linq 表达式来识别每个用户控件。

我正在使用 C# 4.0 进行编程

如何添加我的用户控件:

    private void AddInstrumentDetailToPage()
    {
        RMAItem lItem = (RMAItem)Page.LoadControl("/Controls/RMAItem.ascx");
        InstrumentDetail.Controls.Add(lItem);
    }

我保存了 ViewState 中的控件数量,并调用 AddInstrumentDetail() 的次数,但它们似乎是空的。我在某处读到我必须在 Page_Init 中添加它,因为视图状态尚未初始化,但这也无济于事。

【问题讨论】:

  • 如何添加用户控件?在aspx代码中添加是否可行?

标签: asp.net


【解决方案1】:

您需要最迟在Page_Load 中重新创建动态添加的(用户-)控件以维护 ViewState。因此,您应该将已添加控件的数量存储在 ViewState-Property 中,并据此将它们重新加载到 Page_Load 中。您必须在 AddInstrumentDetailToPage 中将此变量与 1 相加。

MSDN: Dynamically Adding User Controls

如果您将添加的控件数量存储在 Viewstate 变量中,则无法在 Page 的 Init-Event 中重新创建控件,因为 ViewState-Variable 尚未在此处重新加载。

【讨论】:

  • 我保存了 ViewState 中的控件数量,并调用了 AddInstrumentDetail() 次数,但它们似乎是空的。我在某处读到我必须在 Page_Init 中添加它,因为视图状态尚未初始化,但这也无济于事。
  • 啊!我明白了,我必须在Page_Init中添加控件,但是我怎么知道我必须添加多少?我可以将其保存在查询字符串或其他内容中吗?
  • 在 Page_Load 中可能就足够了(优点是使用 ViewState 变量来存储添加的控件的数量)。看看下面的文章,看看什么时候足够:msdn.microsoft.com/en-us/library/ms972976.aspx#viewstate_topic4 或我对类似问题的另一个回答:stackoverflow.com/questions/5046101/…
  • 你已经回答了我的问题。如果不是太麻烦,一个快速的问题:如何在不创建成员变量的情况下获得我在事件函数中添加的控件的列表?像 GetControls 仅适用于 RMAItems。
  • 啊,我明白了!我只是遍历 InstrumentDetails.Controls 中的值并检查它是否是 RMAItem。
【解决方案2】:

除非你创建一个PostBack,否则你不会有任何ControlState。刷新浏览器/请求相同的链接将是一个全新的开始。

默认情况下,添加到您页面的任何control 都是为您的UserControl 存储在ViewStateControlState 中的数据。

如果你愿意保存你的内容,我建议你把它保存在Request.Session.Add("yourKey", "yourValue")

您可以在protected void Page_Load(object sender, EventArgs e) 方法上使用var yourValue = Request.Session["yourKey"]; 访问您的会话。

为您的RMAItem 实例指定一个ID,否则在ControlState 上存储数据可能不起作用!

private void AddInstrumentDetailToPage()
{
    RMAItem lItem = (RMAItem)Page.LoadControl("/Controls/RMAItem.ascx");
    lItem.ID = "rmaItem1"; //<-- This is important
    InstrumentDetail.Controls.Add(lItem);
}

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 2011-02-21
    • 2016-03-21
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多