簡體   English   中英

使用母版頁遍歷頁面上的控件

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM