2017-05-30 9 views
-1

私はこの質問に名前を付けることが正確ではなく、答えを探している運がなかった。私は現在、コードの背後にあるforループを使用してWebページ上の複数の要素にアクセスしようとしています。問題は次のとおりです。私は問題の要素にidだけでなく文字列としてアクセスする必要があり、要素に新しいクラスを割り当てる能力と、内側のHTMLを変更する能力を持っている必要があります。たとえば:アクセス制御は文字列の名前付きループですか?

<li>Name: <a runat="server" id="name0" class="data">MACHINE</a></li> 
<li>Name: <a runat="server" id="name1" class="data">MACHINE</a></li> 
<li>Name: <a runat="server" id="name2" class="data">MACHINE</a></li> 
<li>Name: <a runat="server" id="name3" class="data">MACHINE</a></li> 
<li>Name: <a runat="server" id="name4" class="data">MACHINE</a></li> 

 for (int i = 0; i < 10; i++) { 
      container.controls(string.Format("name{0}", i)).class = "inactive"; 
      container.controls(string.Format("name{0}", i)).innerHtml = "NameFromDB"; 
     } 

上記のC#コードは、擬似コードで、私は誰かが私は運を持っていないよので、私はこれを理解することができます願っています。私はそれが結果を生み出していないという言葉遣いだと思っています。

+0

なぜ文字列としてアクセスする必要がありますか?弦はどこから来たのですか? – Enigmativity

答えて

0

このように、あなたのすべてのコントロールが別のサーバーコントロールの内側にあると仮定すると:あなたはこれを行うことができます

<div runat="server" id="ContainerControl"> 
    <li>Name: <a runat="server" id="name0" class="data">MACHINE</a></li> 
    <li>Name: <a runat="server" id="name1" class="data">MACHINE</a></li> 
    <li>Name: <a runat="server" id="name2" class="data">MACHINE</a></li> 
    <li>Name: <a runat="server" id="name3" class="data">MACHINE</a></li> 
    <li>Name: <a runat="server" id="name4" class="data">MACHINE</a></li> 
</div> 

HtmlAnchorのようにキャストすると、コンテナ内にある可能性のある他のサーバーコントロールを確実にキャッチしません。

var container = ContainerControl; 
foreach (Control control in container.Controls) 
{ 
    var anchor = control as HtmlAnchor; 
    if (anchor != null) 
    { 
     anchor.InnerText = "new inner text"; 
     anchor.Attributes.Add("class", "newclass"); 
    } 
} 

それとも数でそれらを参照したいとあなたはすでに、彼らはあなたがこれを行うことができますコントロールの右のタイプであることを知っている場合:

for (var index = 0; index <= 4; index++) 
{ 
    var control = (HtmlContainerControl)FindControl("name" + index); 
    control.InnerText = "new inner text"; 
    control.Attributes.Add("class", "newclass"); 
} 

FindControl IDによってページ上のコントロールを取得します。 (InnerText持つコントロールの基本クラスですHtmlContainerControlとしてキャスティング。あなただけの代わりにHtmlAnchorとして唱えられる。)

+0

この実装に問題があります。それは、コントロールのインスタンスに対してnull参照例外をスローしています。私は新しいスニペットで自分の投稿を更新します。私は何かが間違っているかどうかわからない。 – lxxtacoxxl

+0

私は問題が何かを考え出しました、私はjavascriptで使用されるプレースホルダーの名前を使用していましたが、これはサーバーのサイドコードなので、サーバーサイドの名前を使用できます。 – lxxtacoxxl

0

それはあなたの親コントロールが何であるかを確認するのに役立ちます。親の子コントロールをループすることで、コントロールのリストをループすることができます。フォームビューでコントロールをループする例を次に示します。

foreach (FormViewRow r in formView.Controls[0].Controls) 
     { 
      foreach (TableCell cell in r.Controls) 
      { 

       foreach (Control ctr in cell.Controls) 
       { 

        //Check to see if child control is generic control 
        if (ctr is HtmlGenericControl) 
        { 
         // cast to HtmlGenericControl to access properties 
         HtmlGenericControl li = (HtmlGenericControl)ctr;              
         li.Attributes.Add("class", "inactive"); 
         li.InnerHtml = "NameFromDB"; 

        } 
       } 
      } 
     } 
関連する問題