Gökhan Altınören
gokhan@altinoren.com
Windows için yazılım geliştirmek her zaman zevkli olmuştur, ne de olsa elinizin altında Visual Basic gibi becerikli ve hızlı bir araç ya da Visual C++ gibi güçlü ve detaylı bir platform vardır. Microsoft da yeni araçlar, SDK’lar ve mükemmel dökümantasyon ile her zaman yazılımcının yanındadır.
Web tabanlı yazılım geliştirmeye gelince işler biraz değişir. Her ne kadar dökümantasyon olarak yeterli olsa da, ilk göz ağrımız ASP ile yazılım geliştirmek biz yazılımcılar için o kadar da kolay değildir. Notepad dışında standart bir IDE yoktur. Yazdığınız kodu HTML’in içinden ayıklamak işkence gibi gelir. Hata yaptığınızda kodunuzu ‘debug’ etmek bir derttir. Kodunuzu tekrar kullanmak zordur ve bu liste uzayıp gider.
Daha doğrusu giderdi. ASP.NET ile birlikte kötü günler geride kaldı dersek pek de yanlış yapmış sayılmayız. Artık Visual Studio .NET ortamında (ya da ücretsiz Web Matrix’i kullanarak) VB.NET ya da C#.NET ile eskiden “keşke ASP’de de olsa” dediğimiz bütün araçlar ve dil özelliklerini kullanarak harikalar yaratmak için önümüzde hiç bir engel kalmamış gibi gözüküyor.
Bu yazıda, Visual Studio .Net ortamında C# kullanarak bir sunucu kontrolünü nasıl yazabileceğimizi inceleyeceğiz. Yeri geldiğinde nesne yönelimli programlamayla ilgili bilgiler de vereceğiz. Okuyucunun .Net ortamı hakkında temel bilgiye sahip olması, örneğin anlaşılması için yeterli olacaktır. İngilizce terimleri olabildiğince türkçe karşılıklarıyla birlikte vermeye çalıştım, terminolojide yapmış olabileceğim hatalar için şimdiden özür diliyorum.
Yazılımcıların yazdıkları kodu tekrar kullanması ya da başkaları tarafından yazılmış kodları kendi yazılımlarına eklemeleri için çok güzel bir çözüm olan ActiveX kontrolleri hepimiz biliyoruz. Aynı çözüm, ASP.NET için yazılım geliştirirken karşımıza kullanıcı kontrolleri (user controls) ve sunucu kontrolleri (server controls) olarak karşımıza çıkıyor. Kullanıcı kontrolleri ile ilgili bu sitede yer alan çok güzel makalelerden bilgi alabilirsiniz. Biz şimdi konumuz olan sunucu kontrollerine odaklanalım.
Visual Studio .NET ile birlikte, web tabanlı yazılım geliştirirken bize yardımcı olacak bir çok kontrol geliyor (Şekil 1). Eskiden veritabanından gelen kayıtları sayfada gösterebilmek için tekrar tekrar döngüler kurar, <tr> ve <td>’ler arasında kaybolurduk. Artık çok daha güzel ve fonksiyonel veri tablolarını DataGrid kontrolünü kullanarak çok daha kısa zamanda oluşturabiliyoruz. Tek satır kod yazmadan kullanabileceğimiz kullanışlı bir takvim (Calendar) kontrolümüz var. Veri girişi sırasında gerekli alanların doldurulup doldurulmadığını hem istemci hem de sunucu tarafında kontrol edebiliyoruz (RequiredfieldValidator, CompareValidator vs.)
Peki ama, tam da istediğimizi yapan bir kontrol yoksa ne yapmalıyız? İşte bu noktada Microsoft bize kendi kontrollerimizi yazma imkanını sunuyor.
HTML kullanarak bir link’i yeni pencerede şu şekilde açarız:
<a href="yenisayfa.htm" target="_blank">Yeni sayfa aç</a>
Aynı şeyi ASP.NET’in Hyperlink kontrolünü kullanarak yapalım:
<asp:HyperLink id="HyperLink1" runat="server"
NavigateUrl="yenisayfa.htm" Target="_blank">Yeni sayfa aç
</asp:HyperLink>
HTML ve JavaScript’i beraber kullanarak yeni açılacak pencerenin özelliklerini de belirtebiliriz. Örneğin, yeni pencerenin boyutlarını da belirlemek için:
<a href="yenisayfa.htm" target="_blank"
onclick="javascript:window.open(yenisayfa.htm,
pencere_adi,height=80,width=60);
return false;">Yeni sayfa aç</a>
Yine aynı şeyi ASP.NET kullanarak yapmak istersek... kendi kontrolümüzü yazmamız lazım. Hemen başlayalım.
Visual Studio .NET’i açıp File / New’den Project...’i seçelim. Visual C# Projects / Web Control Library’i seçip yeni projemize YeniPencere ismini verip OK’e klikleyelim (Şekil 2).
(Aynı işlem Visual Basic ile de yapılabilir. Bu makalede C# kullanıyoruz ama verilen kodlar Visual Basic’deki karşılıkları neredeyse aynıdır.)
(Şekil 2)
Öncelikle Visual Studio’nun bizim için yarattığı projeyi inceleyelim. Eğer kapalıysa, View’den Solution Explorer’ı açalım. Burada görülen AssemblyInfo.cs dosyası, kodumuz derlendiğinde oluşturulacak assembly’nin özelliklerini (versiyon numarası, telif bilgileri vs.) belirler. Bu bir deneme projesi olduğu için bu dosyayla ilgilenmeyeceğiz.
WebCustomControl1.cs dosyası, kullanabilmemiz için basit bir şablon kod içerir. Biz kendi kodumuzu adım adım oluşturmak istediğimiz için bu dosyayı üzerine sağ klikleyip Delete’i seçerek projemizden silebiliriz.
File / Add New Item... yapıp projemize YeniPencere.cs isimli yeni bir Class ekleyelim. Oluşturduğumuz class’ın üst kısmında referans namespace olarak sadece System olacaktır. Buraya şunları ekleyelim:
using System;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;
Namespace ve class tanımlamamızı da şöyle değiştirelim:
namespace YazGelistir
{
public class YeniPencere: HyperLink
public YeniPencere(): base()
}
Öncelikle, şu andan itibaren kontrolümüze Visual Studio .Net üzerinde herhangi bir dilde programatik olarak erişmek için onu YazGelistir.YeniPencere olarak çağırmamız gerekir. Bunun faydasını ileride bir grup altında toplayabileceğimiz birden fazla kontrolümüz olduğunda (mesela YazGelistir.Animasyon, YazGelistir.Oylama vs.) görebiliriz.
Yukarıdaki kod parçacığına baktığımız zaman, YeniPencere kontrolümüzün HyperLink kontrolünden türettiğimizi (inheritence) görürüz. Yeni kontrolümüzün bir ASP.NET HyperLink kontrolü gibi davranmasını ama bazı ek özelliklerinin de olmasını istiyoruz. HyperLink kontrolünden türettiğimiz için yeni kontrolümüz hem HyperLink kontrolünün tüm özelliklerini taşıyacak, hem de eklediğimiz özelliklerle daha gelişmiş bir kontrol olacak. Aynı şekilde
public class YeniPencere: Button
şeklinde bir class tanımlaması, kontrolümüzü Button kontrolünden türetmemizi ve tüm özelliklerini kullanabilmemizi sağlardı. DataGrid gibi gelişmiş kontroller dahil ASP.NET’de yer alan tüm kontrollerin bu yolla gelişmiş ya da ihtiyaçlarınız için özelleştirilmiş versiyonlarını yaratabilirsiniz.
Nesneye yönelik programlamada class’lar, nesnelerin yapılarının ve becerilerinin tanımlamalarıdır. Bu tanımlara uygun bir nesne (object) yaratıldığında (instantiation), .NET Framework eğer varsa class tanımlamalarında yer alan constructor kodunu çalıştırır. Burada, nesnemiz hayatına başlarken gerek duyacağı ön ayarlamalar yapılır da diyebiliriz.
Daha önce boş olarak tanımladığımız constructor’ın içini şu şekilde dolduralım:
Random ran = new Random(this.GetHashCode());
WindowName = "BrowserWindow_"+ ran.Next().ToString();