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