[英]Looping through controls on a page using a masterpage
我正在嘗試對從母版頁繼承的頁面上的每個控件執行操作。 我不知道如何訪問子頁面控件。 我試圖像這樣遞歸地進入控件:
private void checkControls(ControlCollection controlcollection)
{
foreach (Control control in controlcollection)
{
if (control.Controls.Count > 0)
{
Debug.WriteLine(control.GetType().ToString());
checkControls(control.Controls);
}
else
{
Debug.WriteLine(control.GetType().ToString());
}
}
該方法的調用方式如下:
protected void resettodefault()
{
checkControls(this.Page.Controls);
}
但是,從此執行中打印的唯一控件是:
ASP.site_master
System.Web.UI.LiteralControl
我希望直接訪問我的控件(無需遞歸)。 否則,如何修改遞歸以到達所需頁面的控件?
我建議使用基本頁面而不是母版頁,這樣,您遍歷控件的邏輯(以及以后進行的任何操作)就不會與頁面使用哪個母版頁綁定。
至於在頁面上獲取所有控件,因為控件是分層的,就像它們代表的HTML一樣,因此以遞歸方式遍歷它們是有意義的。 但是,如果您不願遞歸地獲取控件,則應該執行以下操作:
IEnumerable<Control> GetAllControls()
{
var allControls = new List<Control>();
var currentControls = new Queue<Control>();
currentControls.Enqueue(this.Page);
while (currentControls.Count >0)
{
var c = currentControls.Dequeue();
if (!allControls.Contains(c))
{
allControls.Add(c);
if (c.Controls != null && c.Controls.Count > 0)
{
foreach (Control e in c.Controls)
{
currentControls.Enqueue(e);
}
}
}
}
return allControls;
}
最后要考慮的是頁面的生命周期以及迭代控件的時間。 如果您嘗試過早地步行到控件樹,則可能不會存在所有控件。
編輯:更新的代碼。
更新
為了進行驗證,我強烈建議使用asp.net的內置驗證控件。 您可以在此處閱讀有關它們的更多信息。 這具有在客戶端上進行驗證,提供更快的UI響應並減輕服務器負載的額外好處。
用於重置所有文本框。 我建議為此創建一個新類,然后在需要時調用該類,而不用弄亂母版頁:
public class UIControlsHelper
{
public static void ClearTextboxes(Page page)
{
GetAllControls(page)
.Where(x => typeof(TextBox).IsAssignableFrom(x.GetType())
.ToList()
.ForEach(x => (TextBox)x.Text = string.Empty);
}
IEnumerable<Control> GetAllControls(Page page)
// Same as above, but with the page parameter replaced.
}
}
在您的任何頁面中:
UIControlsHelper.ClearTextboxes(this);
要訪問子頁面中的控件,請執行以下步驟:
1-聲明您要訪問的類型的變量。 例如,如果要訪問子頁面中的標簽,請使用:
Label lbl_child=this.ContentPlaceHolder1.findcontrol("your label id in child page") as Label;
現在您有了標簽,可以自由對其進行更改。 此控件上的所有更改都將反映在子控件上。
ContentPlaceHolder1是您的Contentplace Holder ID,因此請使用您的Content ID進行更改。
public void ClearTextboxes(Page page) {
GetAllControls(page)
.Where(x => typeof(TextBox).IsAssignableFrom(x.GetType()))
.ToList()
.ForEach(x => ((TextBox)x).Enabled=false);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.