2012-02-03 12 views
0

私はC#でデリゲートの概念を研究しようとしています。デリゲートの問題

私は調査したように、代表者のサンプルを作成しました。しかし私は、そのコンセプトを効果的に使用している正しい状況を理解していませんでした。 代理人を使用するとわかりやすい状況をお聞かせください。

私は代議員の働きを知っています。しかし、それが有効に使用されている場所はまだクリアされていません。

以下に私のコードを掲示しました。サンプルで間違いがあった場合はお知らせください。

ありがとうございます。

ChangePassword.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ChangePassword.ascx.cs" Inherits="User_Controls_ChangePassword" %> 

<div style="width:500px;clear:both;"> 
<div style="width:100%; clear:both;"> 
    <div style="width:150px; float:left;"> 
     <asp:Label ID="newPassword" runat="server" Text="New Password"></asp:Label> 
    </div> 
    <div style="width:100px; float:left;"> 
     <asp:TextBox ID="newPassText" runat="server" Width="200"></asp:TextBox> 
    </div> 
</div> 
<div style="width:100%; clear:both;padding-top:20px;"> 
    <div style="width:150px; float:left;"> 
     <asp:Label ID="Label1" runat="server" Text="Confirm New Password"></asp:Label> 
    </div> 
    <div style="width:100px; float:left;"> 
     <asp:TextBox ID="confirmNewPass" runat="server" Width="200"></asp:TextBox> 
    </div> 
</div> 
<div style="width:100%; clear:both;padding-top:20px;"> 
    <div style="width:150px; float:left;"> 
     <asp:Label ID="Label2" runat="server" Text="&nbsp;"></asp:Label> 
    </div> 
    <div style="width:207px; float:left;"> 
     <div style="float:left;"> 
      <asp:Button ID="changePass" runat="server" Text="Change" /> 
     </div> 
     <div style="float:right;"> 
      <asp:Button ID="cancelButton" runat="server" Text="Cancel" /> 
     </div> 
    </div> 
</div> 
<div style="width:100%; clear:both;padding-top:20px;"> 
    <div style="width:350px; float:left;"> 
     <asp:Label ID="successMessage" runat="server" Text="Passwords Changed.." ForeColor="Red" Font-Bold="true" Visible="false"></asp:Label> 
    </div> 
</div> 

ChangePassword.ascx.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

public partial class User_Controls_ChangePassword : System.Web.UI.UserControl 
{ 
    public delegate void ChangePasswordDelegate(object sender, ChangePasswordEventArgs e); 
    public event ChangePasswordDelegate ChangePasswordEvent; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     changePass.Click += new EventHandler(changePass_Click); 
    } 

    void changePass_Click(object sender, EventArgs e) 
    { 
     ChangePasswordEvent(sender, new ChangePasswordEventArgs(newPassText.Text, this)); 
    } 
} 


public class ChangePasswordEventArgs : EventArgs 
{ 
    private string _newPassword = ""; 
    private object _parent = null; 

public string NewPassword 
{ 
    get 
    { 
     return _newPassword; 
    } 
    set 
    { 
     _newPassword = value; 
    } 
} 

public object Parent 
{ 
    get 
    { 
     return _parent; 
    } 
    set 
    { 
     _parent = value; 
    } 
} 

public ChangePasswordEventArgs() 
{ } 

public ChangePasswordEventArgs(string pass , object parent) 
{ 
    _newPassword = pass; 
    _parent = parent; 
} 

}

Defau lt.aspx

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" 
CodeFile="Default.aspx.cs" Inherits="_Default" %> 

<%@ Register TagName="ChangePasword" TagPrefix="MY" Src="~/User Controls/ChangePassword.ascx" %> 
<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent"> 
</asp:Content> 
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent"> 
    <MY:ChangePasword ID="passControl" runat="server" /> 
</asp:Content> 

Default.aspx.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
{ 
    passControl.ChangePasswordEvent += new User_Controls_ChangePassword.ChangePasswordDelegate(passControl_ChangePasswordEvent); 
} 

void passControl_ChangePasswordEvent(object sender, ChangePasswordEventArgs e) 
{ 
    if (e.Parent != null) 
    { 
     User_Controls_ChangePassword cp = (User_Controls_ChangePassword)e.Parent; 
     cp.FindControl("successMessage").Visible = true; 
    } 
} 

}

+1

[こちら](http://www.codeproject.com/KB/cs/events.aspx) – Meysam

+0

ありがとうございました。代理人についての素晴らしい記事です。 – Arun

答えて

0

ありがとうMeysam。彼は私の質問に、代表者に関する非常に有用なリンクを付けてコメントしました。今私は代理人について、またEventArgについても明確な考えがあります。ここで、リンク、

http://www.codeproject.com/Articles/4773/Events-and-Delegates-Simplified

は、それはあまりにも他人を助けることを願っています。

0

あなたは、ラムダ式でデリゲートの使い方の良い例を見ることができます。 LINQでは頻繁に使用されます。

はこちらをご覧ください:

Lambda Expressions and Expression Treesはまた、あなたはthisポストを参照することができます。

あなたが提供した例は、(GUIおよび多くのための)カテゴリイベントハンドラ

を形成しているが、それがお役に立てば幸い!イベント処理のためのデリゲートの使用に関して

0

新代表者の明示的な使用を必要としない、これを使用したイベントの処理.NET 2.0

EventHandler<TEventArgs>

以来、それのための汎用的な解決策があります。

このイベント宣言は十分である:あなたのコードで

event EventHandler<ChangePasswordEventArgs> ChangingPassword; 

あなたが加入者に確認する必要がありますイベントを発生させるとき:

void changePass_Click(object sender, EventArgs e) 
{ 

    if(ChangePasswordEvent != null) 
     ChangePasswordEvent(sender, 
      new ChangePasswordEventArgs(newPassText.Text, this)); 
} 

あなたが加入者をチェックし、そこにいない場合が存在しない場合、イベントは例外をスローします。マルチスレッドアプリケーションでは、代わりにthis approachを使用する必要があります。


委譲するための一般的な使用については、「生」デリゲートはほとんど直接使用しないが、イベント、lambdas発現木は、基礎となるメカニズムとしてデリゲートを使用することです。私が作った代理人のための唯一の直接の使用は、イベント処理とasync operations using the Begin/EndInvoke patternのためのものです。

デリゲート、ラムダ、および匿名メソッドの説明については、this articleを参照してください。

関連する問題