Microsoft Visual Studio 2010 ortamında Framework 4.0 kullanarak yeni bir “web site”
projesi oluşturalım. İlgili ajax kütühanesini kurmuş olalım. Geliştireceğimiz mini
örnek uygulama gerçek projelerimizde kullanabileceğimiz türden olsun istiyoruz.
”Delegate” ve “Event” kavramları tam öğrenilmiş olarak kullanıldığında büyük kolaylıklar sağlar.
Delegate, metod tipi tanımlamak gibi düşünülebilir.
”Nasıl yani ?” dediğinizi duyar gibiyim. Şöyle:
-----------------------------------------------------------------------------------------------
int x; dendiğinde ne anlarız?
Hafıza da, int büyüklügünde ve tipinde bir alanı ifade eden x adında bir değişeken anlarız.
-----------------------------------------------------------------------------------------------
class bilgisayar
{
public string islemci;
public string anakart;
}
…
1. bilgisayar b1;
2. b1 = new bilgisayar();
3. b1.anakart = “intel”;
4. b1.islemci = “amd”
…
dendiğinde ne anlarız?
1. satirda, b1 adında pointer bir değiken vardır. Bu degisken “bilgisayar” tipinde bir alani
gosterecektir.
2. satir, içinde islemci ve anakart bilgilerini tutacak (bilgisayar tipinde) bir baska hafıza
alanı demektir.
 |
| Resim 1 : Class değişkeni |
-----------------------------------------------------------------------------------------------
Benzer şekilde delegate içeren bir örnek geliştirmek için projemizde anasayfamıza bir
adet button bir adet de label yerleştirelim.
 |
| Resim 2 : Button ve label görünümü |
|
01. using System;
02. using System.Collections.Generic;
03. using System.Linq;
04. using System.Web;
05. using System.Web.UI;
06. using System.Web.UI.WebControls;
07.
08. public partial class _Default : System.Web.UI.Page
09. {
10. public delegate string TarihiSoyle();
11. public delegate int Topla(int x, int y);
12.
13. public int sayiTopla(int x, int y)
14. {
15. return x + y;
16. }
17.
18.
19. protected void btnTopla_Click(object sender, EventArgs e)
20. {
21. Topla t1 = new Topla(sayiTopla);
22. LabelToplaSonuc.Text = t1(2, 3).ToString();
23. }
24.}
|
| Basit seviyede delegate kullanımı |
11. satırdaki public delegate int Topla(int x, int y);
ifadesi ile iki parametre alan Topla metodunu ifade edecek bir kavram tanımlıyoruz. Tıpkı yukardaki “bilgisayar” gibi.
13. public int sayiTopla(int x, int y)
14. {
15. return x + y;
16. }
SayiTopla metodu aşağıda açıklanan t1 tarafından kullanılacak gerçek metod. Yukardaki “intel” ifadesi gibi.
Buttona tıklayınca çalışacak kodumuz da aşağıdaki gibi olsun.
protected void btnTopla_Click(object sender, EventArgs e)
{
Topla t1 =
new Topla(sayiTopla);
LabelToplaSonuc.Text = t1(2, 3).ToString();
}
Burada t1 bir önceki örnekteki b1 değişeni gibi düşünülebilir. t1 değişkeni “Topla”
tipinin ifade edeceği metoda ulaşmayı sağlayacak değişkendir.
Delegate’in ne olduğunu anladığımıza göre konuyu biraz daha geliştirelim.
Projemize yeni bir sayfa ekleyerek uzerine yine bir button bir de label ekleyelim.
 |
| Resim 3 : Button ve label görünümü |
Projemize bir adet “toplaUC” adında web user kontrol ekleyelim.
Bu kontrolun üzerine TB1 ve TB2 adında iki adet “Textbox” ekleyelim. “btnTopla” adında da bir adet button ekleyelim.
 |
| Resim 4 : Toplama işini yapacak user control |
Bu user control’un arka tarafındaki kod aşağıdaki gibidir.
|
01. public partial class toplaUC : System.Web.UI.UserControl
02. {
03. public delegate void Topla(int x, int y);
04. public event Topla topla;
05.
06. protected void btnTopla_Click(object sender, EventArgs e)
07. {
08. int n1 = Convert.ToInt32(TB1.Text);
09. int n2 = Convert.ToInt32(TB2.Text);
10. topla(n1, n2);
11.
12. }
13. }
|
| User kontrol kodu |
03. public delegate Topla(int x, int y);
ifadesi ile Topla tanımlandı.
04. public event Topla topla;
ifadesi ile Topla işini yapacak bir “event” tanımlandı. Bu event istendiğinde çağırabilecektir.
Bu event’i çağırma işi burada btnTopla_Click içinde yapılmıştır.
10. topla(n1, n2);
ifadesi ile çağırma işlemi gerçekleştirilmiştir. Ancak çalışacak kod user control içinde değil bu user control’u
kullanan Default2.aspx sayfasındadır.
Projemizde ajax da kullanılacağından toolbox’tan masterpage üzerine bir adet “ScriptManager” sürükleyip bırakalım.
Daha sonra Default2.aspx’in html tarafının aşağıdaki hale getirelim.
|
<%@ Page Title="" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>
<%@ Register assembly="AjaxControlToolkit" namespace="AjaxControlToolkit" tagprefix="asp" %>
<%@ Register src="toplaUC.ascx" tagname="toplaUC" tagprefix="uc1" %>
<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<h2>Delegate Örneği - 2</h2>
<hr /><br />
<asp:Button ID="btnTopla" runat="server" onclick="btnTopla_Click"
Text="topla" /><asp:Label ID="LabelToplaSonuc" runat="server"></asp:Label>
<br /><hr />
<div style="height:0px; visibility:hidden">
<asp:Button ID="btnNewMsg" runat="server" Text="Yeni" />
</div>
<asp:ModalPopupExtender
ID="ModalPopupExtenderTopla" runat="server"
PopupDragHandleControlID="PanelHeaderTopla"
DynamicServicePath=""
BackgroundCssClass="modalBackground"
Enabled="True"
TargetControlID="btnNewMsg"
PopupControlID="PanelBodyTopla">
</asp:ModalPopupExtender>
<asp:Panel ID="PanelBodyTopla" runat="server" Width="580px" BackColor="#D3DEEF" BorderWidth="1px" BorderColor="Black">
<asp:Panel ID="PanelHeaderTopla" runat="server" BackColor="#8080FF" Height="30px"
Width="580px">
<table class="styleCloseBtn">
<tr>
<td style="width:565px">
<asp:Label ID="LabelTitle" runat="server" Font-Bold="True" ForeColor="White"
Text="Bilgi"></asp:Label>
</td>
<td align="right"><asp:Button ID="ButtonMsgClose" runat="server" Text="[x]"
/>
</td>
</tr>
</table>
</asp:Panel>
<uc1:toplaUC ID="toplaUC1" runat="server" />
<br />
<br />
</asp:Panel>
<br />
<hr />
</asp:Content>
|
| Default2.aspx html kodu |
Default2.aspx’in tasarım anı görünümü aşağıdaki gibi olacaktır.
 |
| Resim 5 : Default2.aspx’in tasarım anı görünümü |
Default2.aspx page_load eventine aşağıdaki mini kodu ekleyelim.
|
01. protected void Page_Load(object sender, EventArgs e)
02. {
03. toplaUC1.topla += delegate(int s1, int s2)
04. {
04. LabelToplaSonuc.Text = (s1 + s2).ToString();
05. };
06. }
|
| Default2.aspx sayfasında page_load kodu |
|
01. protected void btnTopla_Click(object sender, EventArgs e)
02. {
03. ModalPopupExtenderTopla.Show();
04. }
|
| Default2.aspx sayfasında btnTopla_Click kodu |
Bu çalışmada delegate ve event kavramları mini bir örnek ile aktarılmıştır.
Kaynak Kod