2011-06-17 14 views
2

私はいくつかのコントロールを持つページを持っています。コントロール内に属性を持つプロパティを見つける

ページがレンダリングされているので、ページ上のすべてのコントロールをループし、特定の属性を持つプロパティを持つコントロールを探します。私はC#でこれをやろうとしています - どのように私はこれを達成するかもしれません?

答えて

1

。これは私がやることです。私は最高のパフォーマンスを約束していません。あなたのページまたはからvar controlsWAttribute = GetMarkedControls(this.Controls);:.NET探し

ケース1はHTML探し

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は、あなたがこのようにそれを呼び出すことができます今すぐ

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; 
    } 
} 

属性属性任意のコントロール。この方法では、ページレベルで強制的に呼び出す必要はありません。

この方法では、ページまたはコントロール内のコントロールツリー全体を再帰的に探索できます。

1

あなたがページ上にあるすべてのコントロールがその子コントロールのすべてが含まれている「コントロール」プロパティを持つオブジェクト

0

のすべての属性を取得することができますリフレクションを使用して反射 http://msdn.microsoft.com/en-us/library/system.reflection.aspx

を使用する必要があります。私は前にこれらをループする再帰関数を書いていますが、手元には何も持っていません。私は実際に素早く1を書くことをしてみましょう:

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を返します。

私はあなたのコントロールツリーがどのように大きい知らない
0

ないあなたが後にしているが、クラスの属性ならば、あなたは何かなどを行うことができ、他の賢明user751975 @を見た後であるかである属性がわから...

page.Controls.Cast<System.Web.UI.WebControls.WebControl>().First().Attributes["class"] 
関連する問題