1

以下のようにaspxページがあります。コードビハインドを使用してページ内のコントロールを見つけたい。

<html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
      <title></title>
    </head>
<body>
    <form id="form1" runat="server">
      <div>
        <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
      </div>
   </form>
 </body>
</html>

コードビハインド

protected void Button1_Click(object sender, EventArgs e)
    {
        string name;
        foreach (Control ctrl in Controls)
        {
            if (ctrl.Controls.Count > 0)
            {
                name = ctrl.GetType().Name;
            }
        }
    }

ループでボタンを取得できません。テキストボックスを追加しても取得できません。誰が何が悪いのか考えていますか?助けてください。

4

3 に答える 3

1

ASP.Net はページを階層的にレンダリングします。これは、最上位のコントロールのみが直接レンダリングされることを意味します。これらの最上位コントロールのいずれかに子コントロールが含まれている場合、これらの最上位コントロールは独自のControlsプロパティを提供します。

たとえば、あなたの場合、フォームはボタンなどの子コントロールを含む最上位のコントロールです。したがって、ボタンをクリックすると、メソッドが再帰的に呼び出されます。

protected void Button1_Click(object sender, EventArgs e)
    {
        DisplayControl(Page.Controls);

     }

    private void DisplayControls(ControlCollection controls)
    {

        foreach (Control ctrl in controls)
        {
            Response.Write(ctrl.GetType().ToString() + "  , ID::" +  ctrl.ID + "<br />");

           // check for child OR better to say nested controls
            if (ctrl.Controls != null)
                DisplayControls(ctrl.Controls);
        }

    }
于 2013-08-11T06:54:09.627 に答える
1

これを試して。

protected void Button1_Click(object sender, EventArgs e)
{
    string Name = "";
    string Type = "";
    string Id = "";
    foreach (Control ctr in form1.Controls)
    {
        Name = ctr.GetType().Name;
        Type = ctr.GetType().ToString(); ;
        Id = ctr.ID; // If its server control
    }
}
于 2013-08-11T06:45:19.103 に答える
1

これは、ページ内のすべてのコントロールを取得していないためです。コントロールを再帰的に取得する必要があります。拡張メソッドは次のとおりです。

public static class ControlExtensions
{
    public static List<Control> GetChildrenRecursive(this Control control)
    {
        var result = new List<Control>();
        foreach (Control childControl in control.Controls)
        {
            result.Add(childControl);
            if (childControl.Controls.Count > 0)
            {
                result.AddRange(GetChildrenRecursive(childControl));
            }
        }

        return result;
    }
}   

これで、コードを次のように書き直すことができます。

foreach (Control ctrl in this.Page.GetChildrenRecursive())
{
    // Your button element is accessible now.
}
于 2013-08-11T06:34:29.400 に答える