ASP.NET UserControl通信の具体的な実現

5006 ワード

最近SharePoint 2007でWebPart通信技術が使われていますが、個人的には2007バージョンのConnectionConsumerとConnectionProviderは2010バージョンほど使いやすいとは思いません.そこで、通信を実現するために考えを変えました.WebPartコンテナにUserControlコントロールを1つ入れて、UserControlだけが通信できるようにして、WebPart間の通信を実現しました.
UserControlはユーザー定義のコントロールであり、UserControlにイベントを注入し、あるイベントを1つのUserControlがトリガした後、イベントパラメータを通じてデータを伝達し、他のUserControlにこのイベントが伝達したパラメータを獲得させ、通信を実現することができる.
2つのUserControlによる通信を簡単に説明します
 
クラス、2つのUserControl、および1つのWebページを作成します.
ここはそれぞれcs,UCProvider.ascx,UCComsumer.ascx,Default.aspx.
MyEventAgrs.csコードは以下の通りです.
 
  
public delegate void MyEventHandle(object sender, MyEventAgrs args);
    public class MyEventAgrs : EventArgs
    {
        public MyEventAgrs() { }
        public string MyMsg { get; set; }
    }

public delegate void MyEventHandle(object sender, MyEventAgrs args);
    public class MyEventAgrs : EventArgs
    {
        public MyEventAgrs() { }
        public string MyMsg { get; set; }
    }


他のオブジェクトを渡す場合はMyEventAgrsクラスのMyMsgメソッドを変更するだけです.ここでEventArgs抽象クラスを継承し、イベントパラメータ値を格納し、委任イベントを定義して他の場所で使用する必要があります.
 UCProvider.ascxコードは次のとおりです.
 
  
 public partial class UCProvider : System.Web.UI.UserControl
    {
        public event MyEventHandle myHandle;
        protected void Page_Load(object sender, EventArgs e)
        {
            this.DropDownList1.SelectedIndexChanged += new EventHandler(DropDownList1_SelectedIndexChanged);
        }
        void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
        {
            MyEventAgrs myEvent = new MyEventAgrs();
            myEvent.MyMsg = DropDownList1.SelectedValue;
            myHandle(this, myEvent);
        }    }

public partial class UCProvider : System.Web.UI.UserControl
    {
        public event MyEventHandle myHandle;
        protected void Page_Load(object sender, EventArgs e)
        {
            this.DropDownList1.SelectedIndexChanged += new EventHandler(DropDownList1_SelectedIndexChanged);
        }
        void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
        {
            MyEventAgrs myEvent = new MyEventAgrs();
            myEvent.MyMsg = DropDownList1.SelectedValue;
            myHandle(this, myEvent);
        }    }


ここではフロントページにDropDownListを定義し、DropDownListにデータソースをバインドし、フロントページを羅列しません.ユーザがDropDownListを選択したときにユーザが選択したDropDownListの値を渡すことを実現し、コードの中でmyHandle(this,myEvent)でイベントを初期化したい.
UCComsumer.ascxコードは次のとおりです.
 
  
 public partial class UCComsumer : System.Web.UI.UserControl
    {
public void InitValue(string msg) {
            lb.Text = msg;
        }
}

public partial class UCComsumer : System.Web.UI.UserControl
    {
public void InitValue(string msg) {
            lb.Text = msg;
        }
}


ここで値を割り当てるときは、次のように属性で表すこともできます.
 
  
  public string UC1Msg
        {
            get{return this.lb.Text;}
            set{this.lb.Text=value;}
        }

public string UC1Msg
        {
            get{return this.lb.Text;}
            set{this.lb.Text=value;}
        }


このようにすれば、UserControlを参照するときに便利になります.
 
  



Default.aspxコードは以下の通りです.
フロントページにはUserControlの登録が必要です
 
  




再参照
 
  




バックグラウンドページ:
 
  
protected void uc1_myHandle(object sender, MyEventAgrs args)
        {
            if (args != null)
            {
                uc2.InitValue(args.MyMsg);
            }
            else
                uc2.UC1Msg = string.Empty;
        }

protected void uc1_myHandle(object sender, MyEventAgrs args)
        {
            if (args != null)
            {
                uc2.InitValue(args.MyMsg);
            }
            else
                uc2.UC1Msg = string.Empty;
        }


これでプロセス全体が完了しました.Default.aspxページは1つのキャリアまたは中間メディアのみであり,すべての動作は2つのUserControlの間で行われる.しかし、ページが最初にロードされたとき、つまりページがロードされすぎてドロップダウンボックスがクリックされない前に、ここでは値が伝達されません.