0

マスター ページがあり、そこにはメニュー項目が 1 つとコンテンツ プレースホルダーが 1 つしかありません。このマスター ページから継承する別の Web フォームがあります。いつものように、すべてのコントロールを contentplaceholder に配置しました。フォームの Page_Load イベントで、すべてのドロップダウン リスト コントロールの Enabled=false を設定したいと考えています。この目的のために、私は次のように書いています。

       foreach (Control control in Page.Controls)
    {
        if (control is DropDownList)
        {
            DropDownList ddl = (DropDownList)control;
            ddl.Enabled = false;
        }
    }

ただし、すべてのドロップダウンリストは有効のままです。Page.Control のカウントを確認すると、コントロールが 1 つしか表示されず、それがフォームのマスターページのメニュー項目です。現在のフォームにあるコントロールのリストを取得するにはどうすればよいですか?

4

2 に答える 2

1

コントロールは子コントロールを持つことができ、子コントロール、次にDDLも持つことができるため、foreachループは機能しません。

私が好むのは、最初にコントロールのリストを作成してから、必要なDDLコントロールで満たされたリストを反復処理することです。

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 
    {
       if (c is DropDownList){ foundSofar.Add(c); } continue;

       if(c.Controls.Count > 0) 
       {
           this.FindTheControls(foundSofar, c);
       }
     }
  }  
}

後で、foundSofarを直接ループすることができ、その中にすべてのDDLコントロールが含まれることが確実になります。

于 2012-04-10T10:22:28.390 に答える
1

これが私のために働いたコードです。その通りです。ページからコンテンツ コントロールにアクセスできないため、Master.FindControl... コードを使用します。ContentPlaceHolderID 引数を Master.FindControl("righthere") 式にプラグインしてください。

ContentPlaceHolder contentPlaceHolder = (ContentPlaceHolder)Master.FindControl("MainContent");
if(contentPlaceHolder != null)
{
    foreach (Control c in contentPlaceHolder.Controls)
    {
        DropDownList d = c as DropDownList;
        if (d != null)
            d.Enabled = false;
    }
}
于 2012-04-10T10:16:35.867 に答える