найти свойства, которые имеют атрибут в элементе управления - PullRequest
2 голосов
/ 17 июня 2011

У меня есть страница с несколькими элементами управления.

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

Ответы [ 4 ]

1 голос
/ 20 июня 2011

Я не знаю, насколько велико ваше дерево управления.Это то, что я бы сделал.Я не обещаю лучшей производительности.

Случай 1. Поиск атрибутов .NET

IEnumerable<Control> GetMarkedControls(ControlCollection controls)
{
  foreach(Control c in controls)
  {
    var props = c.GetType().Properties();
    if(props.Count(x => x.GetCustomAttributes(false).OfType<YourAttribute>().Count() > 0) > 0)
      yield return c;

    foreach (Control ic in GetMarkedControls(c.Controls))
      yield return ic;
  }
}

Случай 2. Поиск HTMLАтрибуты

IEnumerable<WebControl> GetMarkedControls(ControlCollection controls)
{
  foreach(Control c in controls)
  {
    if(c is WebControl)
    {
      var wc = c as WebControl;
      if (wc.Attributes.FirstOrDeafult(x => x.Name == "yourAttribute") != null)
        yield return c;
    }

    foreach (Control ic in GetMarkedControls(c.Controls))
      yield return ic;
  }
}

Теперь вы можете назвать это так: var controlsWAttribute = GetMarkedControls(this.Controls); со своей страницы или любого элемента управления.Таким образом, вы не обязаны вызывать его на уровне страницы.

С помощью этого метода вы исследуете все дерево элементов управления на своей странице или рекурсивно.

1 голос
/ 17 июня 2011

Вам нужно использовать Reflection http://msdn.microsoft.com/en-us/library/system.reflection.aspx

С помощью отражения вы можете получить все атрибуты объекта

0 голосов
/ 17 июня 2011

Не знаю, какие атрибуты вам нужны, но если атрибуты класса - то, что вам нужно, посмотрите на @ user751975, иначе вы можете сделать что-то вроде ...

page.Controls.Cast<System.Web.UI.WebControls.WebControl>().First().Attributes["class"]
0 голосов
/ 17 июня 2011

Каждый элемент управления на странице имеет свойство «controls», которое содержит все его дочерние элементы управления. Я написал рекурсивные функции для их обхода, но у меня их нет. Позвольте мне попытаться написать один очень быстро:

public Collection<Control> findControlsWithAttributes(Control startingControl)
{
    Collection<Control> toReturn = new Collection<Control>();
    foreach (Control curControl in startingControl.controls)
    {
        if (DO COMPARISON HERE WITH CURCONTROL) toReturn.add(curControl);
        if (curControl.Count() > 0) findControlsWithAttributes(curControl, toReturn);
    }
    return toReturn;
}

private void findControlsWithAttributes(Control startingControl, Collection<Control> inputCollection)
{
    foreach (Control curControl in startingControl.controls)
    {
        if (DO COMPARISON HERE WITH CURCONTROL) inputCollection.add(curControl);
        if (curControl.Count() > 0) findControlsWithAttributes(Control startingControl, Collection<Control> inputCollection);
    }
}

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

Наконец, Control.Attributes вернет коллекцию AttributeCollection, с которой вы сможете впоследствии сравнить.

...