1

asp.net サーバー側ボタン コントロールを含むユーザー コントロールがあります。このユーザー コントロールを複数のページで使用します。ユーザーコントロールのボタンクリックイベントでカスタムイベントを発生させています。このユーザー コントロールを使用するすべての親ページは、ユーザー コントロールから発生させたこのカスタム イベントの通知を受け取る必要があります。すべての親ページでこのイベントをサブスクライブする以外に、親ページでこのカスタム イベントの通知を受け取る簡単な方法はありますか?

OnLoad()親ページのイベントをオーバーライドし、すべての親ページがこの抽象基本クラスから継承されるようにする抽象基本クラスで、このユーザーコントロールイベントをサブスクライブしようとしました。ユーザーコントロールの背後にあるコードは次のとおりです。

public partial class CustomPaging : System.Web.UI.UserControl
    {
         public delegate void NavigationButtonHandler(int currentPage);

         public event NavigationButtonHandler NavigationButtonClicked;
         public int CurrentPage { get; set; }

         protected void btnPrev_ServerClick(object sender, EventArgs e)
        {
            if (NavigationButtonClicked != null)
            {


                    NavigationButtonClicked(CurrentPage);


            }
        }

  }

抽象基本クラスは次のとおりです。

public abstract  class CustomPagingBase 
    {

        protected override void OnLoad(EventArgs e)
        {

                 base.OnLoad(e);
                ((CustomPaging)this.FindControl("ucPaging")).NavigationButtonClicked += new CustomPaging.NavigationButtonHandler(CustomPagingBase_NavigationButtonClicked);
        }

        void CustomPagingBase_NavigationButtonClicked(int currentPage)
        {
            LoadData(currentPage);
        }

        protected abstract void LoadData(int currentPage);


    }

しかし、ピースthis.FindControl("ucPaging")は null を返します。親ページのマークアップで宣言的に設定した ucPaging の ID を持つユーザーコントロールがあることに注意してください

4

1 に答える 1

1

FindControl は、既定では再帰的に検索しません。

したがってucPaging、抽象クラスを実装するコントロール コレクションにコントロールが直接追加されない限り、null が返されます。

この機能を使用して見つけることができます

    public static Control FindControlRecursive(this Control control, string id)
    {
        if (control == null) return null;
        //try to find the control at the current level
        Control ctrl = control.FindControl(id);
        if (ctrl == null)
        {
            //search the children
            foreach (Control child in control.Controls)
            {
                ctrl = FindControlRecursive(child, id);
                if (ctrl != null) break;
            }
        }
        return ctrl;
    }
于 2012-08-24T19:02:15.473 に答える