Перебрать все элементы управления на веб-странице asp.net - PullRequest
6 голосов
/ 23 ноября 2010

Мне нужно перебрать все элементы управления на моей веб-странице asp.net и что-то сделать с элементом управления.В одном случае я делаю гигантскую строку из страницы и отправляю ее себе по электронной почте, а в другом случае я сохраняю все в куки.

Проблема в главных страницах и элементах с коллекциями элементов управления внутриих.Я хочу иметь возможность передать страницу в метод, а затем сделать этот метод достаточно универсальным, чтобы пройти через все элементы управления на самой внутренней странице содержимого и работать с ними.Я пытался сделать это с помощью рекурсии, но моя рекурсия не завершена.

Я хочу передать объект Page в метод, и этот метод должен пройти через все элементы управления на самой внутренней странице содержимого.Как мне этого добиться?

    private static String controlToString(Control control)
{
    StringBuilder result = new StringBuilder();

    String controlID = String.Empty;

    Type type = null;

    foreach (Control c in control.Controls)
    {
        try
        {
            controlID = c.ID.ToString();

            if (c is IEditableTextControl)
            {
                result.Append(controlID + ": " + ((IEditableTextControl)c).Text);
                result.Append("<br />");
            }
            else if (c is ICheckBoxControl)
            {
                result.Append(controlID + ": " + ((ICheckBoxControl)c).Checked);
                result.Append("<br />");
            }
            else if (c is ListControl)
            {
                result.Append(controlID + ": " + ((ListControl)c).SelectedValue);
                result.Append("<br />");
            }
            else if (c.HasControls())
            {
                result.Append(controlToString(c));
            }

            //result.Append("<br />");
        }
        catch (Exception e)
        {

        }
    }

    return result.ToString();
}

Без Try / catch

Ссылка на объект не установлена ​​для экземпляра объекта.

On linecontrolID = .....

Ответы [ 6 ]

25 голосов
/ 12 января 2012

Мне скорее нравится подход Дэвида Финлиса linq к FindControl http://weblogs.asp.net/dfindley/archive/2007/06/29/linq-the-uber-findcontrol.aspx

public static class PageExtensions
{
    public static IEnumerable<Control> All(this ControlCollection controls)
    {
        foreach (Control control in controls)
        {
            foreach (Control grandChild in control.Controls.All())
                yield return grandChild;

            yield return control;
        }
    }
}

Использование:

// get the first empty textbox
TextBox firstEmpty = accountDetails.Controls
    .All()
    .OfType<TextBox>()
    .Where(tb => tb.Text.Trim().Length == 0)
    .FirstOrDefault();

// and focus it
if (firstEmpty != null)
    firstEmpty.Focus();
8 голосов
/ 23 ноября 2010

Ваш оригинальный метод не будет работать, если вы начнете с корневого элемента документа: что-то вроде page.Controls, поскольку вы будете проходить только по первому уровню элементов управления, но помните, что элемент управления может быть составным. Так что вам нужна рекурсия, чтобы это осуществить.

        public void FindTheControls(List<Control> foundSofar, Control parent) 
        {

            foreach(var c in parent.Controls) 
            {
                  if(c is IControl) //Or whatever that is you checking for 
                  {

                      foundSofar.Add(c);

                      if(c.Controls.Count > 0) 
                      {
                            this.FindTheControls(foundSofar, c);
                      }
                  }


            }  

        }
2 голосов
/ 13 апреля 2011
foreach (Control ctlMaster in Page.Controls)
{
    if (ctlMaster is MasterPage)
    {
        foreach (Control ctlForm in ctlMaster.Controls)
        {
            if (ctlForm is HtmlForm)
            {
                foreach (Control ctlContent in ctlForm.Controls)
                {
                    if (ctlContent is ContentPlaceHolder)
                    {
                        foreach (Control ctlChild in ctlContent.Controls)
                        {
                            //Do something!
                        }
                    }
                }
            }
        }
    }
}

Это должно сделать это.Хотя вам может потребоваться выполнить некоторую проверку, чтобы убедиться, что вы действительно имеете дело с правильным ContentPlaceHolder, если их больше одного.

0 голосов
/ 16 июня 2016

Пожалуйста, найдите ниже код. Это должно помочь вам со всеми необходимыми элементами управления. Вы должны иметь возможность использовать элементы управления веб-страниц, а также элементы управления ASP.NET.

public partial class Default : System.Web.UI.Page
{

List<Control> lstControl = new List<Control>();

protected void Page_Load(object sender, EventArgs e)
{

}

private List<Label> getLabels() // Add all Lables to a list
{
    List<Label> lLabels = new List<Label>();

    foreach (Control oControl in Page.Controls)
    {
        GetAllControlsInWebPage(oControl);
    }

    foreach (Control oControl in lstControl)
    {
        if (oControl.GetType() == typeof(Label))
        {
            lLabels.Add((Label)oControl);
        }
    }
    return lLabels;
}

protected void GetAllControlsInWebPage(Control oControl)
{
    foreach (Control childControl in oControl.Controls)
    {
        lstControl.Add(childControl); //lstControl - Global variable
        if (childControl.HasControls())
            GetAllControlsInWebPage(childControl);
    }
}

}
0 голосов
/ 01 сентября 2015

Это сработало для меня ..

Просто убедитесь, что вы идентифицируете все свои элементы управления, начиная с префиксов, показанных ниже. например: <asp:TextBox ID="TextBoxEmail"...> например. В противном случае парсер не обнаружит ваш контроль. Если у кого-то есть лучший способ синтаксического анализа без знания / жесткого кодирования идентификатора элементов управления, это будет еще слаще.

protected String GetControls(Control control)
{
    //Get text from form elements
    String text = "";
    foreach (Control ctrl in control.Controls)
    {
        if (ctrl.ClientID.Contains("TextBox"))
        {
            TextBox tb = (TextBox)ctrl;
            text += tb.ID.Replace("TextBox", "") + ": " + tb.Text + "<br />";
        }
        if (ctrl.ClientID.Contains("RadioButtonList"))
        {
            RadioButtonList rbl = (RadioButtonList)ctrl;
            text += rbl.ID.Replace("RadioButtonList", "") + ": " + rbl.SelectedItem.Text + "<br />";
        }
        if (ctrl.ClientID.Contains("DropDownList"))
        {
            DropDownList ddl = (DropDownList)ctrl;
            text += ddl.ID.Replace("DropDownList", "") + ": " + ddl.SelectedItem.Text + "<br />";
        }

        if (ctrl.ClientID.Contains("CheckBox"))
        {
            CheckBox cb1 = (CheckBox)ctrl;
            text += cb1.ID.Replace("CheckBox", "") + ": " + cb1.Text + "<br />";
        }

        if (ctrl.HasControls())
            text += GetControls(ctrl);
    }

    return text;
}

И чтобы вызвать его, передав объект Page ...

String log;
foreach (Control ctrl in Page.Controls)
    log += GetControls(ctrl);
0 голосов
/ 23 ноября 2010
sub getcontrols(byref c as control, byref allControls as list(of control)
if c isnot nothing
allcontrols.add(c)
if c.controls.count>0 then
for each ctrl as control in c.controls
getcontrols(ctrl,allcontrols)
next
end if
...