3

ページの読み込み時に動的に読み込まれるユーザー コントロールがあります。

protected void Page_Load(object sender, EventArgs e)
{
    MyControl ctl = (MyControl)LoadControl(controlPath);
    ctl.ID = "mycontrol";
    this.MyControlPlaceHolder.Controls.Add(ctl);
}

ページのフロント エンド:

<asp:PlaceHolder runat="server" ID="MyControlPlaceHolder"></asp:PlaceHolder>

コントロールを見つけていくつかのプロパティを設定しようとしているメソッドを開始してポストバックし、呼び出すページにクリックイベントがあります。

        MyControl ctl = (MyControl)FindControl("mycontrol");
        if (ctl != null){
            ctl.MyProperty = true;
            Response.Write("success");
        }
        else
            Response.Write("fail");

これはポストバック後の書き込み失敗なので、コントロールを見つける際に何か間違ったことをしているようです。これを行う最善の方法は何ですか?

編集:

I switched it to MyControl ctl = (MyControl)this.MyControlPlaceHolder.FindControl("mycontrol");

これにより、コントロールが検出されましたが、ポストバック後にコントロールが読み込まれると、プロパティが設定されていないように見えます。

4

3 に答える 3

2

FindControl は直接の子のみを検索するため、再帰的な FindControl 実装を使用する必要があります。コントロールは、下位レベルのネーミング コンテナーに挿入されます。MSDN の一般的な FindControlRecurisve:

private Control FindControlRecursive(Control rootControl, string controlID)
{
    if (rootControl.ID == controlID) return rootControl;

    foreach (Control controlToSearch in rootControl.Controls)
    {
        Control controlToReturn = 
            FindControlRecursive(controlToSearch, controlID);
        if (controlToReturn != null) return controlToReturn;
    }
    return null;
}

MSDN から

または、サンプルのように特定のコンテナが 1 つしかない場合:

MyControl ctl =  this.MyControlPlaceHolder.FindControl("mycontrol");

if (ctl != null){
            ctl.MyProperty = true;
            Response.Write("success");
        }
        else
            Response.Write("fail");

ViewState でコントロールを有効にする

public class MyControl:Control
{
   public bool MyProperty
   {
       get 
       {
           return ViewState["my"] != null? (bool) ViewState["my"]: false; 
       }
       set 
       {
           ViewState["my"]  = value;
       }
   }
}
于 2013-07-19T15:25:28.150 に答える