繁体   English   中英

遍历面板C#中的文本框控件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM