2010-11-23 4 views
6

asp.netのWebページのすべてのコントロールをループして、コントロールする必要があります。 1つの例では、私はページから巨大な文字列を作り、それを自分宛てにメールしています。別のケースでは、すべてをクッキーに保存しています。asp.net Webページのすべてのコントロールをループする

問題は、マスターページとその中のコントロールのコレクションを持つアイテムです。ページをメソッドに渡し、そのメソッドを最も内側のコンテンツページのすべてのコントロールをループして処理するのに十分な汎用性を持たせたいと考えています。私は再帰でこれをやろうとしましたが、再帰は不完全です。

Pageオブジェクトをメソッドに渡し、そのメソッドが最も内側のコンテンツページのすべてのコントロールをループするようにしたいとします。どうすればこれを達成できますか? try/catchなし

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

オブジェクト参照がオブジェクトインスタンスに設定されていません。ラインcontrolIDで

あなたの文書のルート要素から開始した場合= .....

+0

エラーは何ですか。 –

+0

エラーはありません。文字列にはすべてのコントロールを表すエントリがありません。 – MAW74656

+0

エラーが表示されないのは、try/catchブロックを隠しているためです。それを取り除き、何が起こるかを見てください。 –

答えて

8

あなたの元のメソッドは動作しません。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); 
         } 
        } 


      } 

     } 
+0

これでPageオブジェクトを渡すことはできますか?私はこれに何を渡すことができますか? – MAW74656

+0

また、Control cよりもvar cを使用する利点は何ですか? – MAW74656

+1

@ MAW74656構文砂糖、それらは同じです – Prescott

0
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 
+0

C#でこれを行うには? – MAW74656

+0

これはASP.netの質問に関連しているかどうかはわかりません。 – JackAce

+0

間違った言語を申し訳ありません。 –

1
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が存在する場合は、正しいContentPlaceHolderを実際に処理しているかどうかを確認するためにいくつかのチェックを行う必要があります。

23

私はむしろにFindControl http://weblogs.asp.net/dfindley/archive/2007/06/29/linq-the-uber-findcontrol.aspxにデビッドFinleysのLINQのアプローチのような

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(); 
+2

+1 ...あなたは1つに値する! – ileon

+2

ところで...それは動作します! – ileon

+0

これはASP.net 2またはVS2005では機能しません – Fandango68

0

..

はちょうどあなたのID、すべてのコントロールが始まることを確認してください接頭辞は以下のとおりです。すなわち、例えば:<asp:TextBox ID="TextBoxEmail"...>。そうしないと、パーサーはコントロールを検出しません。誰かがコントロールのIDを知らない/ハードコーディングせずに解析する方が良い場合、それはさらに甘いでしょう。

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

とページオブジェクトを渡し、それを呼び出すために...

String log; 
foreach (Control ctrl in Page.Controls) 
    log += GetControls(ctrl); 
0

以下のコードを見つけてください。これはあなたが必要とするすべてのコントロールを手助けするでしょう。 Webページコントロールと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); 
    } 
} 

} 
関連する問題