【发布时间】:2010-08-26 22:07:15
【问题描述】:
我见过很多其他人有类似的问题,但我在这里找不到我的逻辑缺陷。任何帮助将不胜感激。
我有一个面板,我添加了许多标签和文本框控件,即:
myPanel.Controls.Add(txtBox);
这些控件是在迭代方法之前调用的方法中创建和添加的。
我想遍历每个文本框并将其 Text 属性用作另一种方法中的参数,但我没有任何运气。这是我的迭代尝试:
public void updateQuestions()
{
try
{
foreach (Control c in editQuestionsPanel.Controls)
{
if (c is TextBox)
{
TextBox questionTextBox = (TextBox)c;
string question = questionTextBox.Text;
writeNewQuestionToTblQuestions(question);
}
}
}
catch (Exception err)
{
Console.WriteLine(err.Message);
}
}
我遇到的问题是当我到达此 updateQuestions() 方法时,控件不在面板中。以下是所涉及的过程:
单击命令按钮并从数据库中读取问题,为每个问题调用一个方法,该方法将 2 个标签和一个文本框添加到 editQuestionsPanel.Controls。该面板位于 PlaceHolder 中,然后使其可见。
当点击 PlaceHolder 中的按钮时,会调用 updateQuestions() 方法并且 editQuestionsPanel.Controls.Count = 1。由于 DB 中有大约 12 个问题,它应该在 36 个左右。Panel 中的一个控件类型:
System.Web.UI.LiteralControl
它不包含任何控件。
我确信在生命周期的某个地方,Panel 的控件正在被清除,但我不知道如何逐步完成生命周期。我有一个 Page_load 方法,一旦单击按钮就会调用它,但是一旦单击调用 updateQuestions() 的按钮,editQuestionsPanel.Controls.Count 已经回到 1,因此必须在此之前将其清除但我不知道如何纠正这个...
您可以提供任何帮助来帮助我解决这个问题,我们将不胜感激 - 它杀了我!
【问题讨论】:
-
是什么不工作?
-
您的代码对我有用。尝试创建一个完全符合您概述的应用程序,如果它不起作用,请发布整个内容。
-
附带说明,您应该在此处使用
as而不是is。现在,您将变量c转换两次。尝试做TextBox questionTextBox = c as TextBox; if (questionTextBox != null) { ... }这将避免不必要的演员表。 -
我敢打赌,你有生命周期问题,或者
myPanel不是editQuestionsPanel。要诊断生命周期问题,请附加调试器并在各种生命周期事件(OnInit、OnLoad、OnPreRender、OnRender、事件处理程序等)处检查面板上的控件集合,并特别注意控件集合何时被清除。 -
我认为是生命周期问题,添加后控制数为37。如何逐步完成这些阶段。如何在 OnInit 的开头插入断点并逐步查看它被清除的位置?
标签: c# asp.net textbox iteration