簡體   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