【问题标题】:Accessing controls created dynamically (c#)访问动态创建的控件 (c#)
【发布时间】:2011-02-28 06:13:38
【问题描述】:

在 (c#) 后面的代码中,我动态创建了一些 RadioButtonLists,其中每个 RadioButtons 都有更多。我把所有控件放到一个特定的面板上。 我需要知道的是以后如何访问这些控件,因为它们不是在 .aspx 文件中创建的(通过从工具箱中拖放)?

我试过了:

    foreach (Control child in panel.Controls)
    {
        Response.Write("test1");
        if (child.GetType().ToString().Equals("System.Web.UI.WebControls.RadioButtonList"))
        {
            RadioButtonList r = (RadioButtonList)child;
            Response.Write("test2");
        }   
    }

“test1”和“test2”没有出现在我的页面中。这意味着这个逻辑有问题。 有什么建议吗?

【问题讨论】:

  • 您可以用多种更好的方式重写循环,其中一种是foreach (RadioButtonList list in panel.Controls.OfType<RadioButtonList>())。仅供参考。但是使用child.GetType().ToString()... 将是我想到的最后一种方法。例如,if 可能会说 if (child is RadioButtonList)
  • 同意前面的评论,而且……你真的需要掌握一些 C# 知识,比如“is”关键字……
  • 感谢您的建议。虽然我的代码没有错,但更有意义。

标签: c# asp.net radio-button dynamic


【解决方案1】:

您必须在每次回发后重新创建控件。

ASP.NET 是无状态的,也就是说,当您将页面回发到服务器时,您动态创建的控件将不再是页面的一部分。

上周我不得不再次克服这种情况。

我做了什么? 我保存了用于在 Session 对象中创建控件的数据。在 PageLoad 方法中,我传递了相同的数据来重新创建动态控件。

我的建议是: 编写一个方法来创建动态控件。

在 PageLoad 方法中检查是否是回发...

if(Page.IsPostBack)
{
   // Recreate your controls here.
}

一件非常重要的事情:为您动态创建的控件分配唯一的 ID,以便 ASP.NET 可以重新创建绑定其现有事件处理程序的控件、恢复其 ViewState 等。

myControl.ID = "myId";

我很难了解这东西是如何工作的。一旦你学会了,你就掌握了权力。动态创建的控件开辟了一个充满可能性的新世界。

正如弗兰克所说:您可以通过这种方式使用“is”关键字来方便您的生活......

if(child is RadioButtonList)


注意: 值得一提的是 MSDN 上的ASP.NET Page Life Cycle Overview 页面,以供进一步参考。

【讨论】:

  • 好的,我会听从你的建议的。
  • 告诉我一些事情。如果我将一个文本框保存到会话中(我需要将每个文本框保存到不同的会话中吗?),我怎样才能从下一页的文本框中获取文本(因为我将文本框对象保存到会话中,而没有用户编写的文本)?我以文本框为例,但它与 RadioButtons 类似。
  • @Aliens:Session 对象在 ASP.NET 中对于每个用户都是唯一的,因此没有不同的会话。您使用 Session.Add("objectName", objectValue)。如果在每次回发后重新创建控件,它们将保留它们的值(因为 ViewState),只要您遵循我的建议。
  • 我重新创建了一些文本框,我只获得了它们的 ID (textBox.ID),但我无法获得文本(textBox.Text 是空字符串)。但是,如果我在创建动态对象的方法中编写语句 textBox.Text ="something" ,我稍后会得到该文本。我错过了什么(抱歉,我是 asp.net 的新手)?
  • @Aliens:我对你现在想要做什么感到有点困惑。 textBox.Text 是空的,因为您可能没有向其中输入/输入任何数据。如果您在 textBox.Text 中写入内容,则在重新创建 textBox.Text 时会获得相同的值。这似乎是正确的行为。
【解决方案2】:

我不认为在 PageLoad 中创建控件是正确的做法,首先 asp.net 生命周期从 Initialization;Load ViewState Data;Load PostData;对象加载等。

如果您在 Page_Load 创建控件,您将丢失 ViewState、事件等。

就在PageInit上做,或者是一个控件(OnInit)。

下一个困难是在 PageInit 中,您没有可用的 ViewState,如果您需要重建对象的数量,您需要在隐藏字段中存储一些上下文/信息,然后在 PageInit 检索该信息,创建对象,瞧!

例子:

想象你需要创建 1..N 个文本框,你创建 html 隐藏字段(不使用 runat=server),例如NumberOfTextBoxes。

当您执行 PageInit 代码时:您检索值,例如numberOfTextBoxes = Request.Form["NumberOfTextBoxes"],然后创建 TextBoxes。

记住最重要的是匹配存储ViewState的现有控件的数量和顺序。

【讨论】:

  • 我对文本框的数量及其 ID 没有问题。但我无法从文本框中获取文本(请在 Leniel Macaferi 的答案中查看我的 cmets)。如果您有任何解决方案,我将不胜感激。
【解决方案3】:

您何时在代码中执行此操作?确保您在 ASP 生命周期中的正确时间执行此操作,否则您的控件尚不存在:http://msdn.microsoft.com/en-us/library/ms178472.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 2012-11-03
    • 1970-01-01
    相关资源
    最近更新 更多