[英]Iterating through textbox controls in a panel C#
我看到许多其他人也遇到类似的问题,但是我在这里找不到逻辑上的缺陷。 任何帮助将不胜感激。
我有一个面板,其中添加了许多标签和文本框控件,即:
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()方法时,控件不在面板中。 这是涉及的过程:
单击一个commandButton,然后从数据库中读取问题,对于每个问题,将调用一个方法,该方法为editQuestionsPanel.Controls添加2个标签和一个文本框。 该面板位于PlaceHolder内部,然后将其显示。
单击PlaceHolder内的按钮时,将调用updateQuestions()方法,并且editQuestionsPanel.Controls.Count =1。由于DB中大约有12个问题,因此该问题应约为36个。Panel中的一个控件的类型为:
System.Web.UI.LiteralControl
它不包含任何控件。
我敢肯定,在生命周期中的任何地方都已清除了面板的控件,但我不知道如何跨过生命周期。 我有一个Page_load方法,单击按钮后立即调用,但是一旦单击调用updateQuestions()的按钮,editQuestionsPanel.Controls.Count已经恢复为1,因此必须在此之前清除它,但我不知道如何纠正这个...
您能提供的任何帮助我解决此问题的帮助将不胜感激-它杀死了我!
这仅从集合控件中选择TextBox类型的控件。
(与control is TextBox
相同为control is TextBox
或(control as TextBox) != null
)
如果控件包含在editQuestionsPanel.Controls
:
using System.Linq;
IEnumerable<TextBox> textBoxes = editQuestionsPanel.Controls.OfType<TextBox>();
foreach (TextBox textBox in textBoxes)
{
// do stuff
}
要选择所有子控件,请使用下一个扩展方法:
public static IEnumerable<T> GetChildControls<T>(this Control control) where T : Control
{
var children = control.Controls.OfType<T>();
return children.SelectMany(c => GetChildControls<T>(c)).Concat(children);
}
使用方法:
IEnumerable<TextBox> textBoxes = editQuestionsPanel.GetChildControls<TextBox>();
动态添加控件时,需要在每个请求上都执行此操作-asp.net不会为您执行此操作!
在Init或Load阶段添加控件,然后将使用回发值填充控件。
一个常见的错误: Container.Controls
仅包含此容器中的第一级子控件。 即:PanelA中的TextBox1,PanelB中的PanelA,您无法在PanelB.Controls中获得TextBox1。
我的解决方案是编写一个扩展方法:
public static IEnumerable<Control> AllControls(this Control ctl)
{
List<Control> collection = new List<Control>();
if (ctl.HasControls())
{
foreach (Control c in ctl.Controls)
{
collection.Add(c);
collection = collection.Concat(c.AllControls()).ToList();
}
}
return collection;
}
现在TextBox1在PanelB.AllControls()
。 若要使用类型筛选所有控件,请使用PanelB.AllControls().OfType<TextBox>()
尝试这个
int Count = 0;
foreach (Control ctr in Panel1.Controls)
{
if (ctr is TextBox)
Count++;
}
您可以改为执行以下操作:
var questions = from tb in editQuestionsPanel.Controls.OfType<TextBox>()
select tb.Text;
foreach(var question in questions)
{
writeNewQuestionToTblQuestions(question);
}
如果其他答案没有帮助,请尝试编写代码,但增加递归性。 如果代码是editQuestionsPanel => Panel => Textbox,则您的代码将不起作用
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.