Hedefler - WordPress.com

advertisement
Modül 1: Programlamaya giriş
Hedefler
Â
Â
Â
Â
Â
Program nedir?
Programcı kimdir?
Programlama Dilleri
Programlama Dillerinin Tarihçesi
Programın Derlenmesi
Bu modülde, bir programcının bilmesi gerek temel programlama kavramlarına
giriş yapılacaktır. Bir programı oluşturan öğeler, çalışma süreci tamamlanana
kadar geçtiği aşamalar ayrı ayrı işlenecektir. Bu kavramlar programcının ve
programlama dillerinin tanımlanmasına yardımcı olacaktır.
Bu modülün sonunda:
•
Bir programın çalışma prensibini açıklayabilecek,
•
Programcı kavramını tanımlayabilecek,
•
Değişik programlama dillerinin gelişimini açıklayabilecek,
•
Derleme işlemini tanımlayabileceksiniz.
2
Modül 1: Programlamaya Giriş
Konu 1: Program nedir?
ƒ Bilgisayarın, bir işi yapması için tasarlanan
komutlar zinciri
ƒ Program Türleri
ƒ Sistem Programlar
ƒ Sürücüler (Driver)
ƒ Uygulamalar
Günümüzde bilgisayarların kullanım alanları büyük ölçüde artmıştır. Dolayısıyla
işlerimizi daha hızlı ve düzenli bir şekilde yapmamız, bilgisayarları ne kadar iyi
kullandığımıza bağlıdır. Bunun için ise, çeşitli amaçlara göre yazılan
programları kullanırız.
Program, bilgisayarın belli bir işi yapması için tasarlanan komutların tümüdür.
Kullanım amaçları ve yerlerine göre birçok değişik program türü vardır:
•
Sistem programları
Her program, bir işletim sistemi üzerinde çalışır. İşletim sistemi, diğer
programların çalışması için gerekli olan kaynakları ve ortamı sağlar.
•
Sürücüler (Driver)
İşletim sistemi ile donanım aygıtları arasında iletişim sağlayan programlardır.
Klavye ile yazılan yazıların algılanması için, klavyenin sürücü programı
kullanılır.
•
Uygulamalar
İşletim sistemi üzerinde çalışan, kullanıcıların ihtiyaç duyduğu işlevleri
sağlayan programlardır.
3
Konu: 1
Bir internet sitesini gezmek istediğimizde, Internet Explorer tarayıcısı
kullanılabilir. Bu uygulama, işletim sistemine sitenin istenilen sayfadaki yazı ve
resimleri almasını ister. İşletim sistemi, ağ kartıyla (Ethernet) sürücü programı
sayesinde internet sitesinin sunucusuna isteği gönderir.
(Ref: MOC 2667 Introduction to Programming - Module 1 - sayfa 3)
Programların çalışma modeli
ƒ Veri Girişi
ƒ İşlem
ƒ Sonuç
Kullanıcı
İşlem
Bilgisayar
Veri girişi
Printer
Sonuç
Programların kullanılmasındaki amaç, girilen bilgilerin işlenip istenilen şekilde
sonuçların üretilmesidir.
•
Veri girişi
Program, kullanıcıların veri girmesi ile başlar. Girilen veriler daha sonra
işlenmek üzere hafızada saklanır.
•
İşlem
Veriler, programın yazılma şekline göre bir dizi işlemden geçirilir.
•
Sonuç
İşlenen veriler kullanıcıya aktarılır.
Programlar, belli kurallar çerçevesinde yazılır. Bu yazım kuralları sayesinde
bilgisayar, programın işleyişini anlar ve gerekli sonuçları çıkartır. Yazılan
programlar, belirtilen yazım kuralları kontrol edilerek derlenir. Bu derleme işlemi
4
Modül 1: Programlamaya Giriş
sonunda, yazılan kaynak kodlar bilgisayarın anlayacağı tek dile çevrilir. Makine
dili denilen bu dil, sadece 1 ve 0 sayılarından oluşmaktadır.
Örnek:
1.
2.
3.
4.
5.
6.
7.
ATM makinesinden para çekmek
Kullanıcı ATM makinesine kartını yerleştirir
Şifresini girer.
ATM cihazında çalışan uygulama kartta yazan bilgileri okur
Şifre kontrolü işlemi yapılır.
Şifre doğru girilmişse kullanıcı çekmek istediği miktarı girer.
Bankadaki hesap kontrol edilir.
Uygunsa kullanıcıya ödeme yapar.
Konu 2: Programcı Kimdir?
ƒ Belirli işlevlere sahip programlar geliştirir
ƒ Kullanılan teknolojiyi, platformu iyi
tanıması gerekir
ƒ Programcı türleri
ƒ Mimar
ƒ Geliştirici
ƒ Test Mühendisi
Programcı, belirli işlevlere sahip programlar geliştirebilen uzmanlardır. Bir
programcının, üzerinde çalıştığı platformu, kullandığı teknolojileri iyi tanıması
ve bilgisayarın anlayacağı mantıksal dilde düşünebilmesi gerekmektedir.
Programcıların çoğu genellikle aynı işi gerçekleştirse de, üstlendikleri görevlere
göre üç gruba ayrılabilir:
•
Mimar
Programların yazılması için gerekli teknolojileri belirleyen, gerekli durumlarda
programın daha kolay yönetilmesi için küçük parçalara ayıran programcıdır.
5
Konu: 1
•
Geliştirici
Programı yazan kişidir.
•
Test mühendisi
Programın geliştirilmesi aşamasında,
geliştiricilere raporlayan programcıdır.
hatanın
kaynaklarını
bulan
ve
(Ref: MOC 2667 Introduction to Programming - Module 1 - sayfa 9)
Konu 3: Programlama Dilleri
ƒ Programcı ile bilgisayarın haberleşmesini
sağlar
ƒ Programlar 1 ve 0 sayılarından oluşan
makine diline çevrildikten sonra çalıştırılır
ƒ Programlama Dilinin özellikleri:
ƒ Sözdizimi (Syntax)
ƒ Gramer
ƒ Semantik
ƒ 2500’den fazla programlama dili
mevcuttur.
Dünyada konuşulan her dilin amacı iletişim sağlamaktır. Farklı kültürlerden
insanların anlaşabilmesi için ortak konuştukları bir dil gerekir. Programla
dillerinin amacı da bilgisayar ile programcının haberleşmesidir. Programcı,
bilgisayara hangi komutların çalıştırması gerektiğini bilgisayarın anlayacağı
dilden konuşarak söyler.
Bilgisayarda, programlar makine diline çevrildikten sonra çalışır. 1 ve 0
sayılarından oluşan bu makine dili, en alt seviye dildir. Dolayısıyla programların
bu dilde yazılması oldukça zordur. Programcılar konuşma diline daha yakın,
kolay anlaşılabilecek diller kullanmaktadır. Bu dillere yüksek seviye programla
dilleri denir. Programlama dillerinin seviyeleri makine diline yakın olup
olmaması ile ölçülür.
6
Modül 1: Programlamaya Giriş
Bir programlama dili şu unsurlardan oluşur:
•
Söz dizimi (Syntax)
Bir dil, kendine ait kelimeler ile konuşulur. Programlama dillerinin de benzer bir
davranışı vardır. Programlama dillerindeki bu kelimeler, programlama dilinin
anahtar kelimeleridir - komutlarıdır.
•
Gramer
Programlama dillerini kullanmak için sadece kelimeleri bilmek yeterli değildir.
Eğer anlamlı bir şekilde bir araya getirilemiyorsa, bu kelimeler hiçbir anlam
ifade etmez.
•
Semantik (anlamsal)
Bir dili, kelimeleri doğru bir gramer kullanımı ile bir araya getirerek kullanabiliriz.
Ancak konuşulan kelimelerin ne için kullanıldığı da önemlidir. Bir programlama
dilinin özelliklerinin nasıl ve ne için kullanıldığı da, bu dilin semantiğidir.
Örneğin bir finans programı, Yeni Türk Lirası cinsinden bir miktarı dolara
çevirecektir. Yapılacak işlem o andaki parite değerini merkez bankasından
çektikten sonra, girilen miktarı bu değerle çarpıp kullanıcıya göstermektir.
Kullanılan programlama dili ÇARP, GÖSTER, EŞİTLE komutları ile bu işlemi
gerçekleştirecektir.
ÇARP EŞİTLE GÖSTER miktar parite sonuç
Bu şekilde yazılan program söz dizimi açısından doğrudur. Girilen veriler ve
komutlar dışında, programlama dilinin anlamayacağı bir kelime
kullanılmamıştır. Ancak komutlar yanlış sırada kullanılmıştır. ÇARP komutu
hangi sayıları çarpması gerektiğini bilemeyecektir.
parite EŞİTLE sonuç ÇARP miktar
GÖSTER parite
Komutları ve değişkenleri, programlama dilinin gramerine göre doğru yerlerde
kullanmamız gerekir. Bu şekilde kullanılan komutlar doğru bir şekilde çalışır.
Fakat GÖSTER komutunun ne için kullanıldığı yani semantiği de önemlidir.
İstenilen, miktar ile pariteyi çarpmak, sonuca eşitlemek ve sonucu göstermektir.
sonuç EŞİTLE miktar ÇARP parite
GÖSTER sonuç
(Ref: http://www.cs.sfu.ca/~cameron/Teaching/383/syn-sem-prag-meta.html)
Şu ana kadar 2500’den fazla programlama dili yazılmıştır.
http://www.oreilly.com/pub/a/oreilly/news/languageposter_0504.html)
(Ref:
7
Konu: 1
Bunlardan bazıları Pascal, Basic, C, C++, Java, Javascript, Cobol, Perl,
Python, Ada, Fortran, Visual Basic .NET, Microsoft Visual C# programlama
dilleridir.
Yüksek seviye programlama dillerine Visual Basic .NET, Microsoft Visual C++
dillerini örnek verebiliriz. C ile işletim sistemi yazılabilindiğinden daha alt seviye
bir dil olarak değerlendirilir.
Programlama Dillerinin Tarihçesi
ƒ Makine dili 10110110, 11011110
ƒ Yordamların (Subroutine) ve
Kütüphanelerin (Library) oluşması
ƒ 1957 FORTRAN
ƒ 1959 COBOL
ƒ 1968 Pascal
ƒ 1972 C
ƒ Nesneye Yönelik Programlama Dilleri:
C++, JAVA
ƒ 2000 .NET
Visual Basic .NET, Visual C#
Bilgisayarlar, icat edilmeleriyle birlikte belli bir işi yapmak için bir dizi komutlara
ihtiyaç duymuşlardır. En başta çok basit işlemler yapan bu komutlar zamanla
nesneye yönelme (object orientation) gibi ileri seviyede özellikler kazanmıştır.
İlk programlama dilleri, bilgisayarların üzerinde bazı araçların yerlerini
değiştirerek veya yeni bileşenler eklenerek yapılıyordu. Programın işlemesi için
bir devinime ihtiyaç vardı. Eskiden programlar fiziksel olarak yazılıyordu. Daha
sonra fiziksel programlama yerini elektrik sinyaline bıraktı. Artık, kurulan
elektronik devrelere düşük ya da yüksel voltajda akım gönderilerek bilgisayarın
davranışı belirlenmeye başlandı. Yüksel voltaj 1, düşük voltaj 0 sayılarını ifade
ediyordu. Böylelikle bugün de kullanılan makine dilinin ortaya çıkması için ilk
adımlar atılmış oldu.
Ancak bu şekilde programlar yazmak, sistemi oluşturan elektronik devrelerin
her program için baştan kurulmasını gerektiriyordu. Böylelikle programlar bazı
8
Modül 1: Programlamaya Giriş
kavramlar çerçevesinde yazılmaya başlandı. Öncelikle bilgisayar donanımı her
program için baştan kurulmamalı, bunun yerine basit bir donanımın üzerine
yazılan komutlar kullanılmalıdır. Daha sonra, programlar tek bir komutlar zinciri
yerine, küçük parçalar halinde yazılmalıdır. Bu parçaların programın içinde
defalarca kullanılabilmesi yordam (subroutine) kavramını ortaya çıkarmıştır. Bu
modelin kullanılması ise mantıksal karşılaştırmaları, döngülerin kullanılmasını
ve yazılan kodlar tekrar kullanıldığı için kütüphane (library) mantığını ortaya
çıkarmıştır.
1957 yılında IBM, düşük seviye (makine diline yakın) bir programlama dili olan
FORTRAN dilini ortaya çıkardı. FORTRAN ile beraber basit mantıksal
karşılaştırmalar, döngüler, (true-false) lojik ve (integer, double) sayısal
değişkenler kullanılmaya başlandı.
1959 yılında, bu programlama dilinin özelliklerini alıp, giriş çıkış (Input – Output
IO) gibi yeni işlevler sağlayan COBOL dili ortaya çıktı. Daha sonra 1968
yılında, COBOL ve FORTRAN dillerinin en iyi özelliklerini alarak Pascal ortaya
çıktı. Ayrıca Pascal dili, hafızadaki adresler üzerinde işlem yapmaya olanak
veren işaretçi (pointer) kavramını beraberinde getirdi.
1972 yılında C, Pascal dilindeki birçok hatayı gidererek ortaya çıktı. C dili ilk
defa Unix işletim sistemini yazmak için kullanılmaya başlanmıştır. C, düşük
seviye bir dil olması, kuvvetli giriş çıkış işlemleri sağlaması gibi birçok özelliği ile
işletim sistemleri yazılmasında tercih edilmiştir.
Bütün programlama dilleri birçok özelliğe sahip olmasına rağmen, modüler
programlamanın birçok eksiğini gidermek amacıyla, yeni bir programlama
modeli olan nesneye yönelik programlama - OOP (object oriented
programming) ortaya çıkarıldı. C dilinin ve OOP modelinin tüm özellikleriyle
C++ dili oluşturuldu.
C++ dilini, Sun Microsystems tarafından çıkartılan Java takip etti. Java dilinin
kullanım alanları, nesneye yönelik bir programlama dili olması ve beraberinde
getirdiği çöp toplama GC (garbage collection) gibi performans arttırıcı özellikleri
ile büyük ölçüde genişledi.
Microsoft, 2000 yılında .NET platformunu sunarak, otuzdan fazla programlama
dilini aynı çatı altına topladı. VisualBasic.NET ve VisualC# .NET platformunu
kullanan günümüzdeki en güçlü yüksek seviyeli programlama dilleri arasında
yer almışlardır. .NET platformu hakkında daha detaylı bilgi için Modül 2’ye
bakın.
(Ref:
http://www.princeton.edu/~ferguson/adw/programming_languages.shtml)
9
Konu: 1
Konu 4: Programın Derlenmesi
ƒ Programlama dili derleyicisi:
Gramer ve söz dizimi kontrolü
Kaynak kodların makine diline çevrilmesi
ƒ Makine diline çevrilen kodların çalıştırılması
Kaynak Kod:
Derleme
Makine Dili:
0110101010
1101010101
1010101111
Çalıştırma
Sonuç
Programlar yazıldıktan sonra, çalışmaya uygun hale getirilene kadar bir dizi
işlemden geçer. Bu işlemi gerçekleştiren, programlama dilinin derleyicisidir.
(Compiler)
•
Programlar, bir programlama dilinin gramer ve söz dizimi yapısına uygun bir
şekilde yazılır.
•
Yazılan kodlar o dilin derleyicisi tarafından kontrol edilir.
•
Kontrol işleminden sonra, bu kodlar bilgisayarın anlayacağı makine diline
çevrilir. Ancak bir yazım ve ya mantık hatası varsa, programcıya gerekli hata
mesajını verilerek derleme işlemi iptal edilir.
•
Makine diline çevrilen kodlar çalıştırılır.
10
Modül 1: Programlamaya Giriş
Modül Sonu Soruları & Alıştırmalar
Özet
Â
Â
Â
Â
Â
Program nedir?
Programcı kimdir?
Programlama Dilleri
Programlama Dillerinin Tarihçesi
Programın Derlenmesi
1. Var olan bir metin dosyasını (.txt) görüntülemek için Notepad programını
kullanabiliriz. İşletim sistemi, dosyayı kullanıcılara göstermek için monitör ile
iletişim kurar. Monitör işletim sisteminden gelen verilerle gerekli görüntüleme
işlemlerini yapar.
Bu senaryodaki program çeşitlerini belirtin.
2. Bir arkadaşımıza e-posta yollamak istediğimizde, e-posta adresi, konu,
mesaj bilgilerini gireriz. Daha sonra e-posta uygulaması mesajımızı verilen
adrese yollar.
Programın çalışma modelinin aşamalarını belirtin.
3. C dilini kullanarak yazdığınız kodların bilgisayar tarafından çalıştırılabilir
hale gelmesi için hangi aşamaların gerçekleşmesi gerekir?
Modül 2: Microsoft .NET Platformu
Microsoft .NET, uygulama geliştiricilerin yazılım geliştirme sürecinde altyapı
işlemleri için harcadığı eforu en aza indirgemek ve daha güvenli, güvenilir ve
sağlıklı uygulamalar geliştirebilmelerini sağlamak için geliştirilmiş altyapıdır.
Bu modülü tamamladıktan sonra
•
Microsof.NET platformu hakkında genel bilgi sahibi olacak,
•
.NET Framework ve bileşenlerini açıklayabilecek,
•
Microsoft .NET platformunun yazılım geliştiricilere sunduğu avantajları
tanımlayabileceksiniz.
Konu 1: Yazılım Geliştirme Dünyası
Microsoft 1975 yılında Bill Gates ve Paul Allen tarafından kurulduğunda
vizyonu “Her eve, her masaya bir PC” idi. Donanım ve yazılım alanlarındaki
gelişmelerin hızı ve birbirlerini sürekli tetiklemesinin sonucunda bilgisayar
kullanıcı sayısı hızla arttı. Artan kullanıcı sayısı beraberinde yeni gereksinim ve
talepleri ortaya çıkardı. Bu taleplerin doğal sonucu olarak da farklı platformlar
ve farklı servis sağlayıcıları ortaya çıktı. İletişim, finansal hizmetler, ticaret,
eğlence kullanıcıların (özellikle internetin yaygınlaşmasıyla birlikte) en yoğun
talep gösterdiği hizmetler halini aldı. Günümüze baktığımızda Microsoft’un
çıkış noktasındaki hedefine büyük oranda ulaştığını görebiliyoruz. Ancak
geldiğimiz noktada hızla artan bilgisayar ve internet kullanıcı sayısı,
beraberinde güvenlik, iletişim, entegrasyon v.b. alanlarda çeşitli engellerin
ortaya çıkmasına neden oldu.
Gelişmelere kendi açımızdan, yani yazılım geliştiriciler açısından baktığımızda
işler çok daha zor ve zahmetli durumda. Kurumsal uygulamaların
geliştirilmesinde performans, güvenlik, süreklilik gibi konularda belirli bir
seviyeyi yakalamak için oldukça fazla efor sarfetmemiz gerekiyor. Örneğin
elektronik cihazlarla soket iletişimi kuracak uygulamaları geliştirebilmek için iki
alternatifimiz var. Birincisi 3. parti firmalar tarafından geliştirilmiş olan bileşenler
satın almak ve uygulamamıza entegre etmek. Diğer alternatifimiz ise oldukça
uzun sürecek bir kodlama ile benzer bir iletişim katmanını geliştirmek. Her
ikiside firmaların birinci tercihi olmayacaktır. Sorunumuz sadece soket iletişimi
noktasında değil elbette. Bölümün başında da belirttiğimiz gibi güvenlik,
performans, yetkilendirme gibi pek çok konuda uygulama geliştiriciler oldukça
zahmetli altyapı kodlarını geliştirmekle uğraşmak zorunda kalıyor. İşin kötü
yanı geliştirilen bu altyapı kodları çoğu zaman istenilen verimliliği sunmaktan
oldukça uzak kalıyor. Kabul etmemiz gereken şey, bu altyapı kodlarını
geliştirecek bilgiye sahip olmadığımız, sahip olsak bile altyapı kodlarını
yazacak zamana ve iş gücüne sahip olmadığımız, zaman ve iş gücü
konusundaki ihtiyaçlarımızı karşılayabilsek bile bu kodların testi, güvenliği,
güvenilirliği, performansı ve uygulamalara entegrasyonu konusunda hiç bir
2
Modül 1: Programlamaya Giriş
zaman istenilen düzeye ulaşamayacağımızdır. Keşke ihtiyaç duyduğumuz tüm
altyapı işlemleri için hazır, kullanımı kolay ve esnek bir platform olsaydı.
Hayalini kurduğum aslında şöyle bir sistem:
“Bir sanal mağazada cep telefonlarından sorumlu departmanda satış müdürü
olarak çalışıyorsunuz. İş dışındasınız ve akıllı cihazınıza bir mesaj geliyor:
“Henüz piyasaya yeni çıkmış olan telefonumuz inanılmaz satışlar yapıyor,
telefon çok popüler ve stoklarınızda oldukça azalmış durumda.” Bu mesajın
hemen ardından akıllı cihazınız üzerinden, şirketiniz için fiyat ve teslim zamanı
açısından en uygun olan tedarikçiyi bulup ihtiyacınız kadar telefonu sipariş
edebiliyorsunuz. Peki ya bu koşullar altında çalışmıyor olsaydınız?
Şirketinizden sizi cep telefonunuzdan arayacaklar ve problemi ileteceklerdi.
Sonra da siz şirketinize ancak dönebildiğiniz zaman tedarikçilerle teker teker
irtibata geçerek hangisinin şirketiniz için en yararlı olduğuna karar verecektiniz.
Sipariş ve teslimat bilgileri üzerinde anlaştıktan sonra işleminizi tamamlamış
olacaktınız. Yani sadece bir kaç dakikada yapabileceğiniz basit bir işlem için
belki de bütün bir gününüzü kaybedecektiniz. Verimliliğiniz düşerken
zamanınızı etkili şekilde kullanamayacaktınız. Oysa akıllı cihazınız üzerinden
tüm bu işlemleri kısa bir şekilde çözebildiğinizden işe gitmenize bile gerek
kalmadan zamanınızı en az şekilde kullanarak şirketiniz için en iyi olan seçimi
yapabilirsiniz.”
Kesinlikle işler çok daha verimli ve kolay ilerlerdi.. Elbette bu kurulabilecek
hayallerin sadece mobil platforma yönelik bölümünden bir kesit.
3
Konu: 1
Sorunun Temeli
Microsoft, vizyonu doğrultusunda attığı adımların yazılım geliştiricilere yansıyan
sonuçlarını sürekli izliyordu ve yazılım geliştiricilerin sorunlarını şu başlıklar
altında ele alıyordu.
•
Uygulamaların, sistemlerin ve kurumlardaki birimlerin ve farklı
kurumların arasındaki iletişim sorunu.
•
Çalışanların ihtiyaç duydukları verilere, ihtiyaç duydukları an,
kesintisiz, hatasız ve güvenli bir şekilde ve istedikleri platformdan
erişebilmeleri.
•
Uygulama geliştirme sürecinde, geliştiricilerin altyapı kodları ile
uğraşması ve bunun sonucunda uygulama geliştirme ve test süresinin
uzaması.
•
Bir uygulamanın farklı platformlarda çalıştırılabilmesi için aynı işlemleri
gerçekleştirecek kodların tekrar tekrar yazılması ihtiyacı.
Microsoft 1990 yılında, yaşanacak 10 yılıda öngörerek bu ve benzeri sorunlara
çözüm sunacak, uygulama geliştiricilerin ve son kullanıcıların işlerini
kolaylaştıracak bir platform geliştirmeye başladı. Microsoft bu platforma
öylesine inanıyorduki kaynaklarının %80’inden daha fazlasını, yani kaderini bu
platforma bağlamıştı. Çok geniş bir analiz ve geliştirme ekibinin çalışmalarının
sonucunda ortaya çıkan ürün 2000 yılında dünyaya sunulduğuna insanların
karşılarında gördükleri yapı karşısında hissettiklerini tanımlamak için
kullanılabilecek en uygun kelime; “Hayranlık”tı.
Microsoft.NET Platformu her türlü yazılım geliştirme ihtiyacına yönelik hazır bir
altyapı sunarak uygulama geliştiricilerin windows, web ve mobil platformlara
yönelik uygulamaları, çok daha hızlı, kolay ve güçlü bir şekilde
geliştirebilmelerine olanak tanıyordu. Uygulama geliştiriciler şifreleme, kimlik
doğrulama, yetkilendirme, soket iletişimi, her türlü veri kaynağına yönelik
veritabanı işlemleri, xml ve web servisi teknolojilerine kadar burada
saymadığımız (editörler bir modülün 100 sayfayı geçmesine pek sıcak
bakmıyorlar) ve hatta milyonlarca sınıf ve fonksiyonları hazır şekilde
karşılarında gördüler. Bu güne kadar günler, haftalar ve hatta aylar harcayarak
geliştirmeye çalıştıkları bu yapıların hepsini karşılarında kullanıma hazır bir
şekilde görmekten de son derece memnunlardı.
Modül 3: Microsoft Visual Studio Arayüzü
Hedefler
Â
Â
Â
Â
Â
Â
Â
Visual Studio çalışma ortamı
Start Page
Menüler
Solution Explorer Paneli
Toolbox Paneli
Properties Paneli
Help Kullanımı
Bu modül, Microsoft Visual Studio ara yüzünü tanımayı sağlar ve etkili bir
biçimde kullanmayı gösterir. Ev ve iş yerindeki çalışma ortamını düzenlemek
daha verimli çalışmayı sağlar. Yazılım geliştirilirken de çalışılan ortamı tanımak
ve kişiselleştirmek rahat çalışılması açısından önemlidir.
Bu modülü tamamladıktan sonra:
•
Microsoft Visual Studio çalışma ortamını tanıyacak,
•
Menülerin işlevlerini açıklayabilecek,
•
Başlangıç sayfasının özelliklerini kullanabilecek,
•
Solution Explorer, Toolbox, Properties panellerini tanıyacak,
•
Microsoft Visual Studio Yardımı etkili bir şekilde kullanabileceksiniz.
2
Modül 3: Microsoft Visual Studio Arayüzü
Konu 1: Visual Studio Çalışma Ortamı
ƒ Visual Studio bir dosya editörüdür
ƒ Çalışma Sayfaları
ƒ Sekmeler halinde gösterilir
ƒ Araç Çubukları
ƒ Menü komutlarına görsel ara yüz
ƒ Özel araç çubukları tanımlanabilir
ƒ Menüler
ƒ Paneller
ƒ Sabitlenebilir, Kayan, Gizlenebilir pencereler
Visual Studio, çok gelişmiş özelliklere ve yardımcı araçlara sahip bir dosya
editörüdür. .NET platformu üzerinde geliştirilen proje dosyaları dışında metin
dosyaları, sql, rtf uzantılı dosyalar da düzenlenebilir. Visual Studio ortamını
oluşturan ve kullanımını kolaylaştıran dört ana bileşen vardır:
•
Çalışma Sayfaları (Tab Pages)
Visual Studio ortamında dosyalar, birer çalışma sayfası olarak açılır. Bu
dosyalar sekmeler halinde sıralanır. Sayfalar arasında CTRL-TAB kısa yolu ile
geçiş yapılır.
Bu çalışma modelinde, sadece bir sayfa görünür ve üzerinde çalışma yapılır.
Ancak Visual Studio bize, çalışma ortamını parçalara bölme imkânı verir.
Örnek:
o
o
o
Visual Studio çalışma ortamını açın. Başlangıç sayfası karşınıza
çıkar. (Eğer başlangıç sayfasını göremiyorsanız, Help menüsünden
Show Start Page komutunu seçin)
View menüsünden, Web Browser alt menüsüne işaret edin ve Show
Browser komutunu seçin. Visual Studio açmak istediğimiz Internet
tarayıcısı için yeni bir sayfa oluşturur.
CTRL tuşuna basılı tutarak TAB tuşuna basın. Açtığınız Internet
tarayıcısından başlangıç sayfasına döner.
3
Konu: 1
o
o
Başlangıç sayfasına sağ tıklayın ve çıkan menüden New Vertical
Tab Group komutunu seçin. Visual Studio birden fazla sayfa
üzerinde çalışma imkânını, sayfaları “sekme gruplarına” ayırarak
sağlar.
Başlangıç sayfasını, sayfa başlığına basılı tutarak, Internet
tarayıcısının bulunduğu sekme grubuna taşıyın.
İPUCU: Visual Studio ortamını bir web tarayıcısı olarak kullanabilirsiniz.
•
Araç Çubukları (Toolbars)
Visual Studio, menü komutlarını için görsel kısa yolları araç çubukları ile sunar.
Benzer işlemler için kullanılan komutlar bir araç çubuğunda gruplanır. Örneğin
Standart araç çubuğu, yeni dosya oluşturmak, bir dosyayı açmak - kaydetmek
gibi genel dosya işlemleri için kullanılır.
Araç çubukları, varsayılan olarak menülerin altında bulunur. Ancak çubukları
taşınarak yerlerini değiştirebilir veya kayan duruma getirilebilir. Ayrıca istenen
çubuklar saklanılabilir veya gösterilebilir. Araç çubuklarını listesini görmek için
View menüsünden Toolbars alt menüsüne işaret edin.
Visual Studio bize kendi araç çubuklarımızı oluşturma imkânı da verir. Farklı
işlevlere sahip komutlar gruplanıp, kişisel araç çubuğu oluşturulabilir.
Örnek:
o
o
o
o
Başlangıç sayfasının üstündeki bir araç çubuğuna
sağ tıklayın. Çıkan menü, var olan tüm araç
çubuklarını listeler. İşaretli olan çubuklar eklenmiş
çubuklardır. Bu listeden Web araç çubuğunu seçin.
Web araç çubuğu üzerine çift tıklayın. Bu işlem
çubuğu floating (kayan menü) duruma getirir.
Tekrar çift tıklandığında, çubuk Dockable (sabit
duruma) gelir.
Araç çubuğuna sağ tıklayın. Listenin en altındaki
Customize (özelleştir) komutunu seçin.
Toolbars sekmesinde New (yeni) komutuna tıklayın.
Çıkan pencerede çubuğa “Genel İşlemlerim” yazın.
Ok tuşuna basın. Visual Studio verilen isimde bir
araç çubuğu oluşturur ve kayan durumda
görüntüler.
4
Modül 3: Microsoft Visual Studio Arayüzü
o
Commands (komutlar) sekmesinde, Categories
(kategoriler) listesinden Help kategorisini seçin. Bu
listenin yan tarafında bulunan Commands listesinden
Index komutunu bulun. Bu komutu taşıyıp,
oluşturduğumuz “Genel İşlemlerim” araç çubuğuna
bırakın.
Bu şekilde şu komutları da ekleyin.
Categories
Commands
Tools
File
View
Window
Options
Exit
Show Web Browser
Close All Documents
o
o
Araç çubuğunu, çalışma ortamının altına taşıyarak sabitleyin.
Araç çubuğuna sağ tıklayın ve listeden “Genel İşlemlerim” çubuğunu seçerek
çalışma ortamından kaldırın.
•
Menüler
Birçok çalışma ortamının yaptığı gibi Visual Studio da, benzer öğeler üzerinde
işlevleri olan komutları menüler halinde gruplar. Araç çubuklarından farkı sabit
5
Konu: 1
olmaları ve özelleştirmeye açık olmamalarıdır. Menüler bu modülde detaylı
olarak ele alınacaktır.
•
Paneller
Paneller, Visual Studio içindeki pencerelerdir. Çalışma ortamında birçok panel
bulunmasıyla beraber, Solution Explorer, Toolbox, Object Browser, Properties,
Watch, Output, Search Result, Task List gibi sıkça kullandığımız paneller
vardır.
İPUCU: Görmek istenilen paneller View menüsünden seçilebilir.
Paneller, Visual Studio ortamı içersinde istenilen yere taşınabilir veya
sabitlenebilir. Panellerin birkaç genel özelliği vardır:
o Auto Hide (Otomatik Gizle):
Panelin, fare üzerindeyken gözükmesi ve fare çekildikten sonra gizlenmesidir.
o Dockable (Sabitlenebilir):
Panelin, Visual Studio ortamı içersinde bir yerde sabitlenebilme özelliğidir.
o Floating (Kayan):
Kayan paneller herhangi bir yere sabitlenemez. Ancak her sayfanın üstünde
durur ve böylece sürekli görünür.
Panellerin bu özellikleri Window menüsünden erişilebilir.
Örnek:
o
View menüsünden Other Windows alt menüsünü işaret edin ve
Favorites panelini seçin. Panelin başlığında, biri Auto Hide diğeri
Close olan iki düğme görülür.
o
o
o
o
Auto Hide düğmesine basarak paneli gizleyin.
Paneli tekrar seçin, Window menüsünden Auto Hide özelliğini
seçin. Daha sonra aynı menüden Floating özelliğini seçin. Panelin
taşınabildiği ancak sabitlenemediği görülür.
Panel seçili iken, Window menüsünden Dockable özelliğini seçin. Bu
sefer panelin, taşındığı zaman çalışma ortamının herhangi bir yerine
sabitlenebildiği görülür.
Panel seçili iken, Window menüsünden Hide komutunu seçin. Paneli
tekrar açmak için bu etapları tekrarlayın.
6
Modül 3: Microsoft Visual Studio Arayüzü
Konu 2: Start Page
ƒ Visual Studio ortamının başlangıç
sayfasıdır
ƒ Projects
ƒ Oluşturulan Visual Studio projeleri listesi
ƒ Online Resources
ƒ İnternet üzerindeki kaynaklar
ƒ Kod örnekleri, güncellemeler, makaleler
ƒ My Profile
ƒ Çalışma şekline göre özel ayarlar
Visual Studio Çalışma ortamını açtığımız zaman karşımıza ilk gelen başlangıç
sayfasıdır. Bu sayfa üç bölümden oluşur.
•
Projects
O ana kadar çalıştığınız projeleri gösterir. Bu menüden son projelerinizi
açabilirsiniz. Son projelerde gözükmeyen bir proje (Open Project) veya yeni
bir proje (New Project) açabilirsiniz.
•
Online Resources
Bu bölümde örnek uygulamalar (Find Samples) ipuçları bulabilir, en yeni
teknolojileri, güncellemeleri veya en son eklenen haberleri takip edebilir, MSDN
kütüphanelerinde kod örnekleri, makaleler araştırabilirsiniz.
•
My Profile
Bu bölümde çalışma şeklinize göre bir profil seçebilirsiniz. Profiller; kullanılan
kısa yollara, panellerin yerlerine ve görünümlerine, Visual Studio yardımını
kullanırken
yapılan
filtrelemeye
göre
değişir.
Örneğin, profili Visual C# Developer olarak ayarlarsak Dynamic Help paneli,
sayfaların sağ tarafında çivili olarak durur. Yardım panelinde bir arama yapmak
istediğimizde ise, sonuçlar Visual C# filtresine göre çıkar. Ayrıca Solution
Explorer paneli CTRL-ALT-R kısa yolu ile açılır.
7
Konu: 1
Görünüm, kısa yollar ve yardım filtresi birbirinden bağımsız olarak da
ayarlanabilir. Bu durumda seçilen profil, custom (özel) olarak gözükecektir.
At
Startup seçeneklerinden, Visual Studio açılırken hangi pencerenin
gözükeceğini belirleyebilirsiniz. Örneğin, başlangıçta en son çalıştığınız
projenin açılmasını istiyorsanız, “Load last loaded solution” seçeneğini tercih
etmelisiniz.
İPUCU:
Giriş sayfasını kapattıktan sonra, Help menüsünden Show Start Page
seçeneğine tıklayarak açabilirsiniz.
8
Modül 3: Microsoft Visual Studio Arayüzü
Konu 3: Menüler
ƒ Birçok uygulamada kullanılan benzer
menü görünümü
ƒ File, Edit
ƒ Dosya, metin düzeni işlemleri
ƒ View, Window
ƒ Paneller, çalışma sayfaları görünümleri
ƒ Project, Build, Debug
ƒ Proje, derleme ve hata ayıklama işlemleri
ƒ Tools, Help
ƒ Yardımcı araçlar, yardım seçenekleri
Visual Studio menüleri birçok uygulamanın menülerine benzer niteliktedir.
Menü isimlerinde, belirli bir harfinin altı çizilmiştir. Belirtilen harfler ALT tuşu ile
birlikte basıldığında, o menülere kısa yolla ulaşılır. Menü komutlarının
bazılarında ise, sadece o komuta özel bir kısa yol tanımlıdır. Bu kısa yollar
CTRL veya SHIFT gibi birkaç tuş kombinasyonu ile gerçekleşir.
•
File (Dosya)
Tüm dosya işlemleri bu menü altındadır. “Standart” araç çubuğu ile bu
menüdeki bazı komutlara ulaşılır. File menüsündeki komutlar ile:
o Yeni bir proje, bir dosya veya boş bir solution (çözüm) oluşturmak,
o Oluşturulmuş bir projeyi veya var olan bir dosyayı açmak,
o Web üzerinde paylaştırılmış dosya veya projeler açmak,
o Açık olan dosya veya projeleri kapatmak,
o Recent Files (en son kullanılan dosya veya projeler) açmak,
o Dosyaları kaydetmek, yazdırmak mümkündür.
•
Edit (Düzenle)
Tüm yazı düzenleme işlemleri için, bu menüdeki komutlar kullanılır. “Text
Editor” araç çubuğu da bu menünün komutlarına kısa yoldur. Edit
menüsündeki komutlar ile:
o Copy, Cut, Paste, Delete, Select All gibi temel işlemler
o Find And Replace, Go, Bookmark gibi navigation işlemleri
9
Konu: 1
o
o
•
Outlining ile metinleri gruplama işlemleri
Satırları yorum satırı yapma, yorum satırlarını kaldırma, büyük
küçük harf çevrimi gibi ileri seviye işlemler gerçekleştirilir.
View (Görünüm)
Visual Studio çalışma ortamındaki tüm paneller bu menü komutlarıyla gösterilir.
Ayrıca Navigate Backward ve Navigate Forward komutlarıyla en son
çalışılan satıra geri dönülür.
•
Project (Proje)
Projeye dosya eklemek, çıkarmak, proje özelliklerini göstermek için bu menü
kullanılır.
•
Build (Derleme)
Projelerin çalışmak üzere derlenmesi için gereken komutlar, bu menü
altındadır.
•
Debug (Hata Ayıklama)
Projede hata ayıklarken gereken komutlar Debug menüsü altındadır. Projenin
debug durumunda başlatmak, BreakPoints (hata ayıklarken durulması gerek
satırları ayarlamak) gibi işlemler yapılır.
•
Tools (Araçlar)
Visual Studio ile beraber yüklenen yardımcı araçların listelendiği menüdür.
Araç çubuklarını özelleştirmek için kullanılan Customize seçeneği gibi
Options seçeneği de en sık kullanılan özelliklerden biridir.
Visual Studio çalışma ortamının tüm ayarları Options menüsünden yapılır.
Environment ve Text Editor en sık kullanılan seçeneklerdir.
Environment (Ortam): Sayfa düzeni ve görünüm ayarları, yazı tipi (font) ve renk
ayarları, komutlar için kısa yol ayarları, Internet tarayıcısı ayarları, yardım ve
dinamik yardım ayarları yapılır.
Text Editor (Metin Düzenleyicisi): Farklı programlama dillerine özgü yazı düzeni
yapılır.
Örnek:
o
o
o
Tools menüsünden Options komutunu seçin.
Sol panelde bulunan Environment menüsünden Fonts and
Colors (Yazı düzeni ve Renkler) sekmesine gelin.
Sağ panelde bulunan Display items (Öğeleri Listele)
menüsünden Text alanının seçin ve Item background (Öğe arka
planı) özelliğini Light Grey (Açık Gri) olarak belirleyin. Tüm
sayfaların arka plan rengi açık gri olacaktır.
10
Modül 3: Microsoft Visual Studio Arayüzü
o
o
•
Sol panelde Environment menüsünden Web Browser sekmesine
gelin. Home Page (ana sayfa) özelliğinin altındaki Use Default
seçeneğini kaldırın ve metin kutusuna www.bilgeadam.com yazın.
Sol panelde Text Editor menüsünden C# alt menüsünü seçin.
Burada Visual C# diline özel metin düzenleme seçenekleri bulunur.
Sağ panelde, Display sekmesinin altında Line Numbers (Satır
Numaraları) seçeneğini işaretleyin. Bu seçenek, Visual C#
projelerinde çalışırken satır numaralarını gösterir.
Window (Pencere)
Sayfaların ve panellerin görünümleri ve özelliklerini değiştirmek için kullanılan
komutlar bu menü altında bulunur. Tüm açık çalışma sayfaları bu menü altında
görüldüğü gibi, istenen sayfa seçilerek ön plana getirilir. Ayrıca, Close All
Documents (Tüm Sayfaları Kapat) komutu ile açık olan bütün sayfalar kapatılır.
Auto Hide All (Tümünü Otomatik Gizle) komutu ile, sabit hale getirilmiş tüm
paneller gizlenir.
•
Help (Yardım)
Visual Studio çalışma ortamında çok sık kullanılan yardım panellerinin
görünümü bu menü ile sağlanır. Bu menü ile ayrıca, kullanılan Visual Studio
çalışma ortamının sürümü hakkında bilgi alınır, son güncellemeler kontrol edilir,
teknik destek için gereken e-posta adreslerine veya telefonlara ulaşılır.
Yardım kullanımı bu modülde detaylı olarak ele alınacaktır.
11
Konu: 1
Konu 4: Solution Explorer Paneli
ƒ Visual Studio projeleri, bir “Solution”
altında toplar
ƒ Solution içinde bulunan tüm dosyalar,
klasörler görüntülenir
ƒ Panele ait araç çubuğu basit işlemler
gerçekleştirir
ƒ Refresh, Show All Files, Properties
ƒ Visual Basic profilinde, CTRL-ALT-L ile
ulaşılır
Visual Studio çalışma ortamında projeler bir solution (çözüm) altında açılır. Bir
solution içine farklı dilde ve tipte projeler dâhil edilebilir. Visual Studio ile bir
solution açıldığında, Solution Explorer paneli ile solution içinde bulunan tüm
projeleri, ilgili dosya ve klasörleri görüntüler. Panelde koyu yazı tipinde gözüken
proje, solution içindeki başlangıç projesidir.
Bu panelden, öğeler üzerinde silme, kopyalama, taşıma, ismini değiştirme
işlemleri yapılabilir. Ayrıca panelin üst kısmında, seçilen öğe üzerinde basit
işlemler gerçekleştirmek için bir araç çubuğu bulunur.
•
Refresh (Yenile)
Proje dosyaları üzerindeki değişikliklerin gözükmesini sağlar.
•
Show All Files (Bütün Dosyaları Göster)
Seçilen projenin bulunduğu klasördeki tüm dosyaları ve alt klasörleri gösterir.
Panelde gözüken beyaz öğeler proje içine dâhil edilmemiş öğelerdir. Projede
kapsamında kullanılmak istenen öğeler (örneğin arka plan resmi), üzerine sağ
tıklanıp Include In Project komutu ile projeye dâhil edilmelidir.
•
Properties (Özellikler)
Paneldeki tüm öğelerin özellikleri, Properties komutu ile görülebilir. Bu komut
seçildiğinde, öğenin özellikleri Properties paneli ile görüntülenir. (Properties
paneli bu modülde detaylı olarak ele alınacaktır.)
12
Modül 3: Microsoft Visual Studio Arayüzü
Solution Explorer paneli, View menüsünden görülebildiği gibi, varsayılan
klavye seçeneklerinde CTRL-ALT-L kısa yolu ile de görülebilir.
(Ref: MSDN, Solution Explorer)
Konu 5: Toolbox Paneli
ƒ Projelerde kullanılan çeşitli bileşenler
listelenir
ƒ Nesneler, sekmeler halinde gruplanır
ƒ Windows Forms, Web Forms, ClipBoard Ring
ƒ Visual Basic profilinde, CTRL-ALT-X ile
ulaşılır
13
Konu: 1
Toolbox (Araç Kutusu) paneli, projelerde kullanılan çeşitli bileşenlerin
listelendiği paneldir. Buradaki öğeler, sekmeler içinde gruplanmıştır. Her
sekme, ortak platformlarda çalışan veya benzer işlevleri olan nesnelere
sahiptir. Örneğin, Data sekmesinde veri tabanı işlemlerinde kullanılan
bileşenler vardır. Windows Forms bileşenleri Windows platformunda çalışan
projelerde, Web Forms bileşenleri ise Web tabanlı projelerde kullanılan
nesnelerdir. ClipBoard Ring sekmesinde ise kopyalanan metinler bulunur.
Nesnenin silik gözükmesi, o anda çalışılan sayfada kullanılamayacağı
anlamına gelir.
Toolbox panelinde nesneler, en sık kullanılandan en az kullanılana göre
sıralanmaktadır. Örneğin, Windows Forms sekmesinde en üstte Label, Link
Label, Button, TextBox nesneleri bulunur. Nesneler, yerleri ve sıraları
taşınarak değiştirilebilir, ayrıca başka bir sekmeye de taşınılabilir. Varsayılan
sıralama dışında, alfabetik olarak da sıralama yapılabilir.
Visual Studio çalışma ortamın, Toolbox panelindeki nesnelere yeni isim verme,
nesneleri silme veya panele yeni sekmeler ve nesneler ekleme imkânlarını da
sağlar.
Örnek:
o
o
o
o
View menüsünden Toolbox panelini seçin
Panelde herhangi bir yere sağ tıklayın ve Show All Tab (Bütün Sekmeleri
Göster) komutunu seçin
Windows Forms sekmesinde TextBox nesnene sağ tıklayın. Çıkan menüden
Rename Item (Ad Değiştir) komutunu seçin ve “Metin Kutusu” yazın.
“Metin Kutusu” nesnesini taşıyarak sekmenin en üstüne getirin.
14
Modül 3: Microsoft Visual Studio Arayüzü
o
o
o
Panele sağ tıklayın ve Sort Items Alphabetically (Nesneleri Alfabetik
olarak Sırala) komutunu seçin. Metin Kutusu nesnesinin, alfabetik sırada
yerini aldığı görülür.
Panele sağ tıklayın ve Add Tab (Sekme Ekle) komutunu seçin. Sekmeye
“Medya” ismini verin.
Sekmeye sağ tıklayın ve Add/Remove Items (Nesne Ekle/Kaldır) komutunu
seçin. Customize Toolbox diyalog kutusu çıkar. Burada Toolbox paneline
eklenebilecek tüm bileşenler listelenir. Com Components sekmesine gelin ve
listeden Windows Media Player nesnesini işaretleyin. Ok tuşuna basarak,
diyalog kutusunu kapatın. Windows Media Player nesnesinin, oluşturulan
Medya sekmesine eklendiği görülecektir.
Toolbox paneli varsayılan klavye seçeneklerinde CTRL-ALT-X kısa yolu ile
ulaşılır.
Konu 6: Properties Paneli
ƒ Visual Studio ortamındaki nesnelerin
özelliklerini listeler
ƒ Özellik adı – Değeri
ƒ Özellikler kategorilere göre gruplanmıştır,
alfabetik olarak da sıralanabilir
ƒ
ƒ F4 ile her yerden ulaşılır
Properties (Özellikler) paneli, seçilen bir nesnenin özelliklerini görüntüler.
Paneldeki görünüm, Özellik adı - değeri şeklindedir. Silik olarak gözüken
özellikler salt okunurdur ve değiştirilemez. Panelin üzerindeki açılır liste,
çalışma sayfasındaki nesneleri listeler. Buradan istenilen nesne seçilerek
özellikleri görüntülenir.
15
Konu: 1
Paneldeki özellikler kategorilere göre gruplanmıştır, ancak alfabetik olarak da
dizilir. Panelin üstünde bulunan araç kutusundan Categorized
(Kategorileştirilmiş) veya Alphabetic (Alfabetik) seçilerek özelliklerin
görünümleri değiştirilir.
Panelin en altında bulunan bölümde, her özelliğin açıklaması bulunur.
İpucu: Bir nesnenin üzerindeyken F4 tuşuna basınca, Properties paneli
görüntülenir.
16
Modül 3: Microsoft Visual Studio Arayüzü
Konu 7: Help Kullanımı
ƒ En sık kullanılan kaynaktır
ƒ MSDN (Microsoft Developer Network) kütüphaneleri
ƒ Dynamic Help
ƒ İçeriği, seçilen nesnelere göre değişir
ƒ F1 ile dinamik yardım
ƒ Search
ƒ Zengin arama seçenekleri
ƒ Index
ƒ Alfabetik konu dizini
ƒ Contents
ƒ MSDN kütüphanelerinin hiyerarşik görünümü
Yazılım geliştirirken en çok kullanacağımız kaynaklar yardım dosyaları
olacaktır. Bir programlama dilinin çok çeşitli özellikleri, kullanım farklılıkları
olabilir. İyi bir programcı bütün bu özellikleri ezbere bilen değil, bu özellikleri en
kısa sürede bulan, öğrenen ve kullanandır. Yardım dosyalarının kullanımını
bilmek, programcılığın temelini oluşturan önemli unsurlardan biridir.
DİKKAT: Visual Studio Yardımını kullanmak için, MSDN (Microsoft Developer Network)
yardım kütüphanelerinin yüklenmiş olması gerekiyor.
Visual Studio Yardımı programcıya, gelişmiş özelliklere sahip paneller ve
yardım dosyaları ile geniş bir kullanım kolaylığı sağlar.
Visual Studio Yardım dosyalarının yapısı başlık, içerik, ilişkili konular (See
bölümlerinden oluşmuştur. Ayrıca her yardım dosyasının altında
bulunan Send Comments bağlantısı ile konu hakkında yorum gönderilebilir.
Also)
Visual Studio Yardım panelleri Dynamic Help, Search, Index ve Contents
olarak dörde ayrılır. Bu paneller, Help menüsünden ulaşılabilir.
17
Konu: 1
Dynamic Help (Dinamik Yardım)
Dynamic Help paneli, içeriği otomatik olarak değişen bir araçtır. Kod yazarken,
panellerde veya sayfalarda nesneler seçildiğinde, kullanıcının başka bir işlem
yapmasına gerek kalmadan, o nesne hakkında yardım konularını listeler. F1
tuşuna bastığımız zaman ise seçilen nesneye ait, Dynamic Help panelindeki
ilk yardım konusu yeni bir sayfada görüntülenir.
Paneldeki yardım konuları Help, Samples ve Getting Started olarak üç
bölüme ayrılmıştır. Help bölümünde, seçilen nesne, bu nesneyle ilişkili olan
kavramların listelendiği bölümdür. Samples, konuyla ilgili kod örnekleri bulunan
yardım dosyalarını gösterir. Getting Started çalışılan sayfalara göre
değişen, temel işlemleri içeren başlangıç yazılarını gösterir.
Search (Arama)
MSDN kütüphanelerinde arama yapılan paneldir. Look for metin kutusuna,
aranacak anahtar kelimeler girilir. Filtreleme (Filtered by) ile arama
sonuçları belli konulara göre sınırlanır ve istenmeyen seçeneklerin gösterilmesi
engellenir.
Search panelinde, Search in titles only, Match related words,
Search
in
previous
results,
Highlight
search
hits arama
seçenekleri bulunur:
Search in titles only: Sadece konu başlıklarında arama yapar, içerik
kısmına bakmaz
Match related words: Kelimeleri yazıldığı gibi arar, benzer yazımlı kelimeleri
aramaz.
Search in previous results: İlk aramadan sonra aktif olan bu seçenek ile
kelimeler, bir önceki aramada bulunan sonuçlar arasına bakılır.
Highlight search hits: Bulunan yardım sayfalarında, aranan kelimelerin
seçili olmasını sağlar.
18
Modül 3: Microsoft Visual Studio Arayüzü
Bulunan sonuçlar Search Results (Arama Sonuçları) panelinde gösterilir. Bu
panelde
o Title, konunun başlığını
o Location, MSDN kütüphanelerinde hangi başlık altında bulunduğunu
o Rank, konunun, aranılan kelimeye olan yakınlık derecesini ifade eder.
Index (Dizin)
Yardım dosyalarındaki bütün konuları alfabetik sırada dizer. Filtreleme işlevi,
arama panelinde olduğu gibidir. Bu panelin özelliği, aranacak kelime yazılırken,
bu kelime ile başlayan tüm konuların alfabetik sırada gösterilmesidir. Bu
şekilde, aranan konulara çok hızlı bir şekilde ulaşılabilir.
Eğer bir konu ile ilgili birden fazla yardım dosyası varsa, Index Results (Dizin
Sonuçları) panelinde bu seçenekler gösterilir.
Contents (İçerik)
Contents panelinde, tüm MSDN içeriği konulara göre hiyerarşik yapıda,
kategorilere ayrılmış olarak gösterilir. Bu panelde de aynı şekilde filtreleme
yapılarak istenmeyen içerikler çıkartılabilir.
Bir yardım dosyası açıkken, Help menüsünden Sync Contents (İçerik
Senkronizasyonu) komutu seçilerek o yardım dosyasının Contents panelindeki
yeri bulunabilir.
LAB 3.1: Help Kullanımı
Bu lab tamamlandıktan sonra:
•
Dynamic Help kullanımını öğrenecek,
•
Search paneli ile arama yapabilecek,
•
Contents paneli ile MSDN kütüphanelerinin hiyerarşik yapısını öğrenecek,
•
Index paneli ile içeriğe hızlı bir şekilde ulaşabilecek,
•
Yardım dosyalarını yorumlayabileceksiniz.
Bu labı tamamlamak için, MSDN yardım kütüphaneleri yüklenmiş olmalıdır.
Dynamic Help
1. Help menüsünden Show Start Page komutuna tıklayın.
2. Help menüsünden Dynamic Help komutunu seçerek Dynamic Help
panelini açın. Panelde gösterilen ilk konunun ismi nedir?
19
Konu: 1
3. CTRL-ALT-X tuşlarına basıp Toolbox panelini açın. Dynamic Help
menüsünde ne değişti?
4. Toolbox panelinde, Windows Forms tabında Button nesnesini seçin.
Dynamic Help panelindeki ilk konunun ismi ne olarak değişti?
Button seçiliyken F1 tuşuna basın. Açılan sayfanın ismi nedir?
Contents
1. Help menüsünden Sync Contents komutuna tıklayın. Button
Members konulu yardım dosyası hangi konuların altında bulunuyor?
2. Contents panelinin ilk başlığı olan Visual Studio .NET altında, Gettings
Assitance altında, "Using Help in Visual Studio .NET” altında, “Tips for
Using the Help Keyword Index” konulu yardımı açın. File menüsünden
Print komutunu seçin ve sayfayı yazdırın.
DİKKAT: Sayfayı yazdırmak için bilgisayarınıza bağlı bir yazıcı bulunması gerekiyor.
İPUCU:
Yardım dosyalarını yazdırmak, özellikle uzun metinlerde, kolay çalışma imkânı
sağlar.
3. Contents panelini kapatın.
Search
1. Help menüsünden Search komutunu seçin. Look for metin kutusuna
Visual Studio .NET yazın. Search in titles only, Match related
words seçeneklerini işaretleyin. Search düğmesine basın.
Kaç tane konu bulundu? En üst dereceli konu nedir?
2. Search in previous results seçeneğini işaretleyin. MSDN
kelimesini aratın. Kaç konu bulundu?
3. Search in previous results seçeneğini kaldırın. MSDN kelimesini
tekrar arattığınız zaman kaç konu bulunur? Search in titles only
seçeneğini kaldırınca kaç konu bulunur?
4. Search Results ve Search panellerini kapatın.
Index
1. Help menüsünden Index komutuna tıklayın. Look for metin kutusuna "file
types" yazın. İlk çıkan konu nedir?
2. Filtre olarak Visual C# seçin. İlk hangi konu gösteriliyor?
3. “File Types” konusu üzerine tıklayın. Açılan sayfada Solution Files (.sln and
.suo) adlı bölümü inceleyin.
4. Project Files başlığında, Visual Basic and Visual C# alt başlığı altında,
“File Types and File Extentions in Visual Basic and Visual C#” konusuna
tıklayın.
20
Modül 3: Microsoft Visual Studio Arayüzü
5. Açılan yardım dosyasını inceledikten sonra, sayfanın See Also başlığı
altında “What's New in Projects” konusuna sağ tıklayın. Açılan menüden
“Open Link in New Window” komutunu seçin. Window menüsünden “New
Vertical Tab Group” komutunu seçin.
Bir önceki yardım dosyasıyla arasındaki benzerlikleri inceleyin.
6. Window menüsünden “Close All Documents” seçeneği ile bütün sayfaları
kapatın ve Visual Studio ortamından çıkın.
Modül Sonu Soruları & Alıştırmalar
Özet
Â
Â
Â
Â
Â
Â
Â
Visual Studio çalışma ortamı
Start Page
Menüler
Solution Explorer Paneli
Toolbox Paneli
Properties Paneli
Help Kullanımı
1. Visual C# profili için, Object Browser paneline hangi kısa yolla ulaşılır?
2. Visual Studio ortamında tüm sabitlenmiş panelleri gizlemek için hangi menü
komutu kullanılır?
3. Properties panelindeki özellikler alfabetik olarak nasıl sıralanır?
Modül 4: Visual C# .NET İle Windows Tabanlı
Programlama
Hedefler
Â
Â
Â
Â
Â
Â
Windows Tabanlı Uygulamalar
Özellikler, Metotlar, Olaylar
Windows kontrolleri
Değişken, Sabit Tanımları
Veri Tipleri
Operatörler
Windows tabanlı uygulamalar, Windows işletim sistemi üzerinde çalışan
uygulamalardır. Windows uygulamaları Windows formları ve kontrollerinden
oluşur. Visual Studio bu formların ve üzerindeki kontrollerin tasarımını, kodların
yazılımını büyük ölçüde kolaylaştırarak uygulama geliştirme sürecini daha hızlı
ve kolay hale getirir.
Bu modülü tamamladıktan sonra:
•
Windows tabanlı programlamada kullanılan kontrolleri tanıyacak,
•
Kontrollerin özellik, metot ve olay kavramlarını öğrenecek,
•
Visual C# .NET dilinde değişken, sabit tanımlamayı öğrenecek,
•
Veri tiplerini tanıyacak,
•
Operatörleri kullanabileceksiniz.
HERKES İÇİN UNIX
2
KISIM I:
Konu 1: İlk Uygulama (Hello World, The
Time Is..)
Windows tabanlı ilk uygulama
private void Button1_Click(object sender, System.EventArgs e)
{
MsgBox("Hello World! The time is " + DateTime.Now);
}
Visual C#.NET ile yazacağımız Windows uygulaması ekrana, “Hello World!”
yazısını ve o anki zamanı gösteren bir bilgi mesajını çıkartır.
•
•
•
•
•
•
Visual Studio çalışma ortamını açın.
File menüsünden, New alt menüsüne işaret edin ve Project komutunu
seçin. “New Project” diyalog kutusu, yazılacağı dile, çalışacağı ortama göre
değişen projeleri tiplerini listeler.
Proje tiplerinden Visual C#Project ve Windows Application tipinin seçili
olduğunu kontrol edin.
Name özelliğine HelloWorld yazın ve Ok tuşuna basın. Açılan Windows
projesinde başlangıç olarak bir adet Windows Form tasarım görünümünde
açılır.
Toolbox panelinden Button kontrolünü formun üzerine sürükleyip bırakın.
Properties panelini açarak Button kontrolünün Text özelliğine “Hello World!”
yazın.
Eklenen Button kontrolüne çift tıklayarak kod sayfasına geçin. Button
kontrolüne basıldığında çalıştırılacak kodu yazın:
MessageBox.Show("Hello World! The time is " + DateTime.Now);
NOT:
Yazdığınız kodun ne anlama geldiğini belirtmek için yorum satırları kullanmak,
kodları okumayı kolaylaştırır. Yorum satırları // ile başlayarak yazılmalıdır.
HERKES İÇİN UNIX
3
BÖLÜM 1:
•
MessageBox.Show metodunun yazıldığı kodun üstüne, yapılmak istenileni
belirten bir yorum satırı yazın.
// MessageBox.Show metodu ile kullanıcıya Merhaba diyoruz.
// Now özelliği ile o andaki saat ve gün
// değerlerini de kullanıcıya gösteriyoruz.
• F5 tuşuna basarak projeyi çalıştırın.
İPUCU:
Çalışma sayfaların isimlerinin yanında yıldız işaretinin gözükmesi, o sayfada
değişiklik yapıldığını ancak daha kaydedilmediğini belirtir. Proje dosyalarınızı CTRL-S
tuşlarına basarak sıkça kaydedin.
Konu 2: Özellikler, Metodlar Ve Olaylar
ƒ Özellikler
ƒ Görünüm, yerleşim, davranışlara özgüdür
ƒ Properties paneli
ƒ Text, Name, Size, BackColor
ƒ Metotlar
ƒ Yapılan işlemler
ƒ Parametre ile, Parametresiz çağrılırlar
ƒ Focus, Select, Hide, Show
ƒ Olaylar
ƒ Başlarına gelen işlemlerdir
ƒ Click, MouseDown, Enter
.NET Kontrolleri üç temel kavramdan oluşur.
Özellikler
Özellikler, kontrollerin görünümü, yerleşimi veya davranışlarına özel
niteliklerdir. Örneğin bir Button kontrolünün Text özelliği, üzerinde yazan
yazıya erişmemizi sağlar.
Kontrollerin özellikleri, tasarım anında Properties panelinden ulaşılabileceği
gibi, kod tarafında da okunup değiştirilebilir.
Kontrollerin birçok özelliği hem okunabilir hem de değiştirilebilir. Ancak bazı
özellikler salt okunur (ReadOnly) ve salt yazılır (WriteOnly) olabilir. Bu tip
özellikler Properties panelinde gözükmezler.
Kontrollerin birçok ortak özellikleri vardır.
HERKES İÇİN WINDOWS
4
KISIM I:
•
Text (Yazi)
Kontrollerin Text özelliği, üzerinde görüntülenen yazıdır. Bu özellik çalışma
anında sıkça okunup değiştirilerek, kullanıcıyla iletişim sağlanır.
TextBox kontrolüne girilen bir değerin okunup Label kontrolüne yazılması için,
kontrollerin Text özellikleri kullanılır.
private void button1_Click(object sender,
System.EventArgs e)
{
label1.Text = textBox1.Text;
}
Name (İsim)
Name özelliği kontrollere ulaşmak için kullanılan özelliktir. Birçok kontrolün Text
özelliği aynı olabilir. Ancak her biri ayrı birer nesne oldukları için, Name
özellikleri benzersiz olması gerekir.
textBox2.Text = textBox1.Text;
İki TextBox kontrolünün yazıları aynı, fakat isimleri farklıdır.
•
Size (Büyüklük)
Kontrollerin büyüklük özelliğidir. Height (yükseklik) ve Width (genişlik)
özelliklerinden oluşur. Genellikle tasarım anında belirlenen bu özellik, çalışma
anında da değiştirilebilir.
label1.Height = 10;
label1.Width = 20;
• BackColor (Arka plan rengi)
Kontrollerin arka plan renginin ayarlandığı özelliktir. Bu özelliğin değeri, Color
(renk) nesnesinde tanımlı değerler ile belirlenir.
•
ForeColor (Önalan rengi)
Kontrollerin üzerindeki yazıların rengini belirler.
private
void
button1_Click(object
System.EventArgs e)
{
button1.BackColor = Color.Black;
button1.ForeColor = Color.White;
}
HERKES İÇİN UNIX
sender,
5
BÖLÜM 1:
•
Visible (Görünür)
Kontrollerin ekranda görünüp görünmediklerini belirleyen özelliktir. True ve
False olmak üzere iki değer alabilir. Boolean veri tiplerinden bu modülde
bahsedilecektir.
private
void
button1_Click(object
System.EventArgs e)
{
// Label kontrolünü gizle
label1.Visible = false;
sender,
// Label kontrolünü göster
label1.Visible = true;
}
Metotlar
Metotlar kontrollerin yaptığı işlemlerdir. Metotlar parametreyle veya
parametresiz çağrılabilir. Parametreyle çağırmak, metodun girilen değere göre
işlem yapacağını belirtir. Örneğin Focus (Odaklan) metodu, parametre
beklemeden çalışır ve kontrolün seçilmesini sağlar.
private
void
button1_Click(object
System.EventArgs e)
{
// İşlem yapıldıktan sonra
// TextBox kontrolüne odaklan
textBox1.Focus();
}
sender,
Kontrollerin bazı ortak metotları vardır.
•
Select (Seç)
Select metodu Focus ile aynıdır ama TextBox kontrolünün Select
metodunun diğerlerinden bir farkı daha vardır. TextBox içindeki yazıyı, verilen
parametreler göre belli bir kısmını ya da hepsini seçer.
private
void
button1_Click(object
System.EventArgs e)
{
textBox1.Text = "Yazılım Uzmanı";
textBox1.Focus();
// Sekizinci karakterden sonra,
HERKES İÇİN WINDOWS
sender,
6
KISIM I:
// beş karakter seç
textBox1.Select(8, 5);
}
•
•
BringToFront (Öne Getir)
Üst üste duran kontroller arasından en öne getirir.
SendToBack (Arkaya Gönder)
Üst üste duran kontrollerin en arkasına gönderir.
•
•
Hide (Sakla)
Kontrolün gözükmesini engeller.
Show (Göster)
Kontrolün gözükmesini sağlar.
Olaylar:
Olaylar kontrollerin başına gelen işlemlerdir. Olayların metotlardan farkı, bu
işlemler kontrollerin elinde olmadan gerçekleşmesidir. Örneğin bir Button
kontrolüne tıklanması, o kontrolün isteği dışında yapılmıştır. Bu olayın
tetiklemesinde kontrolün bir rolü yoktur. Bu olaylar gerçekleştiği zaman
yapılması gereken işlemler, ilgili olayın yordamına yazılır. Button1 isimli
kontrolün üzerine tıklandığı zaman gerçekleştirmek istenen eylemler
Button1_Click yordamına yazılır.
Visual Studio, olayların yordam isimlerini Kontrolİsmi_Olayİsmi olarak
biçiminde yazar.
Kontroller ile çalışırken benzer olaylar kullanılır.
•
Click (Tıklandığında)
Kontrol üzerine tıklandığı zaman tetiklenen olaydır. Windows tabanlı
programlamada en sık kullanılan olaylardan biridir.
•
MouseDown (Mouse tuşu basıldığında)
Fare, kontrolün üzerindeyken herhangi bir tuşuna basıldığı zaman gerçekleşen
olaydır. Bu olay, Click olayından önce çalışır.
•
MouseUp (Mouse tuşu bırakıldığında)
Fare, kontrolün üzerindeyken basılan tuş bırakıldığı zaman çalışır.
•
Enter (Girildiğinde)
Kontrol seçildiği veya üzerine odaklanıldığı zaman gerçekleşen olaydır.
•
Leave (Çıkıldığında)
HERKES İÇİN UNIX
7
BÖLÜM 1:
Başka bir kontrol seçilmek üzere çıkıldığında, bu kontrolün Leave olayı
tetiklenir.
•
VisibleChanged (Görünürlüğü değiştiğinde)
Kontrolün görünüp görünmediğini belirten Visible özelliği değiştiği zaman
tetiklenir.
İPUCU: Olayların çalışma sıralarını test etmek için tüm olay yordamlarına, mesaj kutusu
çıkaran (MessageBox.Show) kod yazın. Daha sonra projeyi çalıştırıp kontroller üzerinde
yapılan değişikliklere göre olayların çalışma sıralarına bakın.
Konu 3: Visual C# .NET’e Kontrollerin
Eklenmesi
Visual Studio’ya Kontrol Eklenmesi
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
Toolbox panelinden kontrollerin eklenmesi
Form
Button
TextBox
Label
ComboBox
ListBox
Timer
Windows tabanlı uygulamalar geliştirirken sıkça kullanacağımız bir grup kontrol
vardır. Form kontrolü hariç diğer bütün kontroller Toolbox panelinden seçilir.
Bu kontroller sürüklenip Form üzerine istenilen pozisyona bırakılır.
Kontroller, ToolBox panelinde üzerine çift tıklayarak da eklenebilir.
HERKES İÇİN WINDOWS
8
KISIM I:
Kontrollerin tasarım anında büyüklükleri, yerleri Size ve Location özellikleri ile
değiştirilebileceği gibi, fare ile de istenilen şekilde ayarlanabilir.
Form
Windows uygulamaları, Windows kontrollerinin tutulduğu pencereler olan
formlardan oluşur. Bir Windows projesi açıldığı zaman Form kontrolü otomatik
olarak eklenir. İkinci bir form eklemek için Project menüsünden Add Windows
Form komutunu seçilir. Proje çalıştığı zaman başlangıç formu görüntülenir.
Başlangıç formu projenin özelliklerinden değiştirilir.
Visual Studio ortamında formlar, tasarım sayfası ve kod sayfası olmak üzere iki
farklı sayfada görüntülenir. Tasarım sayfası, formun ve üzerindeki kontrollerin
görünümlerini kolay bir şekilde değiştirmeyi sağlar. Visual Studio bu sayfada
yapılan değişiklikleri kod sayfasında eş zamanlı olarak günceller. Örneğin bir
Button kontrolünün genişliğini fare ile değiştirdiğimiz zaman, kod sayfasında bu
HERKES İÇİN UNIX
9
BÖLÜM 1:
kontrolün Width özelliği yapılan değişikliğe göre güncellenecektir. Aynı
değişiklikler properties panelinde de görülebilir.
Formların, diğer kontrollerin özelliklerinden farklı bazı özellikleri vardır.
• ControlBox (Denetim Kutusu)
Form üzerindeki simge durumunda küçültme, ekranı kaplama ve formu kapama
kutularının görünümünü ve erişebilirliğini kontrol eder.
NOT:
Formun ControlBox özelliği False iken uygulama, Debug menüsünden Stop
Debugging komutu seçilerek kapatılabilir.
• StartPosition (Başlagıç Pozisyonu)
Form açıldığı zaman nerede gözükeceğini belirler. CenterScreen seçeneği
formu ekranın ortasında gösterir.
Formlar açıldığı zaman Load olayı gerçekleşir. Eğer form, başlangıç formu olarak
seçilmişse, proje başladığı zaman çalıştırılmak istenen kodlar bu olayın
yordamına yazılır.
private void Form1_Load(object sender,
System.EventArgs e)
{
label1.Text = "Proje başlatıldı. Kayıt zamanı: "
+ DateTime.Now;
}
Button
Bir Windows düğmesini temsil eder. Button kontrolüne basıldığında Click
olayı tetiklenir. Bu olay gerçekleştiği zaman yapılacak işlemler,
ButtonIsmi_Click yordamında yazılır.
private void btnRenkDegistir_Click(object sender,
System.EventArgs e)
{
btnRenkDegistir.ForeColor = Color.Gray;
}
TextBox
Bir Windows metin kutusunu temsil eder. Kullanıcıların değer girerek program
ile haberleşmesini sağlamak amacıyla kullanılır. TextBox kontrolündeki yazı
değiştiği zaman TextChanged olayı gerçekleşir.
private void textBox1_TextChanged(object sender,
System.EventArgs e)
{
// TextBox içindeki yazı değiştiği zaman
// aşağıdaki kod çalışır.
MessageBox.Show("Yazı değiştirildi: " +
textBox1.Text);
}
HERKES İÇİN WINDOWS
10
KISIM I:
Label
Bir Windows etiketini temsil eder. Kullanıcıya, form üzerinde bir yazıyı
göstermek amaçlı kullanılır. Bu yazının görünümü, Label kontrolünün bazı
özellikleri ile değiştirilir.
• TextAlign (Yazı Hizalama)
Yazının Label kontrolü üzerinde nerede duracağını belirler.
Font (Yazı Tipi)
Font özelliği birçok alt özellik taşır. Bunlardan bazıları en sık kullanılan
özelliklerdir.
o
Name
Yazı tipinin ismini belirler. Varsayılan Microsoft Sans Serif
seçilidir.
o
Size
Karakterlerin boyutunu belirler. Varsayılan büyüklük 8,5
değerini alır.
o Bold (Kalın)
Yazının kalın tipte olmasını belirler.
o Italic (Yatay)
Yazının italik tipte olmasını belirler.
o UnderLine (Altı Çizgili)
Yazının altı çizgili olmasını belirler.
ComboBox
Bir Windows açılan kutusunu temsil eder. ComboBox kontrolü, kullanıcıların
bazı değerleri açılan bir listeden seçmesini sağlar. Listeye tasarım anında veya
çalışma anında öğe eklenebilir. Listeye öğe eklemek için kontrolün Items
özelliğinden faydalanılır.
HERKES İÇİN UNIX
11
BÖLÜM 1:
Tasarım anında öğe eklemek için Properties panelinden Items özelliği seçilir.
String Collection Editor penceresinde, her öğenin değeri tek bir satırda
yazılır.
Çalışma anında öğe eklemek için kod sayfasında, kontrolün Items özelliğinin
Add metodu kullanılır.
private
void
Form1_Load(object
System.EventArgs e)
{
comboBox1.Items.Add("Lise");
comboBox1.Items.Add("Üniversite");
comboBox1.Items.Add("Yüksek Lisans");
comboBox1.Items.Add("Doktora");
}
sender,
ListBox
Bir Windows liste kutusunu temsil eder. Kontroldeki öğeler sabit bir liste olarak
görüntülenir. ListBox kontrolüne öğe ekleme işlemi, ComboBox kontrolündeki
işlemlere ile aynıdır. ComboBox kontrolünden farkı, birden fazla öğe seçilebilir
olmasıdır.
private void btnBosSiniflar_Click(object sender,
System.EventArgs e)
{
listBox1.Items.Add("YU6501");
listBox1.Items.Add("YM6221");
listBox1.Items.Add("YM6102");
listBox1.Items.Add("YU6412");
}
HERKES İÇİN WINDOWS
12
KISIM I:
Timer
Bir Windows sayacını temsil eder. Sayaç çalışmaya başladığı zaman, belirli
zaman aralıklarında Tick olayı gerçekleşir. Timer kontrolünün Interval
değeri, Tick olayının kaç milisaniyede bir gerçekleşeceğini belirler. Örneğin
Interval değeri 2000 olan bir sayaç, Tick olayında yazılan kodları iki
saniyede bir çalıştıracaktır.
Sayacı başlatmak için kontrolün Start metodu, durdurmak için ise Stop
metodu kullanılır. Enabled özelliği, sayacın aktif olup olmadığını belirler.
private void btnBasla_Click(object sender,
System.EventArgs e)
{
// Sayaç 5 saniyede bir çalışacak
timer1.Interval = 5000;
timer1.Start();
}
private void timer1_Tick(object sender,
System.EventArgs e)
{
MessageBox.Show("Sayaç çalışıyor...");
}
private void btnDur_Click(object sender,
System.EventArgs e)
{
timer1.Stop();
}
LAB 4.1: Kronometre Uygulaması
Bu labı tamamladıktan sonra:
•
Form ve üzerindeki kontrollerin görünüm özelliklerini öğrenecek,
•
ComboBox, ListBox kontrollerine öğe ekleyebilecek,
•
TextBox kontrolünden değer okuyabilecek,
•
Timer kontrolünün çalışma şeklini öğreneceksiniz.
HERKES İÇİN UNIX
13
BÖLÜM 1:
Form üzerine kontrollerin eklenmesi,
biçimlendirin yapılması
1. “Kronometre” isminde yeni bir Windows projesi açın.
2. Properties panelinden, Form1 nesnesinin BackColor özelliğini
“Menu” olarak seçin. Font özelliğini, yanındaki + tuşuna basarak
genişletin. Font özelliğinin alt özellikleri listelenir.
•
Name özelliğini Tahoma,
•
Text özelliğini “Yazılım Uzmanlığı Kronometre Uygulaması”,
• Size özelliğini 10 olarak ayarlayın.
Form görünüm özellikleri, eklenecek kontrollerin (değiştirilmedikleri sürece)
görünümlerini de etkiler.
3. Toolbox panelinden Form üzerine bir Label ekleyin. Özelliklerini
atayın:
•
Text: Kronometrem
•
Font – Name: Forte, Font – Size: 28
•
Dock: Top
• TextAlign: BottomCenter
4. Bir Label kontrolü ekleyin. Özelliklerini atayın:
•
Text: 0
•
Font – Size: 30
•
TextAlign: MiddleCenter
• Name: lblSure
5. Forma bir Timer kontrolü ekleyin. Name özelliğini tmrKronometre
olarak değiştirin.
İPUCU:
Kod tarafında kullanacağınız kontrollerin isimlerini değiştirmek, daha sonra
ulaşmak için zaman kazandıracaktır.
6. Bir ComboBox ekleyin. Text özelliğini “Hız Seçin” olarak, Name özelliğini
de cmbInterval olarak değiştirin. Items Collection içine sırayla
1000, 2000, 3000, 4000 değerlerini girin.
Bu kontrol, çalışma anında Timer kontrolünün Interval özelliğini
değiştirmeyi, dolayısıyla kronometrenin hızını ayarlamayı sağlayacak.
7. Biri “Dur”, diğeri “Başla” Text özelliklerine sahip iki Button ekleyin.
Kontrollerin Name özelliklerini sırayla btnDur ve btnBasla olarak
değiştirin.
8. Bir ListBox kontrolü ekleyin ve Name özelliğini lbKayit olarak
değiştirin. Bu kontrol kronometrenin başlama ve durma zamanlarını
kaydetmeyi sağlayacak.
9. Bir TextBox kontrolü ekleyin. Name özelliğini txtSure olarak değiştirin
ve Text özelliğinde yazan yazıyı silin.
10. Eklenen kontrolleri, resim (Resim numarası) de görünen şekilde
düzenleyin.
HERKES İÇİN WINDOWS
14
KISIM I:
Kodların yazılması
1. Formun üzerine sağ tıklayın ve View Code komutunu seçin.
2. Açılan kod sayfasında, KalanSure isimli bir değişken tanımlayın.
public int KalanSure;
3. Formun tasarım görünümüne dönün ve Başla isimli Button
kontrolüne çift tıklayın. btnBasla_Click yordamı içine Timer kontrolünü
ayarlayıp başlatan, ListBox kontrolüne kayıtları giren, kalan süreyi
Label kontrolünde görüntüleyen kodları yazın.
private void btnBasla_Click( System.Object sender,
System.EventArgs e ) {
//
Başlangıç zamanı "KalanSure" değişkenine
atanır.
KalanSure = System.Convert.ToInt32( txtSure.Text
);
// Kalan süre kullanıcıya gösterilir.
lblSure.Text
=
System.Convert.ToString(
KalanSure );
// ListBox kontrolüne kayıt girilir.
lbKayit.Items.Add(
"Kronometre
balad:
DateAndTime.Now.TimeOfDay.ToString() );
//
ComboBox kontrolünden seçilen değer,
//
Timer
kontrolünün
çalışma
"
+
hızını
belirler.
tmrKronometre.Interval = System.Convert.ToInt32(
cmbInterval.Text );
// Timer kontrolünü çalıştırır.
tmrKronometre.Start();
}
HERKES İÇİN UNIX
15
BÖLÜM 1:
4. Dur isimli Button kontrolüne çift tıklayın. btnDur_Click yordamı içine
Timer kontrolünü durduracak ve ListBox kontrolüne kayıtları
ekleyecek kodları yazın.
private void btnDur_Click( System.Object
System.EventArgs e ) {
// Timer kontrolünü durdurur.
tmrKronometre.Stop();
sender,
// ListBox kontrolüne kayıt girilir.
lbKayit.Items.Add( "Kronometre durduruldu: " +
DateAndTime.Now.TimeOfDay.ToString() );
}
5. Tasarım görünümünde tmrKronometre isimli Timer kontrolüne çift
tıklayın. tmrKronometre_Tick yordamı içine kalan süreyi azaltacak ve
süre sıfırlandığında kronometreyi durduracak kodları yazın.
private void tmrKronometre_Tick( System.Object
sender, System.EventArgs e ) {
// Her saniye geçtiğinde sure değeri 1
azalacaktır.
KalanSure = KalanSure - 1;
// KalanSure değeri kullancıya gösterilir
lblSure.Text = System.Convert.ToString(
KalanSure );
durdurulur.
//
KalanSure değeri sıfıra ulaşmışsa kronometre
if ( KalanSure == 0 ) {
tmrKronometre.Stop();
lbKayit.Items.Add( "Süre Doldu: " +
DateAndTime.Now.TimeOfDay.ToString() );
MessageBox.Show( "Süre doldu" );
}
}
6. Projeyi başlatın, metin kutusuna 5 değerini girin. Hız Seçin açılan
kutusundan 1000 değerini seçin ve Başla düğmesine basın.
•
Süre başladıktan ve bittikten sonra ListBox kontrolündeki değişiklikler
nelerdir?
•
Hız 3000 olarak seçildiğinde başlama ve bitiş zamanları arasındaki
süre ne kadardır?
Konu 4: MessageBox
MessageBox, kullanıcıya bilgi göstermek için açılan mesaj kutusudur. Bu mesaj
kutusu dört öğeden oluşur.
•
Text (Yazı): Mesaj kutusunda verilmek istenen bilgiyi tutan yazıdır
HERKES İÇİN WINDOWS
16
KISIM I:
•
Caption (Başlık): Mesaj kutusunun başlığıdır
•
Buttons
•
Icon (Simge): Mesaj kutusunda gösterilecek olan simgeyi ve açıldığı
(Düğmeler):
gösterileceğini belirler.
Mesaj
kutusunda
hangi
düğmelerin
zaman çıkartılacak sesi belirler.
MessageBox.Show("Devam etmek istiyor musunuz?", "Uyarı",
MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
Mesaj kutusu, kapanırken hangi düğmenin basıldığını DialogResult nesnesi
ile programcıya bildirir.
if(MessageBox.Show("Değişiklikler kaydedilsin mi?", "Kayıt",
MessageBoxButtons.YesNoCancel) == DialogResult.Cancel)
{
// İptal tuşuna basıldığı zaman
// buraya girilir.
}
HERKES İÇİN UNIX
17
BÖLÜM 1:
Konu 5: Değişken – Sabit Nedir,
Değişkenlerin ve Sabitlerin Tanımlanması
Değişkenlerin - Sabitlerin Tanımlanması
ƒ Dim anahtar kelimesi ile tanımlanır
int sayi;
string kelime;
ƒ Option Explicit Off, tanımlanmamış değişkenlerin
kullanımına izin verir
ƒ Değişkenlere, kapsam alanı dışından erişilemez
ƒ Sabitler tanımlandıktan sonra değiştirilemez
const int buffer = 255;
Değişken Nedir, Nasıl Tanımlanır
Program yazarken, bazı verilerin daha sonra kullanılmak üzere bir yerde
tutulması gerekebilir. Örneğin bir hesaplama yapılırken, önceden hesaplanmış
verileri kullanmak istenirse, bu verileri tekrar hesaplamak yerine hafızada
tutmak performansı artıracaktır. Veya veritabanından alınan bir kullanıcı isminin
hafızada tutulması, bu değer her istendiğinde veritabanına bağlanıp
alınmasına tercih edilmelidir. Verilerin bu şekilde hafızada tutulması
değişkenler ile sağlanır.
Değişkenler farklı türde verileri tuttukları için, farklı tiplere sahip olabilirler. Bir
negatif veya pozitif sayıyı tutan değişken ile yazı tutan bir değişken farklı tiplere
sahiptirler.
int sayi;
string kelime;
Tanımlanan değişkenlerin tipleri değişken isminden önce belirtilir.
Değişken isimlerini belirlerken bazı noktalara dikkat etmek gerekir.
•
Boşluk, nokta, soru işareti, noktalı virgül, çift tırnak, tek tırnak, aritmetik
operatörler, karşılaştırma ve atama operatörleri, parantezler
kullanılamaz.
•
Sayı ile başlayamaz.
HERKES İÇİN WINDOWS
18
KISIM I:
•
Visual C#.NET dilinde tanımlı anahtar kelimeler kullanılamaz.
İPUCU:
Değişken isimlerinde Türkçe karakter kullanılırsa, farklı dil seçenekli işletim
sistemlerinde çalışma anında hata üretecektir.
Hatalı bazı değişken tanımları:
int int;
short (sayi);
int 333sayisi;
string “kelime”;
string <isim>;
Aynı tipteki değişkenler tek bir satır içinde tanımlanabilir.
int sayi1, sayi2;
Değişkenlere değer atamak = operatörü ile yapılır. Eşitliğin sağ tarafındaki
değer, sol tarafta bulunan değişkene atanır. Dolayısıyla sağ taraftaki ifadenin
değeri değişmez.
sayi1 = 10;
sayi2 = sayi1;
Değişkenler tanımlandıkları sırada başlangıç değeri alabilirler.
string isim = “Enis Günesen”;
Değişkenler program içinde, tuttukları verilere ulaşmak için kullanılır. Ancak
değişkenlere ulaşmak, tanımlandıkları yerde veya alt bloklarda mümkündür.
Bu kavrama değişkenlerin kapsam alanı (Scope) denir.
Kapsam alanı dışındaki bir yerden değişkene ulaşılamaz.
namespace NameSpace1
{
class Class1
{
int SinifDegiskeni;
void Sub1()
{
int YordamDegiskeni;
while(true)
{
int DonguDegiskeni;
}
}
void Sub2()
{
int YordamDegiskeni2;
}
}
}
Tablo 0-i, kod bloklarından hangi değişkenlere ulaşabilindiğini gösterir.
Class1
Sub1
Sub2
HERKES İÇİN UNIX
Loop
19
BÖLÜM 1:
SinifDegiskeni
Evet
YordamDegiskeni
Evet
Evet
Evet
YordamDegiskeni2
Evet
Evet
Evet
DonguDegiskeni
Evet
Evet
Tablo 0-i
Uygulamanın çalışması değişkenlerin kapsam alanlarındayken, bu değişkenler
bellekte tutulur. Dolayısıyla değişkenlerin tanımlandıkları yer, kullanılacağı
amaca göre seçilmelidir. Örneğin bir değişken birden fazla yordamda
kullanılacaksa, bir üst düzeyde (Class düzeyinde) tanımlanmaları gerekir.
Ancak sadece bir yordam içinde kullanılan değişkenler class düzeyinde
tanımlanırsa, fazladan bellekte yer tutar ve performans düşer. Class
seviyesindeki değişkenler, aynı class içindeki fonksiyonlar ile değiştirebilir ve
class örneğinin yaşam süresinde ilgili özelliklerine erişim sağlanabilir.
Sabit Nedir, Nasıl Tanımlanır
Sabit, sürekli aynı değeri tutan değişkendir. Uygulamanın çalışması boyunca
değişmeyen bir değer kullanılıyorsa sabit kullanılması, kodun kolay
okunmasını sağlayacaktır.
Sabitler tanımlandıktan sonra değiştirilemeyeceği için, tanımlandıkları anda
değerlerinin verilmesi gerekir.
const int x = 1;
Sabitlerin kapsam alanları değişkenler ile aynıdır.
HERKES İÇİN WINDOWS
20
KISIM I:
Veri Tipleri
Veri Tipleri
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
Boolean
Byte
Char
Date
Decimal
Double
Int16 - Short
Int32 - Integer
Int64 – Long
Single
String
String yazi = "Veri tipleri örnekleri“;
boolean bool = True;
char karakter = "A“;
date tarih = #4/23/2005#;
decimal numerik = -123456789;
double cift = -1.234E-120;
single tek = 3.32E+100;
byte bayt = 255;
short kisaSayi = -32000;
int tamSayi = 2000000000;
long uzunSayi = -123456789123456789;
Veri tipi, değişkenlerin tuttukları değerlerin türünü ve bellekte tutulacak
boyutunu tanımlar. Değişkenleri veri tipleri ile tanımlarken verinin boyutuna
göre bir veri tipi seçilmelidir.
Visual C#.NET veri tipleri Tablo 1’de listelenmiştir.
Veri Tipi
Boyut
Değer
bool
2 Bayt
true – false
byte
1 Bayt
0 – 255
char
2 Bayt
Tek bir Unicode karakteri tutar
decimal
16 Bayt
Maksimum 29 haneli sayı tutar. +/79,228,162,514,264,337,593,543,950,335
arasında değer alır
double
8 Bayt
Negatif sayı aralığı:
-1.79769E+308 ile -4.94065E-324
Pozitif sayı aralığı:
4.94065E-324 ile 1.79769E+308
Int32
4 Bayt
-2,147,483,648 – 2,147,483,647
Int16
2 Bayt
32,768 – 32,767
Int64
8 Bayt
-9,223,372,036,854,775,808
9,223,372,036,854,775,807.
float
4 Bayt
Negatif sayı aralığı:
-3.4028235E+38 ile -1.401298E-45
Pozitif sayı aralığı:
HERKES İÇİN UNIX
–
21
BÖLÜM 1:
1.401298E-45 ile 3.4028235E+38
string
Maksimum
2,147,483,647
karakter tutar
Unicode
Tablo 1
double ve float veri tiplerinin aralığında belirtilen “E + sayı” ifadesi, 10 ^ sayı
ile çarpılacağını belirtir. Örneğin 12 E-3 ifadesi, 12 * 0.001 anlamına gelir.
-1.7E-5 = -0.000017
-1.7E+10 = -17000000000.0
0.7432E+2 = 74.32
7432E-3 = 7.432
NOT: Int16, Int32, Int64 .NET veri tipleridir. Visual C# dilindeki karşılıkları short,
int, long veri tipleridir.
string yazi = "Veri tipleri örnekleri";
bool b = true;
char karakter = "A";
decimal numerik = -123456789;
double cift = -1.234E-120;
float tek = 3.32E+100;
byte bayt = 255;
short kisaSayi = -32000;
int tamSayi = 2000000000;
long uzunSayi = -123456789123456789;
Büyük veri tiplerinden küçük veri tiplerine dönüşüm sırasında, değer kayıpları
meydana gelebilir. Örneğin float tipinden short tipine yapılacak bir
dönüşümde virgülden sonraki sayılar kaybedilecektir.
float virgullu = 1.12;
short kisaSayi = (float) virgullu;
// kisaSayi değişkenin son değeri 1 olur
HERKES İÇİN WINDOWS
22
KISIM I:
struct
ƒ Kullanıcı tanımlı veri tipi
struct Nokta
{
int x;
int y;
void Degistir(int yeniX , int yeniY)
{
x = yeniX;
y = yeniY;
}
}
struct Ucgen
{
Nokta n1;
Nokta n2;
Nokta n3;
}
struct veri tipleri, programcıların kendilerinin tanımladığı veri tipleridir. struct,
birkaç veri tipinin bir araya getirilip oluşturulduğu bileşik bir tiptir. struct veri
tiplerinde yordam tanımları da yapılabilir.
struct Nokta
{
int x;
int y;
void Degistir(int yeniX , int yeniY)
{
x = yeniX;
y = yeniY;
}
}
struct Ucgen
{
Nokta n1;
Nokta n2;
Nokta n3;
}
HERKES İÇİN UNIX
23
BÖLÜM 1:
Dizilerle Çalışmak
Diziler
ƒ Aynı tipte veriyi bir arada tutar
ƒ Birden fazla boyutlu olabilir
string []
string []
string []
// ...
isimler =
isimler;
isimler = new string[10];
isimler;
new string[4];
ƒ Length, Rank
ƒ GetLength, Clear, Reverse, IndexOf
Dizi değişkenleri, aynı tipte birçok veriyi bir arada tutmayı sağlar. Benzer
işlemlerde kullanılan değişkenler bir dizi altında listelenebilir. Örneğin
kullanıcıdan alınan isimler String tipinde bir dizi içinde toplanabilir.
string [] isimler;
Dizilerin kaç eleman içereceği, dizi tanımlanırken ya da daha sonra belirtilebilir:
string [] isimler = new string[10];
string [] isimler;
// ...
isimler = new string[4];
Dizilerin indisleri sıfırdan başlar. Örnekteki isimler dizisinin 4 tane String
tipinden elemanı vardır.
Dizilerin elemanlarına ulaşmak için, istenilen elemanın indisi verilmesi gerekir.
isimler[0]
isimler[1]
isimler[2]
isimler[3]
=
=
=
=
“Ali”;
“Ahmet”;
“Mehmet”;
“Ayşe”;
MessageBox.Show(isimler[3]);
HERKES İÇİN WINDOWS
24
KISIM I:
Dizilere tek tek değer atanabildiği gibi, tanımlarken de başlangıç değerleri
atanabilir.
string [] isimler = {"Ali","Ahmet","Mehmet","Ayşe"};
Diziler tek boyutlu olduğu gibi, birkaç boyutlu diziler de tanımlanabilir.
// İlk boyutunda 5, İkinci boyutunda 6 int değeri olan
// 2 boyutlu dizi
int [,] matris = new int[5,6];
Burada dizinin ilk boyutunda 5 tane eleman vardır. İlk boyuttaki her eleman için
İkinci boyutta 6 eleman bulunur. Dolayısıyla toplam 30 elemanlı bir dizidir. Bu
dizide bir boyut daha olsaydı, o boyutun her elemanı için diğer boyutlardaki 30
eleman bulunacaktı.
Çok boyutlu dizilerin eleman sayıları boyutlarındaki eleman sayılarını çarparak
hesaplanabilir.
int [,,,,] dizi = new int[boyut1,boyut2,boyut3,... ,boyutn];
// Eleman sayısı:
// boyut1 * boyut2 * ... * boyutN
Çok boyutlu dizilere başlangıç değerleri, dizinin boyutu dikkate alınarak
verilmelidir. Boyutlardaki elemanlar küme parantezleri ile gruplanmalıdır.
// İlk boyutunda 2, ikinci boyutunda 4 eleman olan
// 2 boyutlu dizi
int [,] matris = {{1, 2, 3, 4}, {5, 6, 7, 8}};
Çok boyutlu dizilerin elemanlarına ulaşmak için, her boyut için indis göstermek
gerekir.
matris[0, 0] = 1;
Bazı dizi özellikleri ve metotları
Diziler, .NET Framework içinde tanımlı Array sınıfı temsil eder. Tüm diziler
Array sınıfında tanımlı özellikleri ve metotları kullanırlar.
•
Length
Dizinin bütün boyutlarındaki toplam eleman sayısını veren özelliktir.
ComboBox [] ComboBoxDizisi = new ComboBox[20];
MessageBox.Show(ComboBoxDizisi.Length.ToString());
// Sonuç = 20
int [] dizi = new int[1, 4, 4, 5, 6];
MessageBox.Show(dizi.Length.ToString());
// Sonuç = 2 * 5 * 5 * 6 * 7 = 2100
•
Rank
Dizinin boyut sayısını veren özelliktir.
MessageBox.Show(dizi.Rank.ToString());
// Sonuç = 5
•
GetLength
HERKES İÇİN UNIX
25
BÖLÜM 1:
İndisi verilen boyutun kaç elemanlı olduğunu gösterir. Burada indisin
sıfırdan başladığına dikkat edilmelidir.
int [,,,,] dizi = new int[10, 40, 50, 80, 90];
MessageBox.Show(dizi.GetLength(4).ToString());
// Sonuç = 90
Clear, Reverse, IndexOf metotları Array sınıfında Shared (paylaştırılmış)
olarak tanımlı metotlardır. İşlemin yapılacağı dizi parametre olarak verilmelidir.
•
Clear
Parametre olarak verilen dizinin, belirtilen indis aralığındaki tüm değerleri
temizler. Temizleme işleminde atanan değer, dizi elemanlarının tiplerine
göre değişir. Örneğin int tipinde tanımlı bir dizinin elemanları temizlenirse
0 değerini alacaktır. Buna karşın String tipindeki elemanlar “” (boş yazı)
değerini alır.
int []dizi= {12, 13, 14, 15};
// 1. indisten başlayarak, 3 elemanı temizle
Array.Clear(dizi, 1, 3);
MessageBox.Show(dizi[2].ToString());
//Sonuç = 0
•
// Dizinin tüm elemanlarını temizler
Array.Clear(dizi, 0, dizi.Length);
Reverse
Parametre olarak verilen dizinin eleman sırasını tersine çevirir. Dizinin tüm
elemanlarının veya belirli indis aralığındaki elemanlarının sırası tersine
çevrilebilir.
string [] harfler = {"A", "B", "C"};
Array.Reverse(harfler);
MessageBox.Show(harfler[2]);
// Sonuç = A
string [] harfler = {"A", "B", "C"};
Array.Reverse(harfler, 0, 1);
MessageBox.Show(harfler[2]);
// Sonuç = C
•
IndexOf
İlk parametrede verilen dizide, ikinci parametrede verilen değeri arar.
Aranan değer dizide bulunursa indisi, bulunamazsa -1 döndürür.
float [] notlar = {78.1, 99.9, 100, 12.2};
float maxNot = 100;
MessageBox.Show(Array.IndexOf(notlar, maxNot).ToString());
// Aranan maxNot değerinin indisi = 2
HERKES İÇİN WINDOWS
26
KISIM I:
Debug
Debug
ƒ BreakPoint ile çalışma durdurulur
ƒ Değişkenlerin durumları izlenir
ƒ Autos, Locals, Watch panelleri
ƒ Kodlar arasında ilerlenerek her etapta
değişkenler izlenir
ƒ Step Into, Step Over, Step Out, Continue
Visual Studio Debug aracı, çalışma anında kodlar arasında satır satır
ilerleyerek hataları bulmayı sağlar. İncelemeye başlamak istenen kod satırı
üzerinde bir BreakPoint (durma noktası) konarak, hata ayıklayıcının bu satır
çalıştırılmadan önce orada durması sağlanır.
Uygulama çalıştırıldığında, BreakPoint konulan kod satırına kadar durmaz.
Belirtilen satıra sıra gelindiğinde, kod sayfasında, o an üzerinde bulunan satır
ok ile gösterilir. Visual Studio ile hata ayıklarken, tanımlanan değişkenlerin o
andaki değerler incelenerek mantıksal hatalar bulunabilir.
HERKES İÇİN UNIX
27
BÖLÜM 1:
Hata ayıklama sırasında bazı Visual Studio panelleri, değişkenlerin, kontrollerin
ve nesnelerin değerlerini listelemek için kullanılabilir. Bu paneller Debug
menüsünde Windows alt menüsünden gösterilir.
• Autos Paneli
Çalışmakta olan satırdaki ifade ile bir önceki ifadede bulunan değişken ve
kontrollerin değerlerini listeler.
• Locals Paneli
İçinde bulunan kapsam alanındaki tüm değişkenlerin değerlerini listeler.
• Watch Paneli
Değeri incelenmek istenen değişken veya kontroller bu panele elle yazılmalıdır.
Kodlar arasında ilerlemek ve hata ayıklamaya devam etmek için dört yol vardır.
Bu komutlar Debug menüsünden veya Debug araç çubuğundan ulaşılabilir.
1. Step Into
Kod satırında bir yordam çalıştırılacaksa, bu yordamın içine girer. Bu
yordam farklı bir yerde ise, ilgili sayfa açılır ve hata ayıklamaya devam
edilir.
2. Step Over
Herhangi bir yordam içine girmeden, içindeki kapsam alanında çalışmaya
devam eder.
3. Step Out
Bulunan yordamdan çıkarak hata ayıklamaya devam eder.
4. Continue
Birden fazla durma noktası yerleştirilmişse, bir sonraki noktaya kadar
çalışmaya devam eder.
Hata ayıklama, çalıştırılacak hiçbir satır kalmadığında durur ve uygulama
normal çalışmasına devam eder. Durma noktaları kaldırılarak ya da pasif hale
getirilerek uygulamanın durması engellenebilir.
Bütün durma noktalarını kaldırmak için Debug menüsünden Clear All
BreakPoints komutu, pasif hale getirmek için Disable All BreakPoints
komutu verilmelidir. Durma noktalarını aktif hale getirmek için tekrar aynı komut
seçilmelidir.
HERKES İÇİN WINDOWS
28
KISIM I:
Alıştırma
Bu uygulamada veri tiplerinin kullanım yerlerine, diziler ile çalışma örneklerine
bakılacaktır.
struct veri tipi
1. Sınıf isminde bir Windows projesi açın.
2. Açılan form üzerine sağ tıklayarak View Code komutunu seçin. Kod
sayfasında class düzeyinde bir struct tanımlayın.
public struct Ogrenci {
public string Isim;
public string Soyad;
public char Sube;
public float OrtalamaNotu;
public bool DevamEdiyor;
}
3. Ogrenci tipindeki değerleri tutmak için, class düzeyinde iki elemanlı bir
dizi tanımlayın
public Ogrenci[] ogrenciler = new Ogrenci[2];
4. Formun Load olayına, uygulama açılırken yeni öğrenci ekleme
kodlarını yazın.
Ogrenci ogrenci1 = new Ogrenci();
ogrenci1.Isim = "Ali";
ogrenci1.Soyad = "Veli";
ogrenci1.Sube = "C";
ogrenci1.OrtalamaNotu = 67.1;
ogrenci1.DevamEdiyor = true;
Ogrenci ogrenci2 = new Ogrenci();
ogrenci2.Isim = "Ahmet";
ogrenci2.Soyad = "Veli";
ogrenci2.Sube = "C";
ogrenci2.OrtalamaNotu = 72.9;
ogrenci2.DevamEdiyor = true;
ogrenciler[ 0 ] = ogrenci1;
ogrenciler[ 1 ] = ogrenci2;
5. Forma btnOgrenciEkle isminde bir Button kontrolü yerleştirin. Bu
kontrolün Click olayına, diziye yeni bir öğrenci kaydı ekleyen kodu
ekleyin.
// ogrenciler dizinde boş yer kalmadığı için
// diziyi, eski değerleri kaybetmeden tekrar
// boyutlandırmak gerekir.
Ogrenci[] gecici = new Ogrenci[ 3 ];
System.Array.Copy( ogrenciler, gecici,2 );
ogrenciler = gecici;
Ogrenci ogrenci = new Ogrenci();
ogrenci.Isim = "Veli";
ogrenci.Soyad = "Veli";
ogrenci.Sube = char.Parse( "D" );
HERKES İÇİN UNIX
29
BÖLÜM 1:
ogrenci.OrtalamaNotu = System.Convert.ToSingle( 92.1 );
ogrenci.DevamEdiyor = false;
ogrenciler[ 2 ] = ogrenci;
ogrenciler dizisine başka bir yordamdan nasıl erişildi?
Formun Load olayında ogrenci isimli bir değişken tanımlandığı halde, Button
kontrolünün Click olayında aynı isimde bir değişken nasıl tanımlanabiliyor?
Dizi işlemleri
1. Forma bntOzellikleriGoruntule isminde bir Button kontrolü ekleyin ve
Click olayında, diziden indisi verilen öğrenciyi alan kodları yazın.
int indis = Int32.Parse(textBox1.Text);
Ogrenci secilenOgrenci = new Ogrenci();
secilenOgrenci = (Ogrenci)ogrenciler[indis];
string bilgiler = null;
bilgiler
bilgiler
bilgiler
bilgiler
bilgiler
+=secilenOgrenci.Isim + " " + secilenOgrenci.Soyad;
+="\n";
+="Notu: " + secilenOgrenci.OrtalamaNotu + "\n";
+="Şubesi: " + secilenOgrenci.Sube + "\n";
+="Devam ediyor mu: " + secilenOgrenci.DevamEdiyor;
MessageBox.Show(bilgiler, MsgBoxStyle.Information, "Öğrenci
Bilgileri" );
İPUCU: "\n"ifadesi, String değişkenlerinde yeni satıra geçilmesini sağlar.
Aritmetik işlemler
1. Forma btnOrtalamaHesapla isminde bir Button kontrolü ekleyin ve
Click olayında sınıfın ortalamasını hesaplayan kodu yazın.
double not1 = ogrenciler[ 0 ].OrtalamaNotu;
double not2 = ogrenciler[ 1 ].OrtalamaNotu;
double not3 = ogrenciler[ 2 ].OrtalamaNotu;
int ortalama = ( ( int )( ( not1 + not2 + not3 ) / 3 ) );
MessageBox.Show( ortalama.ToString() );
2. Not3 değişkeninin tanımlandığı yere BreakPoint koyun ve projeyi
çalıştırın.
3. Form açıldığında btnOrtalamaHesapla düğmesine basın.
Uygulamanın çalışması durma noktası konulan yerde duracaktır.
4. Debug menüsünden Windows alt menüsünden Autos komutunu seçin.
Autos panelinde not1 ve not2 değişkenlerinin değerlerini inceleyin.
5. Debug menüsünden Windows alt menüsünden Watch komutunu seçin.
Watch panelinde Name sütununa “ogrenciler” yazın. ogrenciler dizisini
+ düğmesine basarak genişletin ve dizinin elemanlarının değerlerini
inceleyin.
HERKES İÇİN WINDOWS
30
KISIM I:
6. Debug menüsünden Step Into komutunu seçin. Bu işlemi Debug
araç çubuğu ile ya da F11 tuşuna basarak yapabilirsiniz.
7. Gösterilen hata mesajını inceleyin. Continue düğmesine basarak
uygulamayı sonlandırın.
8. Uygulamayı tekrar çalıştırın ve önce btnOgrenciEkle düğmesine
daha sonra btnOrtalamaHesapla düğmesine basın.
Konu 8: Operatörler
Operatörler
ƒ Aritmetik Operatörler
ƒ Çarpma *, Bölme /, Toplama +, Çıkarma ƒ Üs alma ^, Mod alma (Mod)
ƒ Karşılaştırma Operatörleri
ƒ Küçük <, Küçük Eşit =<, Büyük >,
ƒ Büyük Eşit >=, Eşit =, Eşit Değil <>
ƒ String Operatörleri
ƒ &, Split, ToCharArray, Insert, Remove
Visual C# .NET dilinde çalışırken, değişkenler üzerinde birçok işlem yapılır.
Hesaplamalarda aritmetik işlemler, kontrollerde karşılaştırma işlemleri veya
mantıksal işlemler yapılır. Bu işlemler için Visual C# .NET dilinde tanımlı
operatörler kullanılır.
Aritmetiksel Operatörler
Bu operatörler aritmetik işlemlerinde, sayılarla veya sayı tutan ifadelerle
kullanılır.
•
Çarpma
int sayi = 100;
sayi = 200 * 2;
•
Bölme
double bolum;
bolum = sayi / 23;
•
Çıkarma
HERKES İÇİN UNIX
31
BÖLÜM 1:
int sonuc = bolum – 100;
•
Toplama
int toplam;
toplam += sonuc;
// Bu ifade, “toplam = toplam + sonuc” ile aynı anlama gelir
İPUCU:
Aritmetik operatörleri, eşittir ifadesi ile beraber kullanılırsa, işlem değişkenin
kendisi ile yapılır.
•
Mod alma
int kalan = toplam % 42;
// Sonuç, toplam değişkenindeki değerin 42 ile
// bölümünden kalan sayıdır.
Karşılaştırma Operatörleri
Bu operatörler veri tiplerini birbirleriyle karşılaştırmak için kullanılır. Bu
operatörler ile yapılan işlemlerin sonucunda true ya da false değeri döner.
Karşılaştırma operatörleri yalnızca sayı tipleri üzerinde yapılmaz.
•
Küçük
double sayi = 1.5;
float sayi2 = 1.3;
sayi2 < sayi
// Sonuç: True
•
Küçük Eşit
sayi2 <= sayi
// Sonuç: True
•
Büyük
sayi2 > sayi
// Sonuç: False
•
Büyük Eşit
sayi2 >= sayi
// Sonuç: False
•
Eşit
sayi2 == sayi
// Sonuç: False
•
Eşit Değil
sayi2 != sayi
// Sonuç: True
HERKES İÇİN WINDOWS
32
KISIM I:
String Operatörleri
String tipleri üzerinde gerçekleştirilen işlemler için tanımlı operatörlerdir.
•
String tipindeki değişkenleri birbirine bağlama + operatörü ile
gerçekleşir.
string isim, soyad;
string IsimSoyad = isim + " " + soyad;
•
Split
Belirtilen ayraca göre yazıyı böler, çıkan sonuç String dizisinde tutulur.
Ayraç karakterleri sonuç dizisinde yer almaz.
string Kelime = "Kelime1:Kelime2:Kelime3";
string [] parcalar;
parcalar = Kelime.Split(':');
// parcalar dizisinin üç elemanı olur:
// Kelime1
// Kelime2
// Kelime3
string [] parcalar2;
parcalar2 = Kelime.Split('m');
// parcalar2 dizisinin dört elemanı olur:
// Keli
// e1:Keli
// e2:Keli
// e3
•
ToCharArray
String değerinin belli bir bölümündeki karakterleri ya da tüm karakterlerini,
Char dizisi olarak döndürür.
char []harfler = "Kelime".ToCharArray();
// Dizinin 1. elemanından başlayarak 4 karakter oku
char [] harfler = "Kelime".ToCharArray(1,4);
•
Insert
String tipinde bir değişkenin değerine, ilk parametrede belirtilen yerden
başlayarak ikinci parametredeki değeri ekler. Ancak bu değişkenin
değeriyle oynamaz. Yeni oluşturulan String ifadesini döndürür.
string sayilar = "0123456789";
string yeniSayilar;
yeniSayilar = sayilar.Insert(5, "--- Rakamlar ---");
MessageBox.Show(yeniSayilar);
// Sonuç: 01234--- Rakamlar ---56789
•
Remove
İlk parametrede verilen değerden başlayarak, ikinci parametredeki değer
kadar karakter, değişkenden çıkarılır.
yeniSayilar = yeniSayilar.Remove(4, yeniSayilar.Length - 4);
MessageBox.Show(yeniSayilar);
// Sonuç: 0123
HERKES İÇİN UNIX
33
BÖLÜM 1:
Modül Sonu Soruları & Alıştırmalar
Özet
Â
Â
Â
Â
Â
Â
Windows Tabanlı Uygulamalar
Özellikler, Metotlar, Olaylar
Windows kontrolleri
Değişken, Sabit Tanımları
Veri Tipleri
Operatörler
1. Arabanın fren yapması ve arabaya çarpılması, .NET nesnelerinin
hangi kavramlarına girer?
2. 10 saniyede bir, ListBox kontrolüne, kullanıcıdan alınan değerleri
ekleyen kodları yazın.
3. Değişkenler ile sabitlerin farkı nedir?
4. 5 < 6 = -1 ifadesi hangi Boolean değerini döndürür, neden? Option
Strict On seçildiğinde çıkan hata mesajını inceleyin.
HERKES İÇİN WINDOWS
Modül 5: Algoritma ve Dump Coding
Hedefler
 Algoritma kurmak
 Dump Coding çözümlemesi
 Akış diyagramları
Programlamanın temelinde, çalışma akışını, izlenecek yolları belirleyen
algoritmalar vardır. Bir iş yapılmaya başlanmadan önce nasıl planlanıyorsa,
kodlamaya geçilmeden önce de bir çalışma planı belirlenmelidir. Programlar,
bu planda yazılan kodları belli bir sıra ile okur ve işler. Dolayısıyla algoritma
yapısını çok iyi kurmak gerekir. Kurulan algoritmalar akış diyagramları ile
görsel zenginlik kazanırlar.
Dump Coding yöntemi algoritmaları çözmenin uzun fakat etkili bir yoludur. Bu
yöntem, adımları tek tek inceleyerek algoritma akışını çözer.
Bu modül tamamlandıktan sonra:
•
Algoritma kurmayı öğrenecek,
•
Dump Coding ile algoritmaları çözümleyecek,
•
Akış diyagramları ile algoritmaları görsel olarak ifade edebileceksiniz.
HERKES İÇİN UNIX
2
KISIM I:
Konu 1: Algoritma Nedir?
Algoritma
ƒ İşin yapılma sırasının belirlenmesidir.
ƒ İş, en küçük etaplara ayrılır.
ƒ Olası tüm hataların tespit edilmesi,
gerekli kontrollerin yapılması gerekir.
ƒ Algoritmanın yönü belirlenmelidir
ƒ Veri girişi
ƒ Kararlar
ƒ İşlemler
Algoritma, bir işin hangi etaplardan geçilerek yapılacağını gösteren çalışma
planıdır. Algoritma bir programlama dili değildir. Programlama dillerine yol
gösteren bir yöntem dizisidir. Her dilde algoritma yazılıp uygulanabilir. Örneğin
bir cep telefonunun el kitapçığında yazan, rehber kaydı girmek için izlenecek
yollar, o işin algoritmasıdır.
Algoritma yazarken, programın çalışması için kullanılan kaynakların, yapılması
gereken kontrollerin veya işlemlerin açıkça ifade edilmesi gerekir. Ayrıca iyi bir
algoritma, tüm ihtimalleri kontrol edip istenmeyen durumlarda ne yapılması
gerektiğini belirtmesi gerekir.
Örneğin, bir e-ticaret uygulamasında ürün satış algoritması çıkarılır. Satın
alınacak ürün seçildikten sonra, kullanıcıdan adet miktarı bilgisi alınır.
Uygulama yazılırken, bu değerin Int16 veri tipinde olacağına karar verildiği
düşünülürse; kullanıcının girdiği adet miktarı bu değişkene atanmadan önce
kontrol edilmelidir. Eğer Int16 veri tipinin tutamayacağı bir değer girilmişse,
çalışma anında uygulamanın beklenmedik şekilde durduğu ya da istenmeyen
sonuçların üretildiği gözlemlenir. Ayrıca sistemin verdiği hata, kullanıcının
anlamayacağı bir mesaj içereceği için, uygulamanın imajını da kötü yönde
etkiler.
Veri girişi: Çalışma zamanında çoğu zaman, işleyişin tamamlanması için
dışarıdan bir bilgi girilmesi gerekir. Algoritmanın çalışması için ihtiyaç duyduğu
HERKES İÇİN UNIX
3
BÖLÜM 1:
veriler, işlemi başlatan kişiden veya belirtilen bir kaynaktan alınabilir. Bu bilgiler
sağlanmadan işlem devam etmez.
Kararlar: Karar ve kontrol yapıları algoritmanın akışını yönlendiren en önemli
kavramlardır. Girilen veya işlem sonucunda elde edilen veriler, işlemin amacına
göre kontrol edilir ve sonuca göre algoritma akışı istenilen yere yönlendirilir.
İşlemler: Algoritmanın akışı boyunca veriler üzerinde değişiklikler, yeni değer
atamaları gibi işlemlere ihtiyaç duyulur. Algoritmalar kurulurken, yapılan
işlemlerin yalın halde, tek tek yazılması okunabilirliği arttırır.
Algoritmalar adım sırası ile çalışır ve karar yapıları sonucunda farklı bir yere
yönlendirilmediği müddetçe, bir sonraki adım ile işlemeye devam eder.
Örnek: Telefon kulübesinden telefon açmak için örnek bir algoritma
1. Telefon kulübesine git
2. Telefon kartı al
3. Telefon sırasında kaç kişi olduğuna bak
4. Kişi sayısı sıfırdan fazlaysa 3 e dön
5. Kapı kapalıysa kapıyı aç
6. İçeri gir, kapıyı kapat
7. Telefon kartını telefona yerleştir
8. Ahizeyi kaldır
9. Numarayı çevir
10. Konuşmanın bitip bitmediğine bak
11. Konuşma bittiyse kartı al, bitmediyse 10 a dön
12. Bir daha konuşma yapılacaksa 7 e dön
13. Kapıyı aç, dışarı çık
Bu algoritmanın işlemesi için, her ihtimal gözden geçirilerek, algoritma akışı
gerekli yerlere yönlendirilir. Örneğin kapının kapalı olması durumunda kapıyı
açmak için gerekli komutlar verilmelidir. Bu algoritmanın ihtiyaç duyduğu
veriler, ya kullanıcı tarafından verilir ya da işlem başlamadan önce belirlidir.
Sıradaki kişi sayısı, telefon kartı gibi veriler kullanıcı tarafından sağlanmış;
çevrilecek numara, algoritma başlamadan önce belirlenmiştir.
HERKES İÇİN UNIX
4
KISIM I:
Konu 2: Dump Coding Nedir?
Dump Coding
ƒ Karışık algoritmaların çözümlenmesi
ƒ Değişkenlerin değerleri yazılarak işleyiş takip
edilir.
Dump Coding, aptal kodlama anlamına gelir. Bu yöntem birçok karışık
algoritmayı çözümlememizi sağlar.
Dump coding yöntemi, algoritmanın her adımında, değişkenlerin tek tek
değerlerini yazıp işleyişi takip etmektir.
Örnek: İki sayının OBEB ini (ortak bölenlerin en büyüğünü) alan
algoritmalardan bir tanesi Euclid tarafından geliştirilmiştir.
1.
2.
3.
4.
İki sayı gir. Büyük A, küçük B
A sayısı B sayısına böl. Tam bölünüyorsa, OBEB B sayısıdır. Çıkış
A sayısının değerini, Kalan sayının değeri yap
A ile B sayılarını yer değiştir. İkinci etaba dön
Bu algoritmanın çalışma mantığı, Dump Coding yöntemi ile adım adım
incelenir.
1. İki sayı girilir. A = 12 ve B = 8
2. A sayısı, B sayısına tam bölünmüyor. Algoritma diğer etaptan devam
eder.
3. Kalan sayı = 4. Dolayısıyla A = 4 olur.
4. A sayısı ile B sayısı yer değiştirilir. A = 8 ve B = 4 olur. İkinci etaba
dönülür.
HERKES İÇİN UNIX
5
BÖLÜM 1:
5. A sayısı B sayısına tam bölünüyor. OBEB = 4
Konu 3: Akış Diyagramlarında Kullanılan
Semboller
Akış Diyagramı
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
Başla – Bitir
Veri Girişi
Karar Verme
Veri Tabanı
Ekran
Printer
Fonksiyon
Devam
Madde madde yazılan algoritmaların okunması kolaydır ancak işleyişin
bütününü görmek çoğu zaman mümkün değildir. Akış diyagramları,
algoritmaları görsel biçimde göstermeyi, dolayısıyla daha anlaşılır hale
getirmeyi sağlar. Algoritmada yapılacak işlemlerin çeşitlerine göre çeşitli
semboller kullanılır.
• Başla – Bitir
Algoritmanın hangi aşamadan başlayacağını ve ne zaman biteceğini
gösteren semboldür. Bir algoritmayı temsil eden akış diyagramında, bir
tane Başla ve bir tane Bitir sembolü olmalıdır.
HERKES İÇİN UNIX
6
KISIM I:
• Veri Girişi
Kullanıcıdan ve başka bir kaynaktan alınan verilerin isimlerini tutar.
• Karar Verme
Karar yapısını belirten semboldür. Üstünde koşul ifadesi belirtilir.
• Veri tabanı
Veri tabanında okuma veya yazma işlemi yapıldığını gösterir.
• Ekran
Üzerinde yazılan yazının bilgi olarak ekranda gözükeceğini belirtir.
• Printer
Üzerinde yazılan yazının yazıcıdan çıkarılacağını belirtir.
• İşlem
Bir işlem yapılacağını belirten semboldür. Her işlem için ayrı bir fonksiyon
sembolü kullanılması, akış diyagramını daha anlaşılır kılar.
HERKES İÇİN UNIX
7
BÖLÜM 1:
• Fonksiyon
İşlem sembolüne yazılamayacak büyüklükte işlemler, alt işlem olarak bu
sembolle belirtilir.
Konu 4: Algoritma Uygulamaları
Bilet Satma
Bir tiyatro uygulamasının sürekli gerçekleştireceği temel işlem bilet satmaktır.
Bu işlemi gerçekleştirmek için gerekli kodlar yazılmadan önce, algoritma
kurulmalıdır.
1. Kullanıcının istediği oyun, gün ve yer bilgileri alınır.
2. Veritabanı sorgulanarak, belirtilen günde oynayan oyunun boş yerleri
çıkartılır.
3. Boş yer sayısı sıfırsa, o günde belirtilen oyun oynamıyordur ya da
oyundaki bütün yerler satılmıştır.
4. Her iki durumda da bilet kesilemediği için ekrana hata mesajı gösterilir.
Gün ve oyun bilgilerini baştan almak için ilk etaba dönülür.
5. Kullanıcıdan oturmak istediği yer bilgisi alınır.
6. İstediği yerin dolu olup olmadığı kontrol edilir.
7. Yer dolu ise ekrana hata mesajı gösterilir ve yer bilgisi tekrar alınmak
üzere 5. etaba dönülür.
8. Yer boşsa, veritabanında oyunun yer kayıtları güncellenir.
9. İstenilen gün, oyun ve yer bilgilerini içeren bilet yazıcıdan çıkartılır.
HERKES İÇİN UNIX
8
KISIM I:
Çay Demleme
Bu örnekte, bir çay demleme işleminde yapılması gereken işlemleri, kontrol
edilmesi gereken olayları içeren algoritma kurulur.
1. Kullanıcıdan su vermesi beklenir.
2. Suyu ısıtma işlemi yapılır.
3. Suyun kaynayıp kaynamadığı kontrol edilir. Kaynamamışsa 2. etaba
dönülür.
4. Çay daha önceden hazır olduğu için, kullanıcıdan beklenmez. Demliğe
çay koyma işlemi yapılır.
5. Kullanıcıdan, demleme işleminin ne kadar süreceği bilgisi alınır.
6. Kullanıcıdan alınan demleme süresi ile şimdiki zaman (çayın demlenmeye
başladığı zaman) toplanır. Çıkan değer, BitisZamani isimli değişkene atılır.
Bu değişken demleme işleminin ne zaman biteceği bilgisini tutar.
7. Şimdiki zaman, bitiş zamanından küçükse çayın demlenmesi için ayrılan
süre daha dolmamış demektir. Bu süre dolana kadar 7. etap tekrarlanır.
8. Çayın demlendiğini, kullanıcıya ekran üzerinde bildiren bir mesaj çıkartılır.
HERKES İÇİN UNIX
9
BÖLÜM 1:
Üniversite Eğitim Notunu Hesaplama
Üniversitede bir dersin başarı notu, genelde bir vize ve bir final notu hesaplanır.
Vize notunun katsayısı finalden daha düşüktür. Sonuçta çıkan not 50 ve
üstüyse öğrenci geçer, 50 altıysa kalır. Bu örnek, vizenin %30 ve finalin %70
ağırlıklı olduğu başarı notunun hesaplanmasını akış diyagramı ile gösterir.
1. Notu hesaplanacak öğrencinin numarası kullanıcıdan alınır.
2. Veritabanından öğrencinin vize ve final notları çekilir.
3. Eğer final notu 28 veya daha düşükse öğrenci kalır ve 9. etaba gidilir. Bu
durumda vize notu 100 olsa dahi, sonuç olarak toplanan not 50 altında
olur. Dolayısıyla öğrencinin kalması kesinleşir. Böyle bir kontrol yapılması,
gereksiz işlemlerin yapılmasını engeller.
4. Vize değişkenine, veritabanından alınan vize notunun %30 u atanır.
5. Final değişkenine, veritabanından alınan final notunun %70 i atanır.
6. Sonuc değişkenine, vize ve final değerlerinin toplamı atanır.
7. Sonuc değerinin 50’den büyük olup olmadığı kontrol edilir.
8. Sonuc 50’den büyükse ekrana “Geçtiniz” yazan bir mesaj çıkartılır.
Algoritmadan çıkılır.
9. Sonuc 50’den küçükse ekrana “Kaldınız” yazan bir mesaj çıkartılır.
HERKES İÇİN UNIX
10
KISIM I:
Modül Sonu Soruları & Alıştırmalar
Özet
 Algoritma kurmak
 Dump Coding çözümlemesi
 Akış diyagramları
1. Algoritma kurulurken esas alınacak noktalar nelerdir?
HERKES İÇİN UNIX
11
BÖLÜM 1:
2. Dump Coding ile Algoritmanın farkı nedir?
3. Bir ürünün bilgilerinin, veri tabanından
görüntüleme işleminin algoritmasını kurun
4. Bu algoritmayı akış diyagramı ile gösterin.
HERKES İÇİN UNIX
çekilerek
kullanıcıya
Modül 6: Karar Yapıları ve Döngüler
Konu 1: Karar Yapıları
Hedefler
Â
Â
Â
Â
If Then ElseIf ile akış kontrolü
Koşul Operatörleri
Select Case
Karar yapılarının kullanım yerleri
Uygulamalar çalıştırılırken, yazılan kodların çalışma sırası, satırların teker teker
işlenmesi ile gerçekleşir. Ancak çoğu zaman, bazı kodların sadece belli
durumlarda çalışması istenir. Örneğin uygulama açılırken kullanıcı adı ve
parola sorulması, kullanıcıların seviyelerine göre erişim izinleri tanımlanması
gibi durumlarda kontrol işlemleri yapılmalıdır. Bu kontroller de karar yapıları ile
gerçekleştirilir.
Algoritmaların akışını kontrol etmekte en büyük rol, karar yapılarınındır. Visual
C# .NET dilinde farklı şekillerde kullanılan ancak benzer görevlere sahip karar
yapıları tanımlıdır.
Bu bölüm tamamlandıktan sonra
•
if else if karar yapıları ile akış kontrolü yapabilecek,
•
Kontrollerde kullanılan koşul operatörlerinin tanıyacak,
•
switch karar yapısını kullanabilecek,
•
Hangi karar yapısının nerede kullanılacağını öğreneceksiniz.
2
KISIM I:
if
If
ƒ Koşul ifadesi True ise If bloğuna girilir.
ƒ Verilen koşul sağlandığı zaman yapılan
işlemleri tutar.
if (gecmeNotu > 50) {
MsgBox("Geçtiniz tebrikler...");
}
if karar yapısı, bir koşul sağlandığı zaman yapılacak işlemleri kapsar. Kontrol
edilecek koşul ifadesinin sonucu true değerini alırsa, küme parantezleri
arasındaki kodlar çalıştırılır.
if(Koşul)
{
}
Örnek: Vize ve final notunu kullanıcıdan aldıktan sonra, geçme notunu
hesaplayan ve notun elliden büyük olması durumunda ekrana “geçtiniz”
mesajını çıkartan algoritma.
3
BÖLÜM 1:
double gecmeNotu;
short finalNotu = short.Parse(textBox1.Text);
short vizeNotu = short.Parse(textBox2.Text);
gecmeNotu = finalNotu * 0.7 + vizeNotu * 0.3;
if(gecmeNotu > 50)
{
MessageBox.Show("Geçtiniz tebrikler...");
}
Koşul Operatörleri
Koşul Operatörleri
ƒ
ƒ
ƒ
ƒ
ƒ
And
Or
Not
AndAlso
OrElse
Veri tipleri ve değişkenler üzerinde kontrol yapılırken birden fazla koşula ihtiyaç
duyulabilir. Bu durumda, koşulları birbirleriyle karşılaştıracak operatörler
kullanılır. Bu kontrollerden dönen değerler Boolean tipinde olduğu için, koşul
operatörleri de bu değerler üzerinde işlem yaparlar.
& (And)
Bu ifade, verilen koşulların kesişimini alır. Eğer tüm koşulların değeri true ise
sonuç da true olur. En az bir tane false değeri olan koşul varsa, sonuç false
olur.
Koşul 1
Koşul 2
Koşul 1 && Koşul 2
true
true
false
true
false
true
true
false
false
4
KISIM I:
false
false
false
| (Or)
Bu ifade, verilen koşulların birleşimini alır. Eğer tüm koşulların değeri false ise
sonuç false olur. En az bir tane true değeri varsa sonuç true olur.
Koşul 1
Koşul 2
Koşul 1 || Koşul 2
true
true
false
false
true
false
true
false
true
true
true
false
&& (AndAlso)
Koşullardan biri False ise, diğerleri kontrol edilmeden False değeri
döndürülür. Bu tip bir kullanım, birçok koşulun kontrol edilmesi gerektiğinde
performansı arttırır.
string [] dizi;
// Diziye eleman ekleme işlemleri
// ...
if (dizi.Length > 0 && dizi[1].EndsWith("."))
{
label1.Text = "Cümle sonundaki kelime: " + dizi[1];
}
Bu örnekte, dizinin ilk elemanı üzerinde bir kontrol yapılmak isteniyor. Ancak
diziye eleman eklenmemişse, ilk elemana ulaşırken hata üretilecektir.
Dolayısıyla dizinin uzunluğunu da kontrol etmek gerekir. Kontrol And ifadesi ile
yapılsaydı, dizi elemanın noktayla bitip bitmediği ve dizinin uzunluğu kontrol
edilecekti. Bu durumda iç içe if ifadeleri ile uzun bir kod yazılacaktı. Pek çok
kıyaslama gerekecek ve performans düşecekti. Ancak burada, dizi uzunluğu
koşulu sağlanmazsa, diğer koşula geçilmeden if kontrolünden çıkılır.
|| (OrElse)
Koşullardan biri True ise, diğerleri kontrol edilmeden True değeri döndürülür.
string Rol;
// Veritabanından, kullanıcının rolü alınır.
// ...
// Sadece Administrator, Moderator ve Power User rolündeki
// kullanıcılar dosya silme işlemi yapabilirler.
if (Rol == "Administrator" || Rol == "Moderator"
|| Rol = "Power User")
{
// Dosya silme işlemleri
}
5
BÖLÜM 1:
Dosya silme işlemi için, kullanıcının rolü veritabanından alındıktan sonra,
kontrol işlemi yapılır. Eğer bir kullanıcın rolü Administrator, Moderator veya
Power User rolünden biriyse diğer kontrollerin yapılması gerekmez. Bu örnekte
Rol değişkeni Administrator değerine eşitse, diğer iki koşul kontrol edilmeden
true ifadesi döner.
! (Değil)
Bir koşulun değerini tersine çevirir. Koşul false ise true, true ise false olur.
Koşul
true
false
! Koşul
false
true
if else
If Then Else
ƒ If koşulunda sağlanmayan tüm durumlar için
Else ifadesi kullanılır.
ElseIf
ƒ Koşulların sağlanmadığı durumlarda, yeni
kontrollerin yapılması için kullanılır.
Select Case
ƒ ElseIf işlevini görür ancak yazılması okunması
daha kolaydır.
else ifadesi, if yapısındaki koşulun sağlanmadığı bütün durumlarda devreye
girer.
if(Koşul)
{
//Diğer kodlar
}
else
{
//Diğer kodlar
6
KISIM I:
}
Örnek: Her 100 milisaniyede bir, formun renginin siyahken beyaz olması,
beyazken ise siyah olması için, formun renginin kontrolü yapılması gerekiyor.
public bool Beyaz = true;
private void timer1_Tick(object sender,
System.EventArgs e)
{
if(Beyaz)
{
this.BackColor = Color.Black;
Beyaz = false;
}
else
{
this.BackColor = Color.White;
Beyaz = true;
}
}
if kontrolünde formun beyaz olup olmadığı bool tipindeki bir değişkende
tutuluyor. Koşulda beyaz adlı değişken eğer true ise, formun arka planı siyah
yapılır. Bu koşulun sağlanmadığı durumda, yani beyaz değişkeninin false
olduğu durumda, else içindeki kodlar çalışacaktır ve formun arka planı beyaz
yapılacaktır. Her kontrolden sonra beyaz değişkenin değiştirilmesinin nedeni,
formun bir siyah bir beyaz olması istendiği içindir.
else if
if deyimindeki koşul sağlanmadıysa else deyimindeki kodlar çalışıyordu.
Ancak bazı durumlarda else içinde de kontrol yapmak gerebilir.
if(Koşul)
{
}
else if(Koşul2)
{
}
else if(Koşul3)
{
}
Örnek: Günün saatine göre karşılama mesajı çıkartmak için, saat değişkeni
birçok kez kontrol edilmesi gerekir. Sadece bir if kontrolü yapılsaydı, sadece
iki karşılama mesajı çıkartılabilirdi.
string karsilamaMesaji = " BilgeAdama hoşgeldiniz!";
int saat = DateTime.Now.Hour;
7
BÖLÜM 1:
if ((9 <= saat && saat
{
karsilamaMesaji =
"Günaydın,");
}
else if (12 <= saat &&
{
karsilamaMesaji =
günler,");
}
else if (16 <= saat &&
{
karsilamaMesaji =
akşamlar,");
}
< 12))
karsilamaMesaji.Insert(0,
saat < 16)
karsilamaMesaji.Insert(0, "İyi
saat < 18)
karsilamaMesaji.Insert(0, "İyi
// Formun başlığı karşılama mesajını
// gösterecek şekilde ayarlanır
this.Text = karsilamaMesaji;
switch
switch deyimi else if ile benzer işlevi görür, ancak okunması daha kolaydır.
switch ile seçilen bir değerin kontrol edilmesi Case ifadelerinde yapılır.
string karsilamaMesaji = " BilgeAdama hoşgeldiniz!";
int saat = DateTime.Now.Hour;
switch (saat)
{
case 9:
case 10:
case 11:
karsilamaMesaji = karsilamaMesaji.Insert(0,
"Günaydın,");
break;
case 12:
case 13:
case 14:
case 15:
karsilamaMesaji = karsilamaMesaji.Insert(0,
"İyi günler,");
break;
case 16:
case 17:
karsilamaMesaji = karsilamaMesaji.Insert(0,
"İyi akşamlar,");
break;
default:
karsilamaMesaji = karsilamaMesaji.Insert(0,
"Merhaba,");
break;
}
Buradaki switch kullanımı, saat değerine göre işlem gerçekleştirilmesidir.
Sayı, case ifadelerinde verilen değerler eşitse ilgili kodlar çalıştırılır. default
ise, diğer koşulların sağlanmadığı tüm durumlarda devreye girer.
8
KISIM I:
break ifadesi, kontrolün durması gerektiğini belirtir. Sayının belli değerler
aralığında kontrolü yapılması için boş case ifadeleri kullanılır.
Hangi Karar Cümlesi Nerede Kullanılır?
Karar Yapılarının Kullanım Yerleri
ƒ Select Case ifadesinin yazılışı ve okunuşu daha
kolaydır.
ƒ And, AndAlso operatörleri If yapısı ile
kullanılabilir.
if ve switch karar yapıları benzer işlevler görseler de kullanım yerlerine ve
birbirlerine göre değişik avantajları vardır. if else if karar yapılarında,
kontrol edilen değişkenlerin ya da değerlerin her seferinde tekrar yazılması
gerekir. Bu durumda switch karar yapısı, kodların yazılışını ve okunuşunu
kolaylaştırması açısından tercih edilmelidir. Ancak switch ile belli değerler
aralığında kontrol yapılması, case ifadelerinin ardı ardına yazılması gerektiği
için zordur.
Bir grup RadioButton kontrolü içinden sadece bir tanesi seçilebildiği için,
seçilen kontrolü bulmak için else if yapısının kullanımı yeterli olacaktır.
if (RadioButton1.Checked)
{
}
else if (RadioButton2.Checked)
{
}
else if (RadioButton3.Checked)
{
}
BÖLÜM 1:
Ancak bu kontroller, CheckBox kontrolünün kullanım yapısına uymaz.
Formlarda birden fazla CheckBox kontrolü seçilebildiği için, seçilen kontrolleri
bulmak için sadece if blokları kullanılmalıdır.
if (CheckBox1.Checked)
{
}
if (CheckBox2.Checked)
{
}
if (CheckBox3.Checked)
{
}
Uygulama
Bu uygulama kullanıcıya, stok durumuna veya tarihe göre değişen
görüntüleme seçenekleri sunarak, ürün katalogu tanıtılır. Ürünler kategorilere
göre ayrılmış bulunmaktadır ve ComboBox kontrolleri ile filtrelerden biri
seçilmediği takdirde işlem gerçekleşmez.
Stok durumu filtresi ile sadece stokta bulunan ya da stokta kalmamış
satılmakta olan ürünler listelenebilir. Tarihe göre filtreleme ile yeni çıkan ürünler
ya da tüm ürünler gözlenebilir.
Uygulamada, akış diyagramından koda geçiş aşaması rahat bir şekilde
görülecektir.
Algoritmanın incelenmesi
Uygulamanın algoritması başlangıç ve ürün ekleme algoritması olarak ikiye
ayrılmıştır.
Başlangıç algoritmasında ürün kategorisinin, stok durumu ve tarih filtrelerin
seçilip seçilmediği kontrolü yapılır. Eğer herhangi biri seçilmediği zaman
kullanıcıya ilgili mesaj gösterilir ve algoritmadan çıkılır. Tüm kontroller
yapıldıktan sonra, ilgili kategorideki ürünlerin listeye eklenmesi için diğer
algoritma devreye girer.
9
10
KISIM I:
Ürün ekleme algoritması, ilk algoritmada seçilen kriterlere göre, kullanıcıya
gösterilecek ürün listesini doldurur. Bu algoritma başlangıç olarak kategori
numarasını alır. Bu kategorideki stokta bulunan ürünleri listeye ekler. Stok
durumu filtresinde “Hepsi” değeri seçiliyse, stokta o an bulunmayan ürünler de
listeye eklenir. Tarih filtresinde “Son çıkanlar” değeri seçiliyse, eski ürünler
listeden çıkartılır.
11
BÖLÜM 1:
Forma kontrollerin eklenmesi
1. UrunYelpazesi isminde bir Visual C# Windows Projesi açın.
2. Forma biri lbUrunler diğeri lbKategoriler isminde iki ListBox
kontrolü ekleyin. lbUrunler liste kutusu tüm filtreler uygulandıktan
sonra çıkan ürünleri listeler. lbKategoriler liste kutusuna kategori
isimleri ekleyin:
•
Video
•
Kitap
• Yazılım
3. Forma biri cmbTarihSirasi diğeri cmbStokDurumu isminde iki
ComboBox kontrolü ekleyin. cmbTarihSirasi son ürünleri;
cmbStokDurumu stoktaki ürünleri gösteren filtre olarak kullanılacaktır.
cmbTarihSirasi elemanlarına “Son Çıkanlar” ve “Tüm Ürünler”
değerlerini, cmbStokDurumu elemanlarına “Sadece Stoktakiler” ve
“Hepsi” değerlerini ekleyin.
4. lblMesaj isminde bir Label kontrolü ekleyin. Dock özelliğini Buttom
yapın. Bu kontrol filtrelerin seçilmediği durumda hata mesajlarını
gösterecektir.
5. lblSecilenUrunler isminde bir Label kontrolü ekleyin ve
lbUrunler liste kutusunun üstüne yerleştirin. Bu kontrol, seçilen
ürünlerin hangi kategoride olduğunu gösterecektir.
6. Forma btnListele isminde bir Button kontrolü ekleyin.
12
KISIM I:
Kodların yazılması
Bu uygulamada kodların tamamı btnListele düğmesinin Click olayına
yazılacaktır. Kodlar arasındaki numaralar akış diyagramında işlenen durumlara
referans gönderir. Algoritma 1, başlangıç algoritmasındaki numaraları;
Algoritma 2, ürün ekleme algoritmasındaki numaraları ifade eder.
1. btnListele düğmesine çift tıklayın ve Click olayına gelin. Düğmeye
her basıldığında liste kutusuna ardı ardına öğeler eklenmemesi ve
hata mesajlarının temizlenmesi için gerekli kodları yazın.
lblMesaj.Text = "";
lbUrunler.Items.Clear();
2. Kategori listesinden, stok ve tarih filtreleri için açılan kutulardan
öğelerin seçili olup olmadığı kontrolü yapılır. Eğer seçilmemiş bir
değer varsa, ilgili hata mesajı lblMesaj etiketinde görüntülenir.
// Algoritma 1 - 1
if ( cmbStokDurumu.SelectedIndex == -1 &&
cmbTarihSirasi.SelectedIndex == -1 ) {
lblMesaj.Text = "Stok Durumu ve Tarih Sırası
seçiniz.";
// Algoritma 1 - 2
}
else if ( cmbStokDurumu.SelectedIndex == -1 ) {
lblMesaj.Text = "Stok Durumunu seçiniz.";
// Algoritma 1 - 3
}
else if ( cmbTarihSirasi.SelectedIndex == -1 ) {
lblMesaj.Text = "Tarih Sırasını seçiniz.";
// Algoritma 1 - 4
}
else if ( lbKategoriler.SelectedIndex == -1 ) {
lblMesaj.Text = "Kategori seçiniz.";
}
else {
// Algoritma 1 - 5
3. if else if deyimlerinde tüm kontroller yapıldıktan sonra else
ifadesine geçilir. Algoritmanın akışı bundan sonra ürün ekleme
işlemiyle devam edecektir.
switch ( lbKategoriler.SelectedIndex ) {
case 0:
// Sadece stokta bulunan ürünler eklenir.
// Algoritma 2 - 2
lbUrunler.Items.Add( "MSDN Tv Visual C# 5" );
lbUrunler.Items.Add( "MSDN Tv Visual C# 4" );
// Stokta bulunan veya bulunmayan ürünlerin Hepsi
// seçiliyse, kalan ürünler de listeye eklenir.
// Algoritma 2 - 3
if ( cmbStokDurumu.SelectedIndex == 1 ) {
// Algoritma 2 - 4
lbUrunler.Items.Add( "MSDN Tv Visual C#" );
lbUrunler.Items.Add( "MSDN Tv Visual C# 2" );
lbUrunler.Items.Add( "MSDN Tv Visual C# 3" );
}
13
BÖLÜM 1:
// Eski ürünlerin gösterilmesi istenmiyorsa
// listeden çıkartılır.
// Algoritma 2 - 5
if ( cmbTarihSirasi.SelectedIndex == 0 ) {
// Algoritma 2 - 6
lbUrunler.Items.Remove( "MSDN Tv Visual C#" );
lbUrunler.Items.Remove( "MSDN Tv Visual C# 2" );
}
break;
4. Diğer iki kategori için liste ekleme işlemleri aynıdır.
case 1:
lbUrunler.Items.Add(
lbUrunler.Items.Add(
lbUrunler.Items.Add(
);
lbUrunler.Items.Add(
);
"Yazılım Uzmanlığı 1" );
"Yazılım Uzmanlığı 2" );
"Yazılım Mühendisliği Orta Dzey"
"Yazılım
Mühendisliği
İleri Dzey"
if ( cmbStokDurumu.SelectedIndex == 1 )
{
lbUrunler.Items.Add( "Yazılım Mühendisliği Başlangıç
Düzeyi" );
lbUrunler.Items.Add( "Access Giriş" );
}
if ( cmbTarihSirasi.SelectedIndex == 0 )
{
lbUrunler.Items.Remove( "Yazılım Uzmanlığı 1" );
}
break;
case 2:
lbUrunler.Items.Add( "Visual Studio 6.0" );
lbUrunler.Items.Add( "Visual C# .NET Standard 2003" );
lbUrunler.Items.Add( "Visual C# C# Standard 2003" );
if ( cmbStokDurumu.SelectedIndex == 1 )
{
lbUrunler.Items.Add( "Visual Studio .NET 2005" );
}
if ( cmbTarihSirasi.SelectedIndex == 0 )
{
lbUrunler.Items.Remove( "Visual Studio 6.0" );
}
break;
}
5. swicth ifadesinde tüm eklemeler yapıldıktan sonra ikinci algoritma
biter. İlk algoritmanın son aşaması olan, kullanıcıya hangi kategoride
ürün seçildiğini gösteren mesaj yazılır ve if karar yapısı sonlanır.
//
Algoritma 1 - 6
lblSecilenUrunler.Text = lbKategoriler.Text + "
Kategorisindeki Ürünler";
}
14
KISIM I:
Konu 2: Döngüler
Hedefler
Â
Â
Â
Â
Â
For Next Döngüsü
While, Until Döngüleri
Do Loop Döngüsü
İç içe döngüler
Döngülerin kullanım yerleri
Algoritmalarda bazı işlemlerin tekrar çalışması için, onları her seferinde
yazmak gerekir. Ancak bu çözüm, çok fazla tekrar için hem yazmayı hem de
okumayı zorlaştırır. Örneğin yüz elemanlı bir diziye rasgele sayı atanması için
işlemin yüz defa yazılması gerekir. Döngüler ile işlem sadece bir defa yazılır ve
tekrar sayısına göre bu işleme geri dönülür.
15
BÖLÜM 1:
Bu bölüm tamamlandıktan sonra
•
For ve While döngüsünü tanıyacak,
•
İç içe döngüler kullanabilecek,
•
Hangi döngünün nerede kullanıldığını öğreneceksiniz.
For
For Next
ƒ Sayaç, belirtilen aralıkta olana kadar işlem
yapılır.
ƒ Step ifadesi, sayacın artacağı ya da azalacağı
miktarı belirler.
ƒ Next ifadesi, sayacı otomatik artırır ya da azaltır.
int fahr;
int derece;
for (int derece = 0; derece <= 100; derece += 10)
{
fahr = derece * 1.8 + 32;
Label1.Text += fahr + " Fahrenheit= ";
Label1.Text += derece + " Celcius" + "\r\n";
}
For döngüsü bir işlemin belirli sayıda yapılması için kullanılır.
for (int i = 0; i < 10; i++)
{
MessageBox.Show(“Merhaba”);
}
Bu döngüde 3 parametre vardır.
•
İlk parametre sayacın başlangıç değerini belirler. Örnekte, sayaç
değişkeni tanımlanıp 0 değeri atanmıştır.
•
İkinci parametre bir koşul ifadesidir. Bu koşul sağlandığı sürece döngü
devam eder. Örnekteki döngü, i değeri 10dan küçük olduğu sürece
devam edecektir.
•
Üçüncü parametre, her döngüden sonra yapılması gereken işlemi
belirtir. Örnekte, her işlemden sonra i değeri bir artırılır.
16
KISIM I:
Döngülerde kullanılan sayaçlar sadece belli bir sayıda işlem yapmayı
sağlamaz. Sayaçların artma veya azalma adımları belirli olduğu için, kod
içersinde çoğu zaman bu avantajdan yararlanılır.
listBox1.Items.Add("Karakter - ASCII kod karşılığı");
for (int i = 50; i <= 255; i = i + 2)
{
listBox1.Items.Add(Microsoft.VisualBasic.Strings.Chr(i)
& "
- " & i)
}
Örneğin dizi işlemlerinde, dizinin her elamanına ulaşmak için sayaç
kullanılabilir. Sayacın artma hızı bir olduğu için dizi[sayac] ifadesi, sırayla
dizinin elemanlarına ulaşmayı sağlar.
int [] dizi = new int[10];
Random r = new Random();
for (int i = 0; i < dizi.Length ; i++)
{
dizi[i] = r.Next(100);
}
DİKKAT: Değişken tanımlamaları For döngüsünün içinde de yapılabilir. Bu durumda,
değişkenin kapsam alanı bu döngüyle sınırlı kalır.
For döngülerinin iç içe kullanımı
Çoğu zaman For döngülerindeki her etap için başka bir döngünün kurulması
gerekir. Örneğin bir müşterinin birden fazla telefon numarası bir dizi içinde
tutuluyorsa, bütün müşterilerin telefonlarını listelemek için iki döngü
kullanılması gerekir. İlk döngü tek tek müşterileri almak için, alt döngü ise her
müşterinin telefonlarını almak için kullanılmalıdır.
17
BÖLÜM 1:
public struct Musteri {
public string Isim;
public string Soyad;
public string[] Telefonlari;
}
public Musteri[] Musteriler;
// Musteriler dizisi dolduruyor
// ...
private void Button1_Click( System.Object sender,
System.EventArgs e )
{
int i, j;
for ( i=0; i<=Musteriler.Length - 1; i++ ) {
// lk mteri seiliyor
Musteri m = Musteriler[ i ] ;
Label1.Text += m.Isim + " " + m.Soyad;
Label1.Text += " müşterisinin telefonları:"
+ "\n";
for ( j=0; j<=m.Telefonlari.Length - 1; j++
) {
Label1.Text += m.Telefonlari[ j ] ;
Label1.Text += "\n";
}
}
}
Birden fazla boyutlu dizilerde işlem yaparken de For döngüsü iç içe
kullanılabilir. Örneğin iki boyutlu bir tabloda, ilk boyut için bir for döngüsü, diğer
boyut için de başka bir for döngüsü kullanılarak dizinin tüm elemanlarına
ulaşılabilir.
Random r = new Random();
string[,] tablo = new string[ 5, 5 ];
byte i = 0;
for ( i=1; i<=4; i++ )
{
tablo[ 0, i ] = "Yazar " + i;
tablo[ i, 0 ] = "Kitap " + i;
tablo[ ( ( int )( r.Next(3)) ) + 1, ( ( int )(
r.Next(3) ) ) + 1 ] = "X";
}
tablo isminde String değerleri tutan bir dizi oluşturulur ve dizinin ilk satırına
yazar isimleri, ilk sütununa da kitap isimleri konur. For döngüsünün sayacı
birden başladığı için dizinin 0,0 koordinatlı ilk elemanına değer atanmaz.
Yazar 1
Kitap 1
Kitap 2
Kitap 3
Kitap 4
Yazar 2
Yazar 3
Yazar 4
18
KISIM I:
Daha sonra tablonun diğer elemanlarına rasgele X değerleri atanır. Bu değer
hangi yazarın hangi kitabı yazdığını gösterecektir.
r.Next(3) + 1 ifadesi 1 – 4 arasında rasgele sayı üretir. Bu sayı tablo
dizisine indis olarak verildiğinde ise, kalan hücrelerde X değeri elde edilir.
Yazar 1
Kitap 1
X
Kitap 2
X
Yazar 2
Kitap 3
Yazar 3
Yazar 4
X
Kitap 4
X
Tablonun tüm elemanlarını listelemek için iç içe iki For döngüsü kullanılmalıdır.
for ( int j=0; j<=tablo.GetLength( 0 ) - 1; j++ )
{
for (int h=0; h<=tablo.GetLength( 1 ) - 1; h++ ) {
Label1.Text += System.Convert.ToString( tablo[ j, h ]
);
}
Label1.Text += "\n";
}
Yazarlar ve Kitaplar tablosu hazırlandıktan sonra, hangi yazarın hangi kitabı
yazdığını bulmak için yine tablo elemanları içinde dolaşıp X değerini aramak
gerekir. İlk For döngüsü ile Kitaplar satırında, ikinci For döngüsü ile Yazarlar
sütunlarında gezilir.
for (int j=0; j<=tablo.GetLength( 0 ) - 1; j++ )
{
for (int h=0; h<=tablo.GetLength( 1 ) - 1; h++ )
{
// Tablonun her elemanının değeri
// X değeri ile karşılaştırılır.
if ( tablo[ j, h ] == "X" ) {
Label2.Text = tablo[ 0, h ] + ", ";
Label2.Text += tablo[ j, 0 ];
Label2.Text += " kitabını yazıyor";
break;
}
}
Label1.Text += "\n";
}
Tablonun her elemanı kontrol edilir ve X değeri bulunduğu zaman yazar ismi
ve kitap ismi ekrana yazdırılır. Yazar isimleri, dizinin ikinci boyutunun ilk
sırasında tutulduğu için tablo[0,h] kodu ile ulaşılır. Kitap isimleri ise, dizinin
ilk boyutunun ilk sırasında tutulduğu için tablo[j,0] kodu ulaşılır. Buradaki h
ve j değişkenleri o anda kontrol edilen elemanın tablodaki indisleridir.
break ifadesi, o anda bulunan For döngüsünden çıkmayı sağlar. Bu örnekte
ikinci For döngüsü yazarlar sütunu üzerinde döndüğü için, bu döngüden
çıkıldığında, ilk For döngüsüne tekrar geçilir. Bu sefer yeni bir kitap için
19
BÖLÜM 1:
yazarlar kontrol edilir. Sonuçta bir kitabı birden fazla yazar yazmasına rağmen,
görüntülenecek olan sadece ilk yazardır.
While
While
ƒ Verilen koşul gerçekleştiği sürece işlem
yapılır.
ƒ Sayacı değiştirmek için kod yazılması
gerekir.
int toplam = 0;
short sayac = InputBox("Bir sayı girin");
while (sayac > 0) {
toplam += sayac;
sayac -= 1;
}
While döngüsü bir koşul gerçekleştiği sürece çalışan döngüdür.
while(Koşul)
{
}
Birden ona kadar olan sayıların toplamını hesaplamak için, bir ve on arasındaki
sayılar tek tek yazılıp toplanabilir. İyi bir yöntem olmasa da sonucu verir. Ancak
kullanıcının girdiği bir sayıya kadar toplam almak için bir döngü gerekir.
int toplam = 0;
int sayac = int.Parse(txtSayiGirisi.Text);
while (sayac > 0)
{
toplam += sayac;
sayac -= 1;
}
Burada kullanıcının girdiği sayıdan itibaren sıfıra kadar giden bir döngü kurulur.
Döngü sayacın sıfırdan büyük olduğu her durum için çalışacaktır. Sayaç
sıfırlandığında ise döngüden çıkılır.
20
KISIM I:
Sonsuz Döngüler
While döngüsü sayaç ile kullanılırken, sayacın değiştirilmesine dikkat edilmesi
gerekir. Eğer sayaç değiştirilmezse, While ifadesindeki koşul hep true değeri
alacağı için sonsuz döngüye girilir.
Sadece sayacın kontrol edilmediği durumlarda değil, koşulların
yazılmalarındaki mantık hataları da sonsuz döngüye sebebiyet verir.
int i = 0;
while (i < 10 | i > 5)
{
label1.Text = "Sonsuz döngüye girildi";
i += 1;
}
For döngüsünde sayaç, artırma ifadesindeki değerden fazla bir sayıda
azaltılırsa yine sonsuz döngüye girilir. Bu döngünün çalışması, int veri tipinin
alabileceği minimum değere ulaşınca hata ile sonlanır.
for(int i = 0; i <= 9; i += 3)
{
MessageBox.Show("Sonsuz döngü");
i -= 4;
}
Uygulama
Bu uygulamada, bir satranç tahtası üzerindeki bir filin hareket alanı hesaplanır.
Satranç tahtası rasgele taşlarla doldurulur. Verilen bir koordinatta bulunan fil,
çapraz hareketlerine göre nereye ilerleyebileceği bulunur. Eğer filin önünde bir
taş varsa, bu taşın bulunduğu yere ve daha gerisine ilerleyemeyecektir. Filin
dört bir yanına çapraz olarak hareket edebileceği göz önünde bulundurulması
gerekir.
Tahtanın doldurulması
1. Satranc isminde bir Windows projesi açın.
2. Form üzerine lbHareketAlani isminde bir ListBox, btnGoster isminde
bir Button ekleyin.
3. btnGoster düğmesinin Click olayına 8 x 8 boyutunda bir dizi tanımlayıp
dolduran kodları yazın. Bu dizi bool tipinde değerler taşır. Verilen indisteki
elemanın değeri true olması, o koordinatta bir taşın bulunduğunu belirtir.
lbHareketAlani.Items.Clear();
int a,b;
Random r = new Random();
bool[,] tahta = new bool[ 8, 8 ];
for ( a=0; a<=7; a++ ) {
for ( b=0; b<=7; b++ )
{
int sonuc = (r.Next() % 2);
21
BÖLÜM 1:
if (sonuc == 1)
{
tahta[ a, b ] = true;
}
else
{
tahta[ a, b ] = true;
}
}
}
Hareket Alanı
Tahta üzerindeki bir fil, dört çapraz yöne doğru ilerleyebilir. Dizide çapraz olarak
ilerlemek x ve y koordinatlarının eşit oranda artması ve azalması demektir.
Dizide ilerlerken x ve y koordinatlarının sıfırdan küçük ve dizinin boyutundan
büyük olmamasına dikkat edilmelidir. Dört farklı yöne göre, koordinatlar artacak
ya da azalacaktır.
1. Fili tahta üzerine yerleştirmek için kullanıcıdan koordinatları alın.
byte x = byte.Parse( txtFilinXKoordinati.Text ) ;
byte y = byte.Parse( txtFilinYKoordinati.Text ) ;
2. 0, 0 yönüne doğru olan yoldaki taşların kontrolünü yapın. Filin x ve y
koordinatlarını birer düşürerek, koordinatlarda taş var mı yok mu kontrol
edilir. Eğer taş yoksa bu kareye ilerlenebildiğini, lbHareketAlani liste
kutusuna koordinat eklenerek gösterilir. Yol üzerinde bir taş varsa, daha
fazla ilerlenemeyeceği için While döngüsünden çıkılır.
int i = 1;
while ( x - i >= 0 & y - i >= 0 )
{
if ( !( tahta[ x - i, y - i ] ) ) {
lbHareketAlani.Items.Add((x i).ToString() + " - " + (y - i).ToString() );
i += 1;
}
else {
break;
}
}
3. 7, 0 yönüne doğru ilerlenir ve olası hareketler liste kutusuna eklenir.
0 ) {
i = 1;
while ( x + i < tahta.GetLength( 0 ) & y - i >=
if ( !( tahta[ x + i, y - i ] ) ) {
lbHareketAlani.Items.Add( (x +
i).ToString() + " - " + (y - i).ToString() );
i += 1;
}
else {
break;
}
}
4. 7, 7 yönüne doğru kontrol yapılır.
22
KISIM I:
i = 1;
while ( ! ( x + i >= tahta.GetLength( 0 ) | y +
i >= tahta.GetLength( 1 ) ) ) {
if ( !( tahta[ x + i, y + i ] ) ) {
lbHareketAlani.Items.Add( (x +
i).ToString() + " - " + (y + i).ToString());
i += 1;
}
else {
break;
}
}
5. 0, 7 yönüne doğru taşlar kontrol edilir.
) ) {
i = 1;
while ( x - i >= 0 & y + i < tahta.GetLength( 1
if ( !( tahta[ x - i, y + i ] ) ) {
lbHareketAlani.Items.Add( (x i).ToString() + " - " + (y + i).ToString() );
i += 1;
}
else {
break;
}
}
Debug
Kodlar yazıldıktan sonra indislerin doğru kullanıldığını, döngülerde mantıksal
hataları yapılmadığını kontrol etmenin en kolay yolu hata ayıklayıcı ile
çalışmaktır. Bu örnekte birçok döngü kurulmuştur, filin dört hareket yönündeki
engeller kontrol edilir. Tüm hareketlerin işleyişine Debug ile kolayca bakılır.
1. TextBox ile filin koordinatlarının alındığı yere BreakPoint koyun ve projeyi
çalıştırın.
2. x ve y koordinatlarına 0 değerini girin. Filin, tahtanın sol üst köşesinde
olduğu varsayılır.
Bu durumda fil hangi yönde ilerleyebilir? Step Into komutu ile kodlar arasında
ilerleyin ve hangi döngü içine girdiğini bulun.
3. Locals panelinde i değişkeninin değerini izleyin. Aynı panelde tahta
dizisinin, o anda kontrol edilen değerine bakın. x ve y değerlerinin bir
fazlasını alarak, diğer değerin true ya da false olduğunu kontrol edin.
Konu 3: Hata Yakalama
Bir uygulama geliştiricisi program yazarken çok çeşitli hatalarla karşılaşabilir.
Visual C# .NET ortaya çıkan hata durumlarında, çok detaylı hata mesajlarını
uygulama geliştiricisine gönderir. Bu hata mesajları, hataların nerede, nasıl
yapıldığını çok detaylı bir şekilde gösterir. Hataların en ince ayrıntısına kadar
işlenmesi, uygulama geliştirmede büyük kolaylık sağlar.
Visual C# .NET hata mesajları, çalışma zamanı (Run Time) ve tasarım zamanı
(Design Time) hataları olarak ayrılabilir.
BÖLÜM 1:
Tasarım zamanı hataları, kodların yazılması sırasında derleyici tarafından
bulunan ve Task List panelinde gösterilen hatalardır. Task List panelinde
hatanın açıklaması, hatanın projenin hangi dosyasında ve dosyanın kaçıncı
satırında bulunduğunu gösterir. Tasarım zamanı hataları sözdizimi yanlış
kullanıldığında meydana gelir.
Çalışma zamanı hataları, uygulama çalışırken yapılması imkânsız bir işlemin
gerçekleştirilmesi sırasında meydana gelir. Örneğin TextBox ile bir sayının
alınması sırasında, kullanıcı String tipinde bir değer girerse çalışma
zamanında bir hata oluşur.
int []dizi = new int[10];
for (int i = 0; i <= dizi.Length; i++)
{
Label1.Text &= dizi(i)
}
Buradaki hata mesajı, dizinin büyüklüğünün dışında bir indis verildiğini belirtir.
Visual C# .NET dilinde uygulama geliştirirken oluşabilecek tüm hatalar .NET
FrameWork çatısı altında Exception sınıfları halinde tanımlanır. Örneğin
dizinin büyüklüğünden farklı bir indis verildiğinde IndexOutOfRangeException
hatası ortaya çıkar. Tüm hatalar gibi bu hata da Exception taban sınıfından
türemiştir.
23
24
KISIM I:
Try Catch Finally
Try Catch Finally
ƒ
ƒ
ƒ
ƒ
Çalışma zamanında çıkan hataların işlenmesini sağlar.
Try, hata doğurabilecek kodları tutar.
Catch, hata yakalandıktan sonra çalışacak kodları tutar.
Finally, her iki durumdan sonra çalışacak kodları tutar.
int dosya = FreeFile();
try {
string kayit = "Kayıt Zamanı: " + Now;
kayit += "\r\n" + "Uygulama kayıtları...";
FileOpen(dosya, "C:\\Log.txt", OpenMode.Binary, OpenAccess.Write);
FilePut(dosya, kayit);
} catch (Exception ex) {
MsgBox(ex.Message);
} finally {
FileClose(dosya);
}
Çalışma zamanında ortaya çıkan hatalar uygulamanın beklenmedik bir şekilde
sonlanmasına neden olur. Uygulamanın devam etmesi için bu hataların
yakalanıp işlenmesi gerekir. Try Catch Finally blokları içinde, çalışma
zamanı hataları meydana geldiği durumlarda çalışması istenen kodlar yazılır.
Try bloğu içine, çalışırken hata üretebilecek kodlar yazılırken, Catch bloğu
içine, hata oluştuğunda yapılması gereken işlemler yazılır.
int sayi, sonuc;
try
{
Random r = new Random();
sayi = r.Next(3);
sonuc = 100 / sayi;
MessageBox.Show("Bölme işlemi başarılı, sonuç: "
+ sonuc.ToString());
}
catch (Exception ex)
{
MessageBox.Show("Bölme işlemi başarısız. Hata
Mesajı: " + ex.Message);
}
Bu örnekte üretilen rasgele bir sayı ile bölme işlemi yapılıyor. Sayı sıfır değerini
aldığında bölme işlemi hata üretecektir. Dolayısıyla bu işlem Try bloğu içine
yazılmalıdır. Catch bloğunda, işlemin başarısız olduğunu belirten bir mesaj
25
BÖLÜM 1:
yazılır. Exception nesnesinin Message özelliği, hatanın oluştuğu zaman
üretilen mesajı tutar. Exception nesnesinin özellikleri Catch içinde
kullanılmayacaksa, tanımlanmasına gerek yoktur.
try
{
}
Catch
{
label1.Text = "Exception kullanılmıyor.";
}
Finally bloğunda, Try
Catch içinde yapılan tüm işlemlerden sonra
çalıştırılacak kodlar yazılır. Finally bloğunda yazılan kodlar hata meydana
gelse de gelmese de çalıştırılacaktır.
try
{
// Dosya aç
// Dosya işlemleri
}
catch (Exception ex)
{
// Dosya açılırken veya işlem yapılırken
// hata meydana geldi.
}
finally
{
// Dosya kapat
}
Finally bloğunda, genellikle, kullanılan kaynaklar serbest bırakılır. Örnekte,
bir dosya açılıyor. Dosya açma veya dosyaya veri yazma işlemlerinde bir hata
meydana geldiğinde, Catch ifadesinde bu hata yakalanıp ilgili mesaj
kullanıcıya gösterilir. Finally bloğu her halükarda çalışacağı için dosya
kapama işlemi burada yapılır.
Lab 1: Şifreleme Algoritması
Bu uygulamada, verilen bir yazı şifrelenerek bir dizi sayıya çevrilir. Bu sayılar,
yazıda geçen karakterlerin Ascii kodlarının karışmış bir halidir. Şifreyi çözmek
için, şifrelemede izlenen yolların tersi uygulanır.
İPUCU:
Şifreleme algoritmalarında yazıyı şifrelerken izlenen yolların geri dönüşü
olmalıdır. Örneğin rasgele sayılar kullanılarak şifrelenen bir yazıyı, tekrar rasgele sayılar
kullanarak çözülemez.
Şifreleme:
Verilen yazının şifrelenmesi üç etaptan oluşur:
•
Yazının karakterleri Ascii kodlarına çevrilir.
•
Kodlar, gerekiyorsa başlarına 0 konarak, 4 haneli yapılır ve sıralı halde
bir String değişkeninde tutulur.
26
KISIM I:
•
Sıralı şekilde yazılan kodlar, bir baştan bir sondan karakter alınarak
tekrar düzenlenir.
Örnek: “acf” kelimesinin şifrelenmesi:
• a c f karakterleri Ascii kodlarına çevrilir.
a = 97
c = 99
f = 102
• Kodlar başlarına sıfır konarak 4 haneli yapılır.
0097
0099
0102
Sıralı halde bir String değişkenine yazılır.
009700990102
•
Sayının ortasına kadar, önce baştan daha sonra sondan rakam
alınarak tekrar yazılır. Siyah olarak gösterilen rakamlar, dizinin
sonundan alınmıştır.
0
02
020
0200
02009
020091
0200917
02009170
020091700
0200917009
02009170090
0 2 0 0 9 1 7 0 0 9 0 9 = Şifre
Projenin açılması
1. Visual Studio ortamında, Sifreleme isminde bir Windows projesi açın.
2. Açılan forma lblSifre isminde bir Label kontrolü, btnSİfrele
isminde bir Button kontrolü ekleyin. Bu kontroller kullanıcıdan alınan
yazının şifrelenip görüntülenmesini sağlayacaktır.
3. Açılan forma lblDesifre isminde bir Label kontrolü ve
btnSİfreyiCoz isminde bir Button kontrolü ekleyin. Bu kontroller
şifrelenmiş yazının lblSifre kontrolünden alınarak, şifrelenip
görüntülenmesini sağlayacaktır.
DİKKAT:
yazılacaktır.
Şifreleme algoritmasının tüm kodları btnSifrele kontrolünün Click olayına
27
BÖLÜM 1:
Ascii Kodlarına Çevirme
1. Şifrelenecek yazının girilmesi için gerekli kodu yazın. Bir yazı girilene
kadar kullanıcıdan yazı istemek için do while döngüsünü kullanın.
string yazi = null;
// Algoritma 1 - 1
do {
yazi = txtSifrelenecekYazi.Text;
}
while ( ! ( yazi.Length > 0 ) );
2. Girilen yazının karakterlerini bir dizide toplamak için String
değişkeninin ToCharArray() metodunu kullanın.
// Algoritma 1 - 2
char[] karakterler = yazi.ToCharArray();
3. Karakterlerin Ascii kodu karşılığını tutmak için kodlar isminde bir dizi
yaratın. Karakterler dizisindeki tüm elemanlar üzerinde işlem yapmak
için bir döngü kurun. Karakterler dizisindeki her karakteri Asc hazır
fonksiyonu ile Ascii koduna çevirin.
int uzunluk = karakterler.Length - 1 ;
string[] kodlar = new string[ uzunluk + 1 ];
int i;
// kelimedeki her karakterin ASCII kodu alınır
for ( i=0; i<=uzunluk; i++ )
{
28
KISIM I:
// Algoritma 1 - 3
kodlar[ i ] = ( Microsoft.VisualBasic.Strings.Asc(
karakterler[ i ] ) ).ToString();
}
4. Bu algoritma sonunda elde edilen kodlar dizisi, şifrelenecek olan
yazının her karakterinin Ascii kodunu tutar. Bu dizi diğer algoritmanın
giriş değeri olarak kullanılacaktır.
Sıralı Kodlara Çevirme
Ascii karakter kodları 0 – 255 arasında değer alır. Dolayısıyla her kod
maksimum üç haneli olacaktır. Şifre oluşturulurken yapılan son
düzenlemede kolaylık sağlamak için, bu kodlar 4 haneli yapılır. Daha
sonra bu kodlar diziden çekilerek SiraliKodlar adlı bir String
değişkenine yazılır.
1. Dizideki kodları sıralı bir şekilde tutmak için SiraliKodlar adlı bir
değişken tanımlayın. İlk algoritmadan alınan Ascii kodlarını tutan
kodlar dizisi üzerinde bir döngü kurun.
string SiraliKodlar = null;
short j = 0;
while ( j <= kodlar.Length - 1 ) {
j += 1;
}
DİKKAT: 2 – 4 etaplarında yazılacak tüm kodlar While döngüsünün içine yazılacaktır.
Bu döngüde kullanılacak Ascii kodunu bir değişkene atan kodu yazın.
29
BÖLÜM 1:
// Alogritma 2 - 1
string AsciiKodu = kodlar[ j ];
2. AsciiKodu değişkeninde tutulan kodun 4 haneli hale getirilmesi için
kaç tane sıfır eklenmesi gerektiğini bulun. Eklenecek sıfırların sayısı, 4
– AsciiKodu değişkeninin uzunluğu kadardır. Örneğin 192 kodlu bir
değişkene eklenmesi gerenken sıfır sayısı 4 – 3 = 1 tanedir.
byte eklenecek = System.Convert.ToByte( 4 - AsciiKodu.Length
);
3. Eklenecek sayı kadar çalışacak bir döngü içinde, sıfır ekleme işlemini
yapın.
for ( i=0; i<=eklenecek - 1; i++ ) {
// Alogritma 2 - 3
AsciiKodu = AsciiKodu.Insert( 0, "0" );
}
4. Düzenlenmiş AsciiKodu, SıralıKodlar değişkenine yazın ve sayacı
bir artırarak diğer Ascii koduna geçin.
//
Alogritma 2 - 4
SiraliKodlar += AsciiKodu;
j += 1;
Algoritma sonunda ortaya çıkan değer, karakterlerin 4 haneli Ascii kodlarını
tutan bir String değişkenidir. Bu değişken diğer algoritmada, tekrar
düzenlenmek üzere kullanılacaktır.
Şifrenin oluşturulması
Bir önceki algoritmada elde edilen SıralıKodlar değişkeni halen istenilen
şifreli yazı değildir. Çünkü 4 haneli kodlar sıralı bir şekilde durur ve kolayca
çözülebilir. Şifrenin ilk bakışta anlaşılmasını daha da zorlaştırmak için,
sıralanmış kodlar biraz daha karıştırılır.
30
KISIM I:
1. Döngüde kullanılacak J sayacını sıfırlayın ve şifrenin tutulacağı
değişkeni tanımlayın
// Algoritma 3 - 1
j = 0;
string Sifre = null;
2. SıralıKodlar değişkeni üzerinde yapılacak işlem sayısı, bir baştan
bir sondan ilerlendiği için, değişkenin uzunluğunun yarısı kadardır.
Sayacın bu uzunluğa kadar tanımlı olan bir döngü oluşturun.
// Algoritma 3 - 2
while ( j < SiraliKodlar.Length / 2 ) {
j += 1;
}
DİKKAT:
3 – 4 etaplarında yazılacak tüm kodlar Do While döngüsünün içine
yazılacaktır.
3. Şifreye, SıralıKodların j indisli karakterini ekleyin.
//Algoritma 3 - 3
Sifre &= Mid(SiraliKodlar, j + 1, 1)
4. Şifreye, SıralıKodların uzunluk – j indisli karakterini ekleyin.
// Algoritma 3 - 3
Sifre += Strings.Mid( SiraliKodlar, j + 1, 1 );
5. Sonuç olarak çıkan şifre, girilen yazının Ascii kodlarının karışık
düzende tutulması ile oluşturulur.
// Algoritma 3 - 4
Sifre += SiraliKodlar.Substring(SiraliKodlar.Length - j - 1,
1 );
Şifreyi Çözmek
Şifreleme algoritması kullanılarak oluşturulan şifrenin çözülmesi, izlenen
yolların tersi uygulanarak gerçekleştirilir. Deşifre algoritması iki etaptan oluşur.
1. Bir baştan bir sondan karakter alınarak şifrelenen Ascii kodları, sıralı
kodlar haline dönüştürülür.
2. 4 haneli olarak duran sıralı kodlar, karakterlere çevrilir. Karakterler ardı
ardına konarak deşifre işlemi gerçekleştirilir.
Örnek: “acf” kelimesinin şifrelenmiş hali 020091700909 şeklindedir. Bu kelime
şifrelenirken, karakterleri 4 haneli Ascii kodların çevrilmiş ve bu kodların
rakamlarının sırası değiştirilmişti. Bu şifrenin önce 4 haneli sıralı kodlar haline
getirilmesi için, şifrelenen yöntemin tersi işlenir. Sırayla okunan rakamlar önce
başa daha sonra sona yazılır.
31
BÖLÜM 1:
Şifre: 0 2 0 0 9 1 7 0 0 9 0 9
Sıralı kodlara çevrim:
Sıranın ilk yarısı
Sıranın son yarısı
0
2
00
02
009
102
0097
0102
00970
90102
009700
990102
Sonuç olarak elde edilen sıralı Ascii kodları, sıranın ilk yarısı ve son yarınsın
birleşimi olur: 0097 0099 0102
DİKKAT:
Sıranın ilk yarısı oluşturulurken, rakamlar sona eklenir. Ancak sıranın son
yarısı oluşturulurken rakamlar başa eklenir.
Bu 4 haneli kodlar String değerinden Integer değerine çevrilir ve bu
değerlerin karşılığı olan karakterler yazılır.
0097 Æ 97 Æ a
0099 Æ 99 Æ c
0102 Æ 102 Æ f
Elde edilen karakterler birleştirildiğinde şifre çözülmüş olur: “acf”
DİKKAT:
Deşifre algoritmasının tüm kodları btnSifreyiCoz kontrolünün Click olayına
yazılacaktır.
Şifreyi Sıralı Kodlara Dönüştürme
Bu algoritma verilen şifreyi sıralı Ascii kodlarına dönüştürür.
1. Şifreyi lblSifre etiketinden alın ve sıralı kodların oluşturulması için
gereken değişkenleri tanımlayın.
// Algoritma 1 - 1
string Sifre = lblSifre.Text;
string SiraliKodlar = null;
short i = 0;
32
KISIM I:
// Başa ve sona rakam ekleneceği için
// değişkenlere başlangıç değerleri verilir
string ilkYarisi = "";
string sonYarisi = "";
2. Şifrenin tüm elemanları üzerinde bir döngü kurarak, sıralı kodların ilk
ve son yarısını oluşturun. Kodların ilk yarısı, şifrenin tek haneli
rakamları ile; kodların son yarısı, şifrenin çift haneli rakamları ile
oluşturulur. Dolayısıyla döngünün sayacı ikişer ikişer artmalıdır.
Şifrenin i indisli rakamını sıranın ilk yarısına, yanındaki rakamı (i + 1
indisli rakamı) sıranın son yarısına ekleyen kodları yazın.
for ( i=1; i<=System.Convert.ToInt16( Sifre.Length ); i+=2 )
// Algoritma 1 - 2
// Sıranın ilk yarısının sonuna rakam eklenir.
ilkYarisi += Strings.Mid( Sifre, i, 1 );
// Algoritma 1 - 3
// Sıranın son yarısının başına rakam eklenir.
sonYarisi = sonYarisi.Insert( 0, Sifre.Substring(i , 1 ) );
}
3. Sıralı kodların ilk yarısı ve son yarısı birleştirilir. Elde edilen değer, 4
haneli Ascii kodlarının sırayla tutulduğu bir String değeridir.
// Algoritma 1 - 4
SiraliKodlar = ilkYarisi + sonYarisi;
Sıralı Kodların Okunması
İlk algoritmada elde edilen sıralı Ascii kodları, bu algoritmada okunarak
karakterlere çevrilir ve şifre çözülmüş olur.
1. Şifre çözüldüğü zamanki değerinin tutulacağı değişkeni tanımlayın ve
sıralı kodlar üzerinde bir döngü kurun. Sıralı kodların 4 haneli kodlardan
33
BÖLÜM 1:
oluştuğu için, döngüde bir seferde 4 rakam alınacaktır. Bunun için
döngünün sayacı 4 artırılmalıdır.
i = 0;
string yazi = "";
while ( i < SiraliKodlar.Length ) {
i += 4;
}
DİKKAT:
2 – 3 etaplarında yazılacak tüm kodlar Do While döngüsünün içine
yazılacaktır.
2. Döngü her seferinde bir Ascii kodu alır. Bu değeri tutan bir değişken
tanımlanır ve sıralı kodlardan 4 haneli rakam bu değişkene atanır.
int AsciiKodu;
// Algoritma 2 - 1
AsciiKodu = int.Parse( SiraliKodlar.Substring(i , 4 ) ) ;
3. Alınan Ascii kodunun karakter karşılığı bulunur ve yazi değişkenine
eklenir.
// Algoritma 2 - 2
yazi += Microsoft.VisualBasic.Strings.Chr( AsciiKodu );
4. Döngü sonunda elde edilen değer lblDesifre etiketine yazılır.
// Algoritma 2 - 3
lblDesifre.Text = yazi;
Lab 2: Sıralama Algoritması
Bu algoritma, bir dizinin elemanlarını küçükten büyüğe sıralar.
Dizinin Doldurulması
1. Siralama isimli bir Windows projesi açın
2. Form üzerine biri lbSirasiz, diğeri lbSirali isimli iki ListBox ekleyin.
Bu kontroller dizinin sırasız ve sıralı halini listeler.
3. btnListele ve btnSirala isimli iki Button ekleyin.
4. Formun kod tarafına geçin ve bir dizi tanımlayın. Bu dizi bir çok yordamın
içinde kullanılacağı için global olarak tanımlanır.
public string[] dizi = new string[ 5 ];
5. btnListele düğmesinin Click olayına, diziyi karışık bir şekilde isimlerle
dolduran kodları yazın:
dizi[
dizi[
dizi[
dizi[
dizi[
0
1
2
3
4
]
]
]
]
]
=
=
=
=
=
"Enis";
"Engin";
"Tamer";
"Kadir";
"Fulya";
int i;
for ( i=0; i<=dizi.Length - 1; i++ ) {
ListBox1.Items.Add( dizi[ i ] );
}
34
KISIM I:
Dizinin Sıralanması
Sıralama algoritması, dizi üzerinde bir döngü kurar ve sırayla dizinin bir
elemanı seçilir. Bu eleman için bir başka döngü kurulur ve seçilen elemanın
indisine kadar olan tüm elemanlarla bir karşılaştırma yapılır. Küçük olan sıranın
başına konmak için büyük olan ile yer değiştirilir.
Örnek
1. Dizinin 2. elemanı seçilir: “Engin”
Dizinin 2. indisine kadar olan elemanlarla karşılaştırılır. “Engin” değeri alfabetik
sırada “Enis” değerinden küçük olduğu için, bu iki değer yer değiştirilir.
Sıra, Engin Enis Tamer Kadir Fulya olur.
2. Dizinin 3. elemanı seçilir: “Tamer”
Dizinin 3. indisine kadar olan elemanlarla karşılaştırılır. “Tamer” değeri, “Enis”
ve “Engin” değerlerinden büyük olduğu için sıralama değişmez.
3. Dizinin 4. elemanı seçilir: “Kadir”
Dizinin 4. indisine kadar olan elemanlarla karşılaştırılır. “Kadir” < “Tamer”
olduğu için bu iki değer yer değiştirilir.
Sıra, Engin Enis Kadir Tamer Fulya olur.
“Kadir” değeri , “Enis” ve “Engin” değerlerinden büyük olduğu için sıralama
değişmez.
4. Dizinin 5. elemanı seçilir: “Fulya”
Dizinin 5. indisine kadar olan elemanlarla karşılaştırılır. “Fulya” < “Tamer”
olduğu için bu iki değer yer değiştirilir.
Sıra, Engin Enis Kadir Fulya Tamer olur.
“Fulya” < “Kadir” olduğu için bu iki değer yer değiştirilir.
Sıra, Engin Enis Fulya Kadir Tamer olur.
Dizideki tüm değerler kontrol edildiği için algoritmadan çıkılır.
35
BÖLÜM 1:
1. btnSirala düğmesinin Click olayına, dizi üzerinde bir döngü tanımlayın.
Bu döngü dizinin (1 indisli) ikinci elemanından başlayarak dizi sonuna
kadar devam edecektir. Daha sonra bu döngü içine başka bir döngü daha
yazın. Bu döngü, ilk döngünün sayacından başlar ve sıfır olana kadar
devam eder. İkinci döngünün amacı, ilk döngüde seçilen elemanı, dizinin
başına kadar olan elemanlarla karşılaştırmaktır.
int i;
for ( i=1; i<=dizi.Length - 1; i++ ) {
int j = i;
while ( j != 0 && String.Compare(dizi[ j ], dizi[ j - 1
]) == -1 ) {
// Yer değiştirme Algoritması
j -= 1;
}
}
While döngüsü, j değeri sıfır olana kadar ve dizinin kontrol edilen değeri bir
önceki değerden küçük olana kadar devam eder. Burada, dizi elemanlarının
kontrolünün sadece bir defa (bir önceki eleman ile) yapıldığı düşünülebilir.
Ancak küçük eleman yer değiştirildiğinde j değeri bir düşürülür. Döngü tekrar
çalıştığı zaman, aynı eleman bu sefer dizinin kalan elemanlarıyla karşılaştırılır.
AndAlso operatörü, j değerinin sıfır olma durumunda diğer kontrolün
yapılmaması için kullanılır. Diğer kontrolde dizi(j – 1) ifadesi, negatif indisli
değere ulaşılmak istendiği için hata mesajı verir.
36
KISIM I:
2. Yer değiştirme algoritması, bir değişkenin değerinin geçici bir yerde
tutulması ile gerçekleştirilir.
Sıralama algoritmasında dizinin j ve j - 1 indisli değerleri yer değiştirilir.
While döngüsü içinde “Yer değiştirme Algoritması” yazan yorum satırını
kaldırın ve yerine algoritma kodlarını yazın.
// Yer değiştirme
string temp = dizi[ j - 1 ];
dizi[ j - 1 ] = dizi[ j ];
dizi[ j ] = temp ;
3. lbSirali liste kutusunda dizinin yeni sırasını görüntüleyen kodları yazın.
for (int t=0; t<=dizi.Length - 1; t++ ) {
ListBox2.Items.Add( dizi[ t ] );
}
Lab 3: Arama Algoritması
Arama algoritmaları, sıralı bir liste üzerinde bir değerin aranmasıdır. Karışık
sırada olan bir listede yapılan arama, ancak listenin başından sonuna kadar
tüm elemanlarının kontrol edilmesi ile gerçekleşir. Bu yöntem büyük dizilerde
performansı düşürür. Belirli bir sırada olan dizilerde ise daha hızlı arama
yöntemleri kullanılmalıdır. Bu labda ikili arama yöntemi (Binary Search)
incelenecektir.
DİKKAT: İkili arama yöntemi sadece sıralı bir dizi üzerinde uygulanabilir. Ya da elimizdeki
dizi öncelikle sıralanır.
37
BÖLÜM 1:
NOT: İkili arama yönteminde büyük küçük kıyaslaması yapıldığından dizinin sıralı olması
gerekir.
Dizinin sıralanması
Arama algoritması sıralı bir dizi üzerinde çalışacağı için, dizi oluşturulduktan
sonra sıralanması gerekir.
1. IkiliArama isminde bir Windows projesi açın.
2. Forma btnAra isimli bir Button ve lbDizi adlı bir ListBox ekleyin.
3. Kod sayfasına geçin ve global bir dizi tanımlayın.
public int[] dizi = new int[ 11 ];
4. Formun Load olayına diziyi rasgele sayılar ile doldurmak için gereken
kodları yazın.
int i;
Random r = new Random();
for (i=0; i<=10; i++ )
{
dizi[ i ] = r.Next(1000);
}
5. Diziyi sıralayın ve değerlerini lbDizi adlı listeye ekleyin.
Array.Sort( dizi );
for ( i=0; i<=10; i++ ) {
ListBox1.Items.Add( dizi[ i ] );
}
Arama algoritması
İkili arama algoritması, dizi üzerinde aranacak değeri önce sıranın ortasındaki
değerle karşılaştırır. Dizi küçükten büyüğe sıralı olduğu için, eğer aranan değer
ortadaki değerden küçükse arama, dizinin ilk yarısında devam eder. Dizinin
diğer yarısı aranan değerden büyük değerler içerdiği için, aramaya dâhil
edilmez.
Örnek
Küçükten büyüğe sıralı dizi üzerinde 9 değeri aranacaktır.
Dizi: 1 2 4 7 9 10 12 18
1. Son, baş ve orta değişkenleri tanımlanır: Son değeri dizinin son
elemanının indisini, baş değeri dizinin ilk elemanının indisini, orta
değeri ise son + baş / 2 değerini alır. Orta değeri virgüllü bir değer
alırsa tam sayıya çevrilir.
2. Başlangıç olarak baş -1, son dizi uzunluğu değerini alır.
Baş = -1
Son = 8
Orta = (8 – 1) / 2 = 3
3. Dizinin orta indisli değeri alınır. Dizi(3) = 7
38
KISIM I:
4. Aranan 9 değeri, yediden büyük olduğu için, dizini son yarısında
aranır. Baş değişkenine orta değeri verilirse, dizinin başlangıç indisi
değiştirilir, böylece aramalar dizinin son yarısında gerçekleşmiş olur.
Dizi: 9 10 12 18
Baş = 3
Son = 8
Orta = (8 + 3) / 2 = 5
5. Dizinin orta indisli değeri alınır. Dizi(5) = 10
6. 9 değeri, ondan küçük olduğu için, kalan dizinin ilk yarısında aranır.
Dizi: 9 10
Baş = 3
Son = 5
Orta = (5 + 3) / 2 = 4
7. Dizinin ortasındaki değer alınır: 9
8. Böylece 9 değerinin indisi orta değeri olur.
39
BÖLÜM 1:
Kodlar
Arama algoritmasının kodları btnAra düğmesinin Click olayına yazılacaktır.
1. Algoritma için gerekli bas, son ve orta değişkenlerini tanımlayın ve
başlangıç değerlerini verin. Aranan değerin indisini tutmak için de bir
değişken tanımlayın.
int
int
int
int
son = dizi.Length;
bas = -1;
orta;
indis;
2. Kullanıcıdan aranacak değeri girmesini isteyin.
int hedef = int.Parse(textBox1.Text);
40
KISIM I:
3. Dizide aranacak değer kalmadığı zaman çıkan bir döngü kurun. Son
ve bas değerleri arasındaki fark bire düştüğünde, dizide aranacak
değer kalmamıştır.
while ( son - bas > 1 ) {
}
4. While döngüsü içine, dizinin orta indisli değerini alan ve bu değeri
aranan değerle karşılaştıran kodları yazın.
orta = ( son + bas ) / 2;
if ( dizi[ orta ] > hedef ) {
son = orta;
}
else if ( dizi[ orta ] < hedef ) {
bas = orta;
}
else {
indis = orta;
MessageBox.Show( "İndis: " +
indis.ToString());
return;
}
Eğer dizinin ortasındaki değer aranan değerse, indis bulunmuş demektir.
orta değişkeni kontrolün yapıldığı değerin indisini tuttuğu için, sonuç orta
değeri olur ve yordamdan çıkılır.
5. Eğer istenen değer bulunamadan döngüden çıkılırsa, indis -1 değerini
alır. End While ifadesinden sonra, aranan değerin bulunamadığını
belirten kodu yazın.
indis = -1;
MessageBox.Show( "İndis: " + indis + " Aranan değer
bulunamadı");
41
BÖLÜM 1:
Modül Sonu Soruları & Alıştırmalar
Özet
 Algoritma kurmak
 Dump Coding çözümlemesi
 Akış diyagramları
1. if ifadesi hangi veri tipini kontrol eder?
2. if - switch karar yapılarının farkları nelerdir?
3. true | false & false
4.
5.
6.
7.
8.
(true | false) & false
ifadeleri hangi değerleri döndürür?
4 boyutlu bir dizinin tüm elemanlarını doldurmak için, dizi üzerinde kaç
tane döngü kurulmalıdır?
Uygulamaları derledikten sonra hatalar hangi yollarla görülebilir?
Finally bloğundaki kodlar ne zaman çalışır?
Sıralı arama yönteminde (Linear Search) dizinin elemanlarının sıralı
olması gerekli midir?
Sıralı arama yöntemin bir dizi üzerinde uygulayın.
Modül 7: Fonksiyonlar ve Yordamlar
Hedefler
 Sub – Function kullanımı
 .NET Tarih, String, Matematik
fonksiyonları
 Online Offline yardımın etkin kullanımı
Uygulama geliştirirken, bir işlemin birçok yerde kullanıldığı zamanlar olur. Bu
gibi durumlarda bir kere yazılan kodlar, farklı yerlerde tekrar yazılır. Uygulama
üzerinde bir değişiklik yapılmak istenirse, tekrar yazılan kodların tek tek
bulunup değiştirilmesi gerekir. Böylece hem uygulamanın yazımı zorlaşır hem
de değişik yapmak giderek imkânsız hale gelir. Bu problemler, birçok yerde
yapılması istenen işlemlerin fonksiyonlar ve yordamlar içinde yazılması ile
çözülür. Sadece fonksiyon ve yordamların isimleri kullanılarak, istenen yerlerde
kodlar çalıştırılır.
Yapılan işlemin sonucunda oluşan değer isteniyorsa fonksiyonlar kullanılır.
Örneğin veritabanına yeni bir kullanıcı ekledikten sonra kullanıcının ID
numarası isteniyorsa fonksiyon kullanılmalıdır. Eğer yapılan işlemlerin sonunca
bir değer döndürülmüyorsa yordamlar kullanılır. Örneğin bir ComboBox
kontrolüne öğe ekleme işlemi yordam içine yazılabilir.
.NET çatısındaki nesnelerin birçok fonksiyon ve yordamları vardır. Tüm
fonksiyon ve yordamların kaç parametre aldığı, geriye dönüş değerinin ne
olduğu, hangi nesneye ait oldukları ezberlenemez. Dolayısıyla Visual Studio
yardımının kullanılması kaçınılmazdır.
Bu modül tamamlandıktan sonra:
•
Yordam ve fonksiyon kullanarak kodlarınızın yönetilebilirliğini ve
esnekliğini artıracak,
•
Fonksiyon ve yordamların farklarını ayırt edebilecek,
2
KISIM I:
•
.NET çatısındaki tarih ve zaman, matematik, String fonksiyonlarını
tanıyacak,
•
Offline ve Online yardımı etkin bir şekilde kullanabileceksiniz.
Konu 1: Void (Yordam)
Void
ƒ Dönüş değeri olmayan kod bloklarıdır.
ƒ Birçok yerde kullanılacak kodlar,
yordamlar ile gruplanmalıdır.
void Temizle()
{
Label1.Text = "";
ListBox1.Items.Clear();
}
Yordamları dönüş değeri olmayan kod bloklarıdır. Bu yordamlar void ifadesi ile
belirtilir.
void YordamIsmi()
{
}
Uygulama içinde birçok yerde çalışacak kodlar yordam içinde yazılır. Bu kodlar,
içine yazıldıkları yordamın ismi ile çağırılarak, istenilen yerde tekrar
çalıştırılabilir. Örneğin bir uygulama başlarken form üzerindeki kontrollerin
temizlenmesi gerekiyorsa, bu kodları bir daha yazmamak için yordam
kullanılabilir.
void Temizle()
{
label1.Text = "";
listBox1.Items.Clear();
}
Yordamı tanımlarken parantezler içine, alabileceği parametreler yazılır. Eğer
yordam parametre almıyorsa parantezlerin içi boş bırakılır.
3
BÖLÜM 1
void YazilimUrunleriEkle()
{
ComboBox1.Items.Add("Yazılım Uzmanlığı");
ComboBox1.Items.Add("Yazılım Mühendisliği");
Label1.Text = "Yazılım paketleri eklendi...";
}
Yordamları tanımladıktan sonra başka bir yordam veya fonksiyon içinde
kullanılır. Yordamı kullanmak için, gerekli yere isminin yazılması yeterlidir.
Void DersleriListele()
{
switch( ComboBox1.SelectedIndex )
{
case 0:
Temizle();
ListBox1.Items.Add("Access - İlişkisel
Veritabanları");
ListBox1.Items.Add("Programlamaya Giriş Ve
Algoritma");
ListBox1.Items.Add(".NET Framework");
ListBox1.Items.Add("VB.NET ile Windows Tabanlı
Programlama");
ListBox1.Items.Add("ASP.NET ile Web Tabanlı
Programlama");
Label1.Text = "Yazılım Uzmanlığı dersleri
yüklendi." ;
break;
case 1;
Temizle();
Yönetimi");
ListBox1.Items.Add("SQL Server Veritabanı
ListBox1.Items.Add("Visual Studio .NET ile
Uygulama Geliştirme");
ListBox1.Items.Add("ADO.NET ile Veri Yönetimi ve
XML");
ListBox1.Items.Add("XML Web Services, .NET
Remoting ve COM+");
ListBox1.Items.Add("Proje Yönetimi");
yüklendi.";
Label1.Text = "Yazılım Mühendisliği dersleri
break;
default:
Temizle();
Label1.Text = "Yazılım paketi seçiniz.";
break;
}
}
Burada ComboBox kontrolünden seçilen değerin kontrolün indis üzerinden
yapılması, YazilimUrunleriEkle yordamında eklenen elemanların sırası
değişirse problem yaratır. Liste kutusuna eklenen dersler yanlış paketlerde
gözükür. Ancak ComboBox kontrolünün seçili metni üzerinden kontrol yapılırsa
4
KISIM I:
da, eklenen isimler değiştiği zaman bir problem ortaya çıkar. Bu durumda iki
yordamın birbirine bağımlılığı görülür. Bu örnekte, bir yordamda değişiklik
yapıldığı zaman diğer yordamın çalışma şekli de kontrol edilmelidir.
Label ve ListBox kontrollerini temizleyen kodlar sadece iki satır olduğu için
Temizle yordamında yazılmayabilirdi. Ancak bu kodlar DersleriListele
yordamında üç defa kullanıldığı için her değişiklikte, kodun yazıldığı üç yer
bulunup gerekli düzeltmeler yapılacaktı. Örneğin temizle işlemi, liste kutusunda
“Dersler” metni gözükecek şekilde değiştirebilir. Bu durumda, değişikliği
sadece Temizle yordamında yapmak yeterli olur.
Void Temizle()
{
Label1.Text = "";
ListBox1.Items.Clear();
ListBox1.Items.Add("Dersler: ");
}
Parametre Kullanımı
Parametre Kullanımı
ƒ Parametreler ile yordamların davranışları
değiştirilir.
ƒ Params, aynı tipten sınırsız parametre
girilmesini sağlar.
Yordamların bazı değerlere göre farklı işlem yapması istenebilir. İşlemin bağlı
olduğu bu değerlere parametre veya argüman denir. Yordamlar parametre
alacak şekilde tanımlanıp, çağırıldıkları sırada istedikleri parametreleri verilerek
kullanılır.
Void YordamIsmi(VeriTipi Parametre1, VeriTipi Parametre2, …)
{
}
5
BÖLÜM 1
Örneğin uygulamanın birçok yerinde kullanıcıya bilgi vermek amaçlı mesaj
kutuları kullanılır. Eğer bu mesajlar bir yordam içine yazılırsa, daha sonra
mesajları bir Label üzerinde gösterilecek şekilde değiştirmek kolay olacaktır.
Yordamın göstereceği mesajlar parametre olarak verilmesi gerekir.
Void MesajGoster(string mesaj)
{
Label1.Text = mesaj;
}
Void Yordam1()
{
//...
MesajGoster("1. Yordam içinden çağılır.");
}
Void Yordam2()
{
//...
MesajGoster("2. Yordam içinden çağılır.");
}
Void Yordam3()
{
// ...
MesajGoster("3. Yordam içinden çağılır.");
}
Yordamları çağırırken tüm parametrelerin belirtilen veri tipte verilmesi gerekir.
Yordamları tanımlarken parametreleri isimleri ve veri tipleri belirtilmelidir. Ayrıca
parametreler değer tipi ya da referans tipi olarak geçileceği belirtilmelidir.
Yordamın normal akışından çıkılmak istenirse Return ifadesi kullanılır.
Void MusteriBilgisi(int MusteriId)
{
if( ! MusteriId > 0 )
Return
// MusteriId değerine göre
// müşteri bilgileri veritabanından çekilir.
}
Diziler parametre olarak kullanıldıklarında büyüklükleri verilmez. Fakat
parantezler kullanılarak, verilen parametrenin dizi olduğu belirtilmelidir.
void MatrisTopla(int [,] matris1 , int [,] matris2)
{
int x = matris1.GetLength(0);
int y = matris1.GetLength(1);
if
(x
!=
matris2.GetLength(0)
matris2.GetLength(1))
{
MessageBox.Show("Matris
boyutlarının
birbiriyle aynı olmalıdır.");
||
y
!=
büyüklükleri
6
KISIM I:
return;
}
int [,] sonuc = new int[x - 1, y - 1];
for(int i = 0; i < x; i++)
{
for (int j = 0 ; j < y; j++)
{
sonuc[i, j] = matris1[i, j] + matris2[i, j];
}
}
}
Diziler yordamlara parametre olarak geçilirken, sadece isimleri verilir.
int [,]m1 = {{1, 3, 5}, {7, 9, 11}};
int [,]m2 = {{0, 2, 4}, {6, 8, 10}};
MatrisTopla(m1, m2)
Params
Yordamları ve fonksiyonları çağırırken parametrelerin mutlaka girilmeleri
gerekir. Ancak bazı durumlarda yordamlara ve fonksiyonlara girilecek
parametrelerin sayısı tasarım zamanında belli olmaz. params anahtar kelimesi
ile yordamlara, aynı veri tipinde parametre dizisi verilebilir. params ile verilen
dizi yordamın son parametresi olarak tanımlanmalıdır.
public void YasOrtalamasi(
byte[] Yaslar ) {
int toplam = 0;
double ortalama = 0.0;
string
sinif,
params
int i;
for ( i=0; i<=Yaslar.Length - 1; i++ ) {
toplam += Yaslar[ i ];
}
// Parametre verilmezse i = 0 olur
if ( i > 0 ) {
ortalama = toplam / i;
}
MessageBox.Show(
sinif
+
"
sınıfının
ortalaması: " + ortalama);
}
yaş
Yaş ortalamasını hesaplayan bu yordamın ilk parametresi verilmek zorundadır.
params ile tanımlı olan dizi, yordam çağırılırken girilen tüm parametreleri tutar.
Fakat girilen bu parametrelerin veri tipleri aynı olmak zorundadır. Bu örnekte
girilecek yaşlar Byte tipinde olacaktır.
7
BÖLÜM 1
private void Button1_Click2( System.Object sender,
System.EventArgs e ) {
// İlk parametre verildikten sonra,
// istenen sayıda parametre verilebilir
YasOrtalamasi("YU6112", 45, 14, 25, 28);
// Yaşlar parametre olarak verilmeyebilir
YasOrtalamasi("YU6112");
}
Parametrelerin sınırlı olmaması, dizilere eleman ekleme işlemini kolaylaştırır.
Örneğin bir diziye birçok eleman eklemek için, bu elemanların bir dizi içinde
parametre verilmesi gerekir.
public string[] Raf;
public void KitapEkle( string[] Kitap ) {
// Raf dizisine, kitaplar dizisinin
// elemanları eklenir.
}
Bu yordamın kullanımı için, eklenecek değerlerin önce bir diziye aktarılması
gerekir. Yordamın yazılması kolay ancak kullanımı zordur. Bu yordamı
kullanacak programcının işi params ile kolaylaştırılır.
public void Mesaj( string msg ) {
Label1.Text += msg + "\n";
}
) {
public void KitapEkle( string Kitap, byte Genisletme
if ( Genisletme == 0 ) {
Mesaj( "Dizi boyutu geniletilemedi..." );
return ;
}
// Genişletme faktörü kullanıcıya bırakıldığı için
// dizide boş alanlar olabilir. İlk boş alan bulunup
// veri buraya aktarılır.
int i;
while ( i < Raf.Length ) {
if ( Raf( i ) == ( ( System.String[] )( "" )
) ) {
Raf( i ) = ( ( System.String[] )( Kitap
) );
return;
}
i += 1;
}
// Dizide boş yer yoksa yeniden boyutlandırılır.
string[] Temp = new string[ i + Genisletme ];
System.Array.Copy( Raf, Temp, Raf.Length );
Raf = Temp;
Raf[ i + 1 ] = Kitap;
}
Önce, diziye bir tek eleman ekleyen yordam yazılır. Dizinin tüm alanları
doluysa, genişletme parametresinde verilen değer kadar tekrar boyutlandırılır.
8
KISIM I:
Genişletme değişkeni Byte veri tipinde tanımlı olduğu için negatif değer
alamaz. Dolayısıyla dizinin boyutunun küçültülmesi engellenmiş olur.
Bu yordam tek başına kullanılabilir olduğu gibi, diziye birçok eleman ekleyecek
yordama yardımcı niteliğindedir.
);
public void Ekle( params string[] Kitaplar ) {
for ( i=0; i<=Kitaplar.Length - 1; i++ ) {
// Genişletme faktörü 5 ile tek tek kitap eklenir.
KitapEkle( Kitaplar[ i ], 5 );
}
Mesaj( Kitaplar.Length + " kitap rafa eklendi."
}
Bu yordam ise sınırsız parametre alarak, dizi işlemlerinde programcıya kolaylık
sağlar.
private void Button1_Click( System.Object sender,
System.EventArgs e ) {
Ekle( "Kitap1", "Kitap2", "Kitap3" );
}
Void Main
Void Main
ƒ Başlangıç yordamıdır.
ƒ Application sınıfı kullanılarak, istenen
formlar yüklenir.
public static void Main()
{
Application.Run( new Form1() );
}
Yeni bir yordam tanımlarken Main yordamı hariç istenilen isim verilebilir. Main
yordamı bütün uygulamaların giriş noktasıdır. Windows uygulamalarında
formlar yüklenmeden önce o form içinde tanımlı Main yordamı çalıştırılır. Bu
Main yordamında Application sınıfı başlangıç formunu Run metodu ile
BÖLÜM 1
yükler. Application sınıfı, .NET Framework çatısında, uygulamaları
başlatmak, yönetmek ve sonlandırmak için kullanılır.
Projenin özelliklerinden başlangıç nesnesi Sub Main olarak ayarlanırsa,
uygulama çalıştığı zaman tüm projede Main yordamı arar. Windows
uygulamaları geliştirirken Main yordamı yazılırsa başlangıç formunun da bu
yordam içinde belirtilmesi gerekir. Bu yordam bir modülün içinde tanımlanabilir.
public static void Main()
{
Application.Run( new Form1() );
}
Application sınıfının Run metodu, parametre olarak başlangıç formu ister.
Uygulama başladığı zaman hangi formun çalışması isteniyorsa, bu formdan
oluşturulup parametre olarak verilir. New anahtar kelimesi, sınıfları oluşturmak
için kullanılır.
Başlangıç formu olarak seçilen bir Windows formunda Main yordamı
tanımlanırsa, bu yordam static olarak tanımlanmalıdır. static metotlar
uygulama genelinde paylaştırılan sabit metotlardır.
public static void Main()
{
MessageBox.Show("Başlangıç formları kod ile
yüklenmelidir.");
}
Başlangıç formu olarak ayarlanmış bir formun içine bu Main yordamı
tanımlanırsa, formu yüklemek için herhangi bir kod yazılmadığı için uygulama
sadece mesaj kutusunu gösterecektir.
9
10
KISIM I:
Konu 2: Fonksiyonlar
Function
ƒ İşlem yapıldıktan sonra değer döndürülür.
ƒ Return ifadesinden sonraki kodlar
çalıştırılmaz.
bool KontrolOk()
{
if (TextBox1.Text.Length > 0
ComboBox1.SelectedIndex > -1)
{
return false;
}
return true;
}
&
Fonksiyonlar bir işlem yaptıktan sonra geriye değer döndürürler. Örneğin bir
çarpma fonksiyonunun dönüş değeri, parametre olarak verilen iki sayının
çarpımı olacaktır. Fonksiyonların tanımları değişkenler gibidir.
DönüşVeriTipi Fonksiyon(VeriTipi Param1, ...)
{
}
Fonksiyonların geriye dönüş değerleri Return ifadesi ile yapılır.
bool KontrolOk()
{
if (TextBox1.Text.Length > 0
> -1)
{
return false;
}
& ComboBox1.SelectedIndex
return true;
}
private void Button1_Click( System.Object sender,
System.EventArgs e ) {
if (! KontrolOk())
{
MessageBox.Show("Seçiminizi yaptıktan sonra devam
edebilirsiniz.");
return;
11
BÖLÜM 1
}
// Kontrol tamamlandıktan sonra yapılacak işlemler
}
Bu fonksiyonun çalışması Return ifadesinden sonra yazılan değerin
döndürülmesiyle sonlanır. Burada dikkat edilmesi gereken nokta, fonksiyon
değer döndürdükten sonra sonlandığı için Return ifadesinden sonra gelen
hiçbir kod çalıştırılmaz. Eğer dönüş değerini belirledikten sonra başka bir
işlemin yapılması isteniyorsa, fonksiyon ismi kullanılır. Fonksiyonun ismi bir
değişken gibi gözükse de, temsil ettiği değer fonksiyonun dönüş değeridir.
float GunlukKur(string Cinsi)
{
Switch(Cinsi)
{
Case "d":
Case "D":
Return 1.43;
Case "e":
Case "E":
Return 1.81;
Case "s": "
Case "S":
Return 2.91;
}
}
) {
public double KurHesapla( float Miktar, string Cinsi
return Miktar * GunlukKur( Cinsi );
// Bu satırdan sonra yazılan kodlar işlenmez.
}
private void Button1_Click1( System.Object sender,
System.EventArgs e ) {
Label1.Text
=
System.Convert.ToString(
KurHesapla( -1000, "d" ) );
}
Örnek: Sınıf geçme notunun hesaplanması, geriye bir sonuç döndürüleceği
için fonksiyon ile yazılması gereklidir. Parametre olarak final ve vize notları
alınır ve bu değerlerle hesaplanan geçme notu sonuç olarak döndürülür. Vize
notlarının girilmesi zorunlu değildir, dolayısıyla bu değerler params olarak
verilebilir.
public
int
NotHesapla(
int
VizeKatSayisi, params int[] vizeler ) {
int vizeToplam = 0;
double vizeOrtalama = 0.0;
int i;
Final,
float
12
KISIM I:
for ( i=0; i<=vizeler.Length - 1; i++ ) {
vizeToplam += vizeler( i );
}
if ( i > 0 ) {
vizeOrtalama = vizeToplam / i;
}
float finalKatSayisi = 1 - VizeKatSayisi;
return finalKatSayisi * Final + VizeKatSayisi *
vizeOrtalama;
}
Fonksiyonun ilk parametresi final notudur. Final notu bir tane olacağı için
girilmesi zorunludur. Daha sonra vize notlarının ortalaması hesaplanarak final
notu ile toplanır. Parametre olarak verilen vize katsayısı, vize notlarının
ortalamadaki ağırlıklarını belirler.
private void Button1_Click( System.Object sender,
System.EventArgs e ) {
int gecmeNotu;
gecmeNotu = NotHesapla( 70,
System.Convert.ToSingle( 0.6 ), 90, 80, 86, 75, 90 );
MsgBox( gecmeNotu );
}
Fonksiyonlar ve Yordamların Aşırı Yüklenmesi
Function – Sub OverLoad
ƒ Aynı isimde birden fazla metot yazılmasıdır.
ƒ Parametreleri farklı olmalıdır.
public void UrunAra( int UrunId ) {
// Ürün numarasına göre arama yapılır.
}
public int UrunAra( string UrunIsmi )
{
// Ürün ismine göre arama yapılır.
// Bulunan ürünün numarası döndürülür.
}
13
BÖLÜM 1
Fonksiyon ve yordamları kullanırken, aynı isimde birden fazla
tanımlanabildikleri görülür. Buna Aşırı Yüklenme (OverLoad) denir. Bir
yordamın ve fonksiyonun aşırı yüklenmesi kullanımını kolaylaştırır. Aynı isimde
farklı seçenekler sunması metotların kullanışlığını arttırır.
public void UrunAra( int UrunId ) {
// Ürün numarasına göre arama yapılır.
}
public int UrunAra( string UrunIsmi ) {
// Ürün ismine göre arama yapılır.
// Bulunan ürünün numarası döndürülür.
}
public int UrunAra( string UrunIsmi, DateTime
UretimTarihi ) {
// Ürün ismine ve üretim tarihine göre arama yapılır.
// Bulunan ürünün numarası döndürülür.
}
public int UrunAra( DateTime UretimTarihi ) {
// Üretim tarihine göre arama yapılır.
// Bulunan ürünün numarası döndürülür.
}
Metotların aynı isimde olmasının ayrımı parametrelerin veri tipi ve sayısına
göre yapılır. Metotların isimleri, parametre sayısı ve parametrelerin veri tipleri
metotların imzalarını (Method Signatures) oluşturur. Örneğin ürün
numarasına göre arama yapan yordamın imzası UrunAra(int) şeklindedir.
int parametre alan bir UrunAra isminde başka bir yordam veya fonksiyon
tanımlanamaz. Fonksiyonların dönüş tipleri ile imzaları tanımlanmaz.
Metotları aşırı yüklerken dikkat edilmesi gereken bazı noktalar vardır.
•
İmzaları aynı olan metotlar tanımlanamaz
•
Fonksiyonlar
yüklenebilir.
•
Fonksiyonlar dönüş tiplerine göre aşırı yüklenemez.
yordamlarla,
yordamlar
da
fonksiyonlarla
aşırı
14
KISIM I:
Konu 3: String Fonksiyonları
String Fonksiyonları
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
CompareTo
Concat
CopyTo
EndsWith & StartsWith
ToUpper & ToLower
Join
SubString
Trim, TrimEnd, TrimStart
String fonksiyonları, kullanıldığı String değeri üstünde verilen parametrelere
göre değişen işlemler yaparlar. Sonuç olarak geriye döndürdükleri değerler,
fonksiyonun işleyiş amacına göre değişir.
•
CompareTo
Bu fonksiyon, işlemin yapılacağı değeri parametre olarak verilen değerle
karşılaştırır. İki değer bir birine eşitse 0, parametredeki değer alfabetik
olarak önde ise 1, değilse -1 değeri döndürülür.
string yazi1 = "BilgeAdam";
string yazi2 = TextBox1.Text;
eşit");
switch ( yazi1.CompareTo( yazi2 ) ) {
case 0:
MessageBox.Show( "Yazılar birbirine
break;
case 1:
MessageBox.Show( yazi1 + ", " + yazi2 +
" kelimesinden sonra geliyor");
break;
case -1:
MessageBox.Show( yazi1 + ", " + yazi2 +
" kelimesinden önce geliyor");
break;
}
•
Concat
String değerlerini birleştirmek için kullanılır. Parametre tipi params olduğu
için, sınırsız String değişkeni birleştirilebilir.
15
BÖLÜM 1
string kurum = "BilgeAdam";
Label1.Text = String.Concat("Kurum: ", kurum, "Şubeler: ",
"\n", "Fatih", "Bakırköy", "Kadıköy", "Beşiktaş", "Town
Center");
•
CopyTo
BU fonksiyon ile bir String değişkenin belli bir kısmı, bir karakter dizisine
kopyalanır. Ayrıca kopyalanacak dizinin hangi indisten itibaren
başlanacağı da belirtilir.
string yazi = "BilgeAdam";
char[] Karakterler = new char[ 11 ];
// Yazının 5. karakterinden itibaren alınan 4 karakter,
// karakterler dizisinin 3. indisinden başlanarak
// diziye kopyalanır.
yazi.CopyTo( 5, Karakterler, 3, 4 );
// Karakterler dizisinin son hali:
// _ _ _ A d a m _ _ _ _
Burada dikkat edilmesi gereken nokta, karakterlerin kopyalanacağı dizinin
büyüklüğünün yeterli olup olmadığıdır. Dizinin kopyalanmaya başlanacak
indisi ile kopyalanacak karakterlerin uzunluğunun toplamı, dizi
büyüklüğünden küçük olmalıdır
• EndsWith & StartsWith
Bu fonksiyonlar, String değişkeninin, parametrede verilen String
değeriyle başladığını ya da bittiğini gösterir. Geriye dönüş değeri Boolean
tipindedir.
bool degisken.EndsWith(string deger)
bool degisken.StartsWith(string deger)
string HtmlTag = "<table>";
if ( HtmlTag.StartsWith( "<" ) &
HtmlTag.EndsWith( ">" ) )
{
MessageBox.Show( "Yazım doğru");
}
• ToUpper & ToLower
ToUpper, String değişkenin içindeki küçük karakterleri büyüğe; ToLower,
büyük karakterleri küçüğe çevirir.
string yazi = "bilgeADAM";
MessageBox.Show(yazi.ToUpper());
// Sonuç: BİLGEADAM
MessageBox.Show (yazi.ToLower());
// Sonuç: bilgeadam
•
Join
Bir String dizisindeki elemanları, parametre olarak verilen ayraç karakteri
ile birleştirerek tek bir String değişkeni döndürür.
16
KISIM I:
string [] yazi = {"İsim", "Soyad", "Adres", "Email",
"Telefon"};
MessageBox.Show(String.Join(";", yazi));
// Sonuç: İsim;Soyad;Adres;Email;Telefon
•
SubString
Verilen bir String değerinin, bir bölümünü String olarak döndüren
fonksiyondur. İstenen karakterlerin hangi indisten başlayacağı parametre
olarak geçilir. Bu durumda, başlangıç karakterinden sona kadar okunur.
Ancak fonksiyonun, kaç karakter okunacağını belirten bir parametre kabul
eden aşırı yüklemesi de vardır.
string yazi = "BilgeAdam";
MessageBox.Show (yazi.Substring(5));
// Sonuç : Adam
MessageBox.Show (yazi.Substring(5, 2));
// Sonuç : Ad
•
Trim, TrimEnd, TrimStart
Trim fonksiyonu, parametre olarak verilen bir karakteri, String değişkeninin
başından ve sonundan kaldırır.
TrimEnd fonksiyonu parametrede verilen karakteri String değişkeninin sadece
sonundan, TrimStart ise sadece başından kaldırır.
string yazi = "--------Merhaba--------";
MessageBox.Show (yazi.Trim("-"));
// Sonuç: Merhaba
MessageBox.Show (yazi.TrimEnd("-"));
// Sonuç: --------Merhaba
MessageBox.Show (yazi.TrimStart("-"));
// Sonuç: Merhaba--------
17
BÖLÜM 1
Konu 4: Matematiksel Fonksiyonlar
Matematiksel Fonksiyonlar
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
Abs
Ceiling & Floor
Cos, Sin, Tan
Exp
Log
Max & Min
Pow
Sqrt
Uygulamalarda çoğu zaman matematiksel hesaplamalara ihtiyaç duyulur. Bu
hesaplamaları kolaylaştıran hazır matematik fonksiyonları vardır. Bu
fonksiyonlar .NET Framework çatısında System.Math uzay alanının içinde
tanımlanmıştır.
•
Abs
Verilen bir sayının mutlak değerini döndürür. Dönen değer her durumda
pozitif olacaktır.
Math.Abs(-123)
// Sonuç: 123
•
Ceiling & Floor
Ceiling fonksiyonu, Double veri tipinde verilen bir sayıdan büyük, en
küçük tamsayıyı verir. Floor fonksiyonu verilen sayıdan küçük, en büyük
tam sayıtı verir.
Math.Ceiling(-12.231231)
// Sonuç: -12
Math.Ceiling(12.231231)
// Sonuç: 13
Math.Floor(-12.231231)
// Sonuç: -13
Math.Floor(12.231231)
// Sonuç: 12
18
KISIM I:
• Cos, Sin, Tan
Bu fonksiyonlar temel trigonometrik işlemleri gerçekleştirir. Cos fonksiyonu
verilen derecenin kosinüsünü, Sin sayının sinüsünü ve Tan sayının
tanjantını hesaplar. Parametre olarak verilen derece radyan (360 derece)
değeri olarak kabul edilir.
double Derece = 90;
Math.Cos(Math.PI * Derece / 180);
Math.Sin(Math.PI * Derece / 180);
Math.Tan(Math.PI * Derece / 180);
•
Exp
Bu fonksiyon, e sabitinin değerini (yaklaşık 2,718281 değerini),
parametrede verilen sayı ile üssünü alır.
Math.Exp(4)
// Sonuç yaklaşık: 54,59815
•
Log
Logaritmik hesaplamalar için kullanılan bir fonksiyondur.
parametresi verilmezse sayının e tabanında logaritmasını alır.
Taban
Math.Log(1000, 10)
// Sonuç: 3
Math.Log(Math.E)
// Sonuç: 1
•
Max & Min
Max fonksiyonu verilen iki sayıyı karşılaştırarak büyük olanı, Min
fonksiyonu ise sayılardan küçük olanı döndürür.
Math.Max(100, 200)
// Sonuç: 200
Math.Min(100, 200)
// Sonuç: 100
•
Pow
İlk parametrede verilen bir sayının, ikinci parametredeki değer kadar
üssünü alır.
Math.Pow(10,3)
// Sonuç: 1000
•
Sqrt
Verilen sayının karekökünü hesaplar.
Math.Sqrt(441)
// Sonuç: 21
19
BÖLÜM 1
Konu 5: Tarih ve Zaman Fonksiyonları
Tarih ve Zaman Fonksiyonları
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
DateAdd
DateDiff
CompareTo
DaysInMonth
IsLeapYear
Parse
ToLongDateString & ToLongTimeString
ToShortDateString & ToShortTimeString
Tarih ve zaman fonksiyonları Date veri tipi üzerinde hesaplamalar yapan
fonksiyonlardır. Bu fonksiyonlar System.DateTime uzay alanında tanımlıdır.
•
CompareTo
String ifadelerinde olduğu gibi, tarih ve zaman değerleri üzerinde de
karşılaştırma yapılabilir. CompareTo fonksiyonu, işlem yapılan tarih ile
parametre olarak verilen tarihi karşılaştırır. Parametredeki tarih küçükse 1,
büyükse -1 veya eşitse 0 döndürür.
DateTime d = #03/23/2002#;
MessageBox.Show (d.CompareTo(Now).ToString());
•
DaysInMonth
İlk parametrede verilen yılın, ikinci parametrede verilen ayında kaç gün
olduğunu döndürür.
DateTime.DaysInMonth(2002, 2)
// Sonuç: 28
•
IsLeapYear
Verilen bir yılın artık yıl olup olmadığını hesaplar. Dönüş değeri True ya da
False tipindedir.
DateTime.IsLeapYear(1200))
// Sonuç: True
20
KISIM I:
•
Parse
Parametrede verilen String bir ifadeden Date veri tipine çevrim işlemini
yapar. String ifadesinde verilen ifadenin doğru bir tarih ve zaman tipinde
olması gerekir.
DateTime.Parse("23.04.2005 20:20:00")
DateTime.Parse("22 July 2005 02:00 PM")
DateTime.Parse("18 Haziran 1980")
İngilizceden farklı bir dilde girilen ay isimlerinin tarih tipine çevrilmesi
için, uygulamanın kültürü o dilde ayarlanması gerekir.
// Uygulama kültürü Fransızca yapılır.
FR");
Application.CurrentCulture = New Globalization.CultureInfo("fr// temps değişkeninin değeri 23/05/2005 olacaktır.
DateTime temps = DateTime.Parse("23 Mai 2005");
// Bu kod hata verecektir.
DateTime zaman = DateTime.Parse("23 Mayıs 2005");
• ToLongDateString & ToLongTimeString
Verilen tarihi uzun tarih ve zaman formatında gösteren fonksiyonlardır.
DateTime d = #1/29/2005 12:59:22 PM#;
d.ToLongDateString()
// Sonuç: 29 Ocak 2005 Cumartesi
d.ToLongTimeString()
// Sonuç: 12:59:22
• ToShortDateString & ToShortTimeString
Verilen tarihi kısa tarih ve zaman formatında gösteren fonksiyonlardır.
DateTime d = #1/29/2005 12:59:22 PM#;
d.ToShortateString()
// Sonuç: 29 Ocak 2005
d.ToShortTimeString()
// Sonuç: 12:59
21
BÖLÜM 1
Konu 6: Offline ve Online Yardımın Etkin
Kullanımı
Visual C#.NET dilinde uygulama geliştirirken .NET Framework içinde tanımlı
bir çok nesnenin fonksiyon ve yordamları kullanılır. Ancak her yordam ve
fonksiyonun aldığı parametreleri ve ne işe yaradıklarının ezbere bilinmesi
mümkün değildir.
Modül 3 Help Kullanımı bölümünde MSDN offline yardımının kullanılmasından
ve öneminden bahsedilmişti. MSDN kütüphanelerinin Visual Studio içine
kurulmaması durumunda online yardım araçları kullanılabilir. Visual Studio,
başlangıç sayfasının Online Resources sekmesinde birçok arama kolaylığı
sunar.
Offline Yardım
Offline Yardım
ƒ IntelliSense
ƒ Index, Search, Contens, Dynamic Help
ƒ Uygulama: String.Format fonksiyonunun
araştırılması
Uygulama geliştirirken, kodların yazılmasında IntelliSense aracından büyük
ölçüde faydalanır. IntelliSense, bir kodun yazılması sırasında açıldığı
zaman, yazılan kodlarla başlayan tüm metot, özellik ve nesneleri programcıya
sunar. O anda üzerinde bulunan öğenin açıklaması, aldığı parametreler gibi
bilgileri de gösterir.
22
KISIM I:
Visual Studio içinde MSDN kütüphanelerinde istenen konuların aranması için
Index, Search, Contents ve Dynamic Help panelleri kullanılır. Sonuç
bulunduğu zaman yeni bir çalışma sayfasında gösterilir. Bu sayfada aranan
kavram ile ilgili detaylı bilgiler ve örnekler mevcuttur.
Örnek: String veri tiplerinin yazdırılmasını değişik formatlarda yazdırılması
String.Format fonksiyonu ile kullanılır.
1. Visual Studio ortamında bir proje açın ve kod sayfasında
String.Format yazın. Fonksiyonu yazdıktan sonra parantezi açın ve
IntelliSense aracının çıkardığı menüyü inceleyin.
Fonksiyon kaç parametre alabiliyor?
Aşağı ve yukarı oklarla menü içinde ilerleyerek fonksiyonun aşırı
yüklenmiş durumlarını inceleyin.
Fonksiyonun kaç tane aşırı yüklemesi yazılmış?
2. Format yazısının üstüne geldikten sonra F1 tuşuna basın ve dinamik
yardımın açtığı sayfaya bakın. Bu sayfa fonksiyonun tüm aşırı
yüklemelerini gösterir.
3. Parametre olarak String ve params Object alan fonksiyona tıklayın.
Çıkan sayfa fonksiyonun detaylarını listeler.
•
İlk olarak fonksiyonun söz dizimi verilmiştir. Burada
parametre isimleri ve tipleri üzerinde bağlantılar görünür. Bu
bağlantılar ile ilgili yardım dosyası açılır.
•
Parameters bölümünde bu fonksiyonun aldığı parametrelerin
tipleri ve kullanım amaçlarını gösterilir.
•
Return Value fonksiyonun dönüş değerinin hangi tipte
olduğu ve nasıl oluştuğu gösterilir.
•
Exceptions bölümünde bu fonksiyon kullanılırken meydana
gelebilecek hatalar listelenir.
•
•
bölümü,
fonksiyonun
kullanım
yerleri,
parametrelerin nasıl kullanılacağı, parametreler kullanılırken
dikkat edilmesi gereken yerler, bağlantılı konular gibi
fonksiyon hakkında detaylı bilgi verir.
Remarks
Example
bölümünde, fonksiyonun kullanımına örnekler
verilir.
•
Requirements bölümünde, fonksiyonun çalışabilmesi için
gereken araçlar ve platformlar listelenir.
23
BÖLÜM 1
•
See Also bölümü, fonksiyon ile ilişkili kavramlara bağlantılar
sunar.
Remark bölümündeki tanımlamalardan ve Examples bölümündeki örneklerde
fonksiyonun nasıl kullanıldığını inceleyin.
4. Kod sayfanıza geçin ve String.Format fonksiyona bir örnek yazın.
int ocak = 1000;
int subat = 1100;
MessageBox.Show(String.Format("Ocak ayı maaşı {0:C} -- Şubat
ayı maaşı: {1:c}", ocak, subat));
5. Formatlama işlemleri hakkında daha fazla bilgi almak için,
fonksiyonun yardım sayfasına gelin ve Remarks bölümünde
Formatting Types bağlantısına tıklayın. Ya da Index panelinden
Formatting Types yazın ve yardım sayfasını açın.
Çıkan sayfada her veri tipi için kullanılan formatlama seçenekleri vardır.
Numeric Format Strings bağlantısına tıkladıktan sonra açılan sayfada
NumberFormatInfo bağlantısına tıklayın.
Format Character tablosunda değişik formatlama seçeneklerini inceleyin
ve kodunuzda deneyin.
6. Web araç çubuğundan geri tuşuna basarak veya Alt – Sol Ok kısa
yolu ile String.Format Method başlıklı ilk açtığınız sayfaya dönün.
7. Parametre olarak IFormatProvider, String ve params Object
alan fonksiyon tanımına tıklayın. Fonksiyonun kullanımını inceledikten
sonra, bu kullanıma bir örnek yazın.
MessageBox.Show (String.Format(New
Globalization.CultureInfo("it-IT"), "Bugün: {0:dddd MM
yyyy}", DateTime.Now));
8. Bu örnekte uygulamanın kültür ayarları değiştirilmeden, tarihin istenen
kültür ayarı ile gösterilmiştir. Kültür ayarlarının tanımlanmasını
incelemek için Index yardım panelinde CultureInfo yazın ve about
CultureInfo Class indeksini seçin. Çıkan Index Result
penceresinde CultureInfo Class indeksini seçin.
9. Bu sayfada çıkan kültür isimlerini örneğinizde kullanarak değişik
sonuçları inceleyin.
NOT: Türkçe dil ailesi için Globalization.CultureInfo("TR-tr")
kullanılır
24
KISIM I:
Online Yardım
Online Yardım
ƒ Online MSDN Kütüphaneleri
ƒ Start Page Online Resources
ƒ Uygulama: Undo yordamının araştırılması
MSDN kütüphanelerinde offline olarak yardım almak hızlı ve etkili bir
yöntemdir. Ancak bu yardım dosyalarının güncellenmesi için MSDN
sürümünün yenilenmesi gerekir. Online yardım MSDN kütüphanelerinin
internet ortamında yayınlanmasıdır. Yeni örnekler, makaleler ve düzeltmelerle
güncellenen bu yardım dosyalarına http://msdn.microsoft.com adresinden
ulaşılabileceği gibi, Visual Studio ortamından da bu dosyalar içinde arama
yapılabilir.
Örnek: Windows uygulamasında kullanılan bir metin kutusunda “Geri Al”
(Undo) işlemi yapılmak isteniyor fakat fazladan kod yazılmak istenmiyor. Bunun
için .NET Framework çatısında hazır bir metodun olup olmadığı kontrol
edilmesi gerekir. Online yardım ile gerekli arama yapıldıktan sonra çıkan
sonuçlar yorumlanır.
1. Başlangıç sayfasını (Start Page) açın ve Online Resources sekmesine
gelin.
2. Sol paneldeki menüden Search Online menüsüne gelin ve Search For
altındaki metin kutusuna “TextBox Undo” yazın. Sonuçların MSDN Online
içinde hangi duruma göre filtrelenebildiğini gösteren bağlantılar çıkar.
Sonuçlar
•
Tüm MSDN içinde,
•
MSDN kod ve karşıdan yüklemelerde,
•
MSDN teknik makalelerinde,
•
Microsoft bilgi veri kaynağında,
25
BÖLÜM 1
3.
4.
5.
6.
• Microsoft.com genelinde filtrelenebilir.
Search results for All of MSDN bağlantısına tıklayın ve çıkan sonuçları
inceleyin. Aranan kaynak .NET Framework içinde kullanılabilmesi istendiği
için TextBoxBase.Undo Method (.NET Framework) yardım konusuna
tıklayın.
MSDN Online kütüphanelerinin sayfa düzeni, içeriği offline yardım ile
aynıdır. TextBoxBase taban sınıfının Undo metodunu inceleyen bu yardım
sayfasında, metot tanımlaması, Remarks, Examples, Requirements ve
See Also bölümleri görülür. Examples bölümünde Visual C# kodlarının
altında Undo metodunun kullanımını inceleyin.
Undo yapıldıktan sonra silinen kelimelerin bir listede tutulması ve listeye
ekleme işleminin kolay bir şekilde yapılması isteniyor. Bunun için Sol
panelde bulunan menülerin üstündeki Search For metin kutusuna
“ArrayList” yazın ve çıkan sonuçlarda ilk bağlantıya tıklayın.
ArrayList sınıfının Count, Item özelliklerini ve Add metodunu inceleyin.
Ve uygulamanızı tamamlamak için bu özellikleri kodunuzda kullanın.
ArrayList silinenler = New ArrayList;
Void GeriAl()
{
// Metin kutusunda geri alınacak bir veri varsa
if (TextBox1.CanUndo)
{
// Eski değerler listeye eklenir.
silinenler.Add(TextBox1.Text);
TextBox1.Undo();
GeriAlinanKelimeler();
}
}
// Listeleme işlemini yapan yordam
void GeriAlinanKelimeler()
{
ListBox1.Items.Clear();
for (int i = 0; i < silinenler.Count; i++)
{
// i indisli Item, liste kutusuna eklenir.
ListBox1.Items.Add(silinenler.Item(i));
}
}
Lab 1: Kelime Oyunu
Bu uygulamadaki oyun, girilen bir kelimenin son harfleriyle başlayan başka bir
kelimenin girilmesidir. Oyunun seviyesi, girilecek kelimenin kontrol edilecek
harf sayısıdır. Örneğin ikinci seviyede, ilk girilen kelime “Masa” ise, bir sonraki
kelime “sa” ile başlamalıdır. Üçüncü seviyede bu kelime “asa” ile başlamalıdır.
Kullanıcı, oyuna ilk seviyeden başlar ve beş kelime bildiği zaman bir sonraki
seviyeye geçer. Toplam alınan puan, bilinen kelime sayısının seviye kadar
kuvveti alınarak hesaplanır.
26
KISIM I:
Projenin Açılması
1. KelimeOyunu isminde bir Window projesi açın ve forma listedeki kontrolleri
ekleyin.
•
btnBasla ve btnGiris isminde iki Button
•
txtKelime isminde bir TextBox
•
lblMesaj isminde bir Label
• tmrSure isminde bir Timer
2. Projenizin kod sayfasına geçin ve uygulama boyunca kullanılacak global
değişkenleri tanımlayın.
// Kontrol edilecek kelime
public string kelime;
// Oyunun seviyesi
public byte OyunSeviyesi = 1;
// Timer kontrolünde kullanılacak süre
public int kalanSure = 5;
// Bilinen kelime sayısı
public int tekrar = 0;
3. Uygulamaya giriş Sub Main yordamından yapılır. Bu yordamda
kullanıcıdan, formun başlığında görüntülenecek bir kullanıcı adı istenir.
Eğer kullanıcı adı boş girilirse form yüklenmeden uygulamadan çıkılır.
// Uygulamanın giriş noktası
public static void Main() {
string KullaniciAdi = null;
KullaniciAdi =
Microsoft.VisualBasic.Interaction.InputBox( "Kullanıcı Adı
girin:", "", "", -1, -1 );
if ( KullaniciAdi == "" ) {
return;
}
Form1 oyun = new Form1();
oyun.Text = KullaniciAdi + " yaryor";
oyun.ShowDialog();
}
Yardımcı Yordam ve Fonksiyonlar
Uygulamanın tamamında kullanılacak kodlar yordam ve fonksiyonlar halinde
yazılarak hem yönetilmesi hem de kullanılabilirliği artırılır. Uygulamada
kullanılacak yordam ve fonksiyonlar tabloda listelenmiştir.
İsim
Parametreler
Temizle
İşlev
Zamanı
TextBox
sıfırlar
ve
kontrolüne
Focus verir
OyunuBaslat
OyunuBitir
Başlangıç
kelimesi
alınarak Timer başlatılır.
String neden
Süreyi durdurur, puanı
27
BÖLÜM 1
ve
bitiş
nedeni
kullanıcıya gösterir.
Bilgi
String mesaj
kontrolünde
mesaj görüntülenir.
Label
SonrakiKelimeBilgi
Girilecek
kelimenin
hangi
harflerle
başlayacağını gösterir.
SeviyeAtla
Byte seviye
Oyunun
artırır.
Kontrol
String kelime1, String
İkinci kelimenin, ilk
kelimenin
harfleriyle
başladığının
kontrolü
yapılır.
kelime2
PuanHesapla
Byte
seviye,
Short
tekrar
Tekrar değerinin, seviye
kadar üssü alınır.
1. Yordamları ve fonksiyonları yazın
•
Temizle yordamı
public void Temizle() {
kalanSure = 5;
TextBox1.Text = "";
TextBox1.Focus();
}
•
OyunuBaslat yordamı
public void OyunuBaslat() {
Temizle();
kelime = TextBox1.Text;
tmrSure.Start();
SonrakiKelimeBilgi();
}
•
OyunuBitir yordamı
public void OyunuBitir( string neden ) {
tmrSure.Stop();
Bilgi( neden );
Temizle();
int puan;
puan = PuanHesapla( OyunSeviyesi,
System.Convert.ToInt16( tekrar ) );
MessageBox.Show( "Puanınız: " + puan);
}
•
Bilgi yordamı
public void Bilgi( string kelime ) {
Label1.Text = kelime;
}
•
SonrakiKelimeBilgi yordamı
seviyesini
28
KISIM I:
public void SonrakiKelimeBilgi() {
string mesaj = null;
mesaj += Microsoft.VisualBasic.Strings.Right(
kelime, OyunSeviyesi );
mesaj += " ile başlayan bir kelime girin";
Bilgi( mesaj );
}
•
SeviyeAtla yordamı
public void SeviyeAtla( byte seviye ) {
OyunSeviyesi = seviye;
OyunuBitir( seviye + ". seviyeye geçildi" );
SonrakiKelimeBilgi();
}
•
public bool Kontrol( string kelime1, string kelime2
) {
);
Kontrol fonksiyonu
// İkinci kelimenin başında oyun seviyesi kadar
// karakter alınır.
string bas = kelime2.Substring( 0, OyunSeviyesi
// İkinci kelime, ilk kelimenin sonu ile başlıyorsa
// doğru girilmiştir. True değeri döner.
return kelime1.EndsWith( bas );
}
•
PuanHesapla yordamı
public int PuanHesapla( byte seviye, short tekrar ) {
return Math.Pow( tekrar, seviye );
}
Olayların yazılması
1. tmrSure kontrolünün Tick olayına kalan süreyi kontrol eden kodları yazın
private void tmrSure_Tick( System.Object sender,
System.EventArgs e ) {
if ( kalanSure <= 0 ) {
OyunuBitir( "Süreniz doldu" );
}
else {
kalanSure -= 1;
}
}
2. btnBasla düğmesinin Click olayına, oyunu başlatan yordamı yazın
private void btnBasla_Click( System.Object sender,
System.EventArgs e ) {
OyunuBaslat();
}
29
BÖLÜM 1
3. btnGiris düğmesinin Click olayına, girilen kelimeyi alıp kontrolleri yapan
kodu yazın. Burada dikkat edilmesi gereken nokta, tekrar sayısının seviye
ile doğru orantılı olmasıdır.
private void btnGiris_Click( System.Object sender,
System.EventArgs e ) {
string girilen = TextBox1.Text;
";
başlamyor";
if ( !( Kontrol( kelime, girilen ) ) ) {
string neden = null;
neden = "Girilen kelime, ilk kelimenin son
neden += OyunSeviyesi + " harfi ile
OyunuBitir( neden );
}
else if ( tekrar > 5 * OyunSeviyesi ) {
SeviyeAtla( System.Convert.ToByte(
OyunSeviyesi + 1 ) );
}
else {
tekrar += 1;
kelime = girilen;
SonrakiKelimeBilgi();
Temizle();
}
}
30
KISIM I:
Modül Sonu Soruları & Alıştırmalar
Özet
 Sub – Function kullanımı
 .NET Tarih, String, Matematik
fonksiyonları
 Online Offline yardımın etkin kullanımı
1. Yordam ile fonksiyon arasındaki fark nedir?
2. Main yordamı formların ve modüllerin içinde nasıl tanımlanır. Kendi Main
yordamınızı yazın.
3. Yordam ve fonksiyonlar uygulamalarda kod tekrarını nasıl önler?
4. Yordam ve fonksiyonların sınırsız parametre almasını sağlayan params
neden sonda tanımlanır?
5. Farklı kültürlerde tarih, zaman, metin değerlerini göstermek için gerekli
olan sınıflar ve fonksiyonlar nelerdir?
6. Yordam ya da fonksiyon içerisiden yordam ya da fonksiyonlar çağırılabilir
mi? Uygulamasını yazın.
7. Bir yordam ya da fonksiyon kendisini çağırabilir mi? (Recursive)
Uygulamasını yazın.
Modül 8: Veri Tipleri Üzerine İleri Bakış
Hedefler
Â
Â
Â
Â
Değer Veri Tipleri
Referans Veri Tipleri
Organizasyon yapısı
ByVal – ByRef
.NET içinde tanımlanabilen veri tipleri temel (primitive) veri tipleri ya da
kullanıcının tanımladığı veri tipleridir. Temel veri tipleri .NET içinde tanımlanmış
ve bazı önemli özellikleri olan tiplerdir. Örneğin 32 bitlik bir sayıyı temsil eden
Int32 değer tipi temel bir tiptir. Bu temel tipin üzerinde aritmetik işlemler
yapılabilir. struct olarak tanımlanan kullanıcı veri tipleri üzerinde aritmetik
işlemler yapılamaz.
Temel ve kullanıcı tanımlı veri tipleri, değer tipi ve referans tipi olarak ikiye
ayrılır. struct bir değer tipi, Class ise bir referans tipidir. Değer tipleri belleğin
stack bölgesinde, referans tipleri heap bölgesinde depolanır. Değer tiplerinin
oluşturulması ve silinmesi, sadece değerleri üzerinde işlem yapıldığı için
kolaydır. Değer tipinin ömrü bittiği zaman stack yapısından hemen kaldırılır.
Referans tiplerinin oluşturulması, yok edilmesi ekstra bir performans gerektirir.
Ancak iki veri tipinin de birbirlerine göre avantajları vardır.
Bu modül tamamlandıktan sonra:
•
Temel ve kullanıcı tanımlı değer tiplerini tanıyacak,
•
Temel ve kullanıcı tanımlı referans tiplerini tanıyacak,
•
Veri tiplerinin belleği kullanımı öğrenecek,
•
ref kavramını öğrenecek,
•
Referans ve değer tiplerinin nerede kullanılacağını öğreneceksiniz.
2
Modül 1: Programlamaya Giriş
Konu 1: Değer Tipleri
Değer Tipleri
ƒ Built-In Değer Tipleri
ƒ .NET içinde tanımlı veri tipleridir.
// Visual C# tanımı değer tipi
short sayi = 10;
// .NET Framework tanımı değer tipi
Int16 sayi2 = 10;
ƒ User-Defined Değer Tipleri
ƒ Structure yapısı ile oluşturulan kullanıcı
tanımlı veri tipleridir.
public struct Ucgen {
public int kenar1;
public int kenar2;
public int kenar3;
public Ucgen( int kenar_1,
this.kenar1
this.kenar2
this.kenar3
}
}
int kenar_2, int kenar_3 ) {
= kenar_1;
= kenar_2;
= kenar_3;
Değer tipindeki değişkenlerin tuttukları değerler bellekte stack yapısında
bulunur. Bir değer tipindeki değişkenin, başka bir değişkene atanması, değerin
olduğu gibi kopyalanması ile gerçekleşir. Dolayısıyla ne zaman bir atama
işlemi yapılsa, değer tipinin bir kopyası bellekte oluşturulur. Bu durum çok
karmaşık değerler ve büyük veri blokları için performansı düşürür. Ancak değer
tipleri, tanımlı olduğu yerden çıkıldığında bellekten hemen silinir.
Built-In Değer Tipleri
Built-In değer tipleri olarak bahsedilecek temel tipler, .NET içinde tanımlı olan
veri tipleridir. Bu değer tipleri sayıları, ondalık sayıları, bool değerlerini, tarih
zaman değerlerini, karakterleri temsil eden yapılardır. Bu tipler, tüm .NET dilleri
tarafından kullanılabilir şekilde tanımlanır. Ancak Visual C# dilinde bu değer
tiplerine belirli isimler ile ulaşılır.
Visual C#
.NET Framework
Değer
bool
Byte
System.Boolean
System.Byte
True / False
Char
System.Char
16 bit uzunluğunda
Unicode karakter
Decimal
System.Decimal
128 bit
sayı
8 bit uzunluğunda sayı
uzunluğunda
3
Konu: 1
Double
System.Double
64 bit uzunluğunda
kayan tipte sayı
int
System.Int32
32 bit uzunluğunda sayı
Long
System.Int64
64 bit uzunluğunda sayı
Short
System.Int16
16 bit uzunluğunda sayı
float
System.Single
32 bit uzunluğunda
kayan tipte sayı
// Visual C# tanımı değer tipi
short sayi = 10;
// .NET Framework tanımı değer tipi
Int16 sayi2 = 10;
Kullanıcı Tanımlı Değer Tipleri
Uygulamalarda çoğu zaman Built-in değer tiplerinin sağlamadığı özel veri
tiplerine ihtiyaç duyulur. Örneğin bir üçgen tipi, kenarları temsil eden üç tane
sayı tutan bir değer tipi olarak oluşturulabilir.
Kullanıcı tanımlı değer tipleri Visual C# .NET dilinde struct ile oluşturulur.
public struct Ucgen {
public int kenar1;
public int kenar2;
public int kenar3;
kenar_3 ) {
public Ucgen( int kenar_1, int kenar_2, int
this.kenar1 = kenar_1;
this.kenar2 = kenar_2;
this.kenar3 = kenar_3;
}
•
}
struct tiplerinde en az bir veri tipi tanımlı olması gerekir.
•
struct tiplerinde boş parametreli constructor tanımlanamaz. Değer
tipleri tanımlandıklarında bu constructor ile oluşturulur. Ancak bir veya
daha fazla parametre alan constructor metotları kullanılabilir.
•
struct veri tipleri Class yapısına benzer, ancak değer tipi oldukları
için oluşturulması yok edilmesi daha kolaydır.
4
Modül 1: Programlamaya Giriş
Konu 2: Referans Tipleri
Referans Tipleri
ƒ Built-In Referans Tipleri
ƒ Object, Built-In referans tipidir.
ƒ Array, dizilerin Built-In referans tipinde
olmasını sağlar.
ƒ User-Defined Referans Tipleri
ƒ Class yapısı ile oluşturulan kullanıcı tanımlı
referans tipleridir.
// Kullanıcı tanımlı referans tipi
public class Class1 {
public int Deger;
}
Referans tipindeki değerlere erişimler, bu değerlerin bellekte oluşturulduğu
yerin adresi ile sağlanır. Bu değerler bellekteki heap bölgesinde oluşturulur.
Referans tipindeki değişkenlerin, başka değişkenlere atama işlemleri bellekteki
adreslerin kopyalanması ile gerçekleşir. Dolayısıyla aynı adresteki veriyi
gösterir. Bu iki değişkenden herhangi biri değiştiğinde, diğeri de değişmiş
olacaktır.
Sınıf ve dizi yapıları referans tipleridir. Dizilerin tuttukları değerlerin sayısı çoğu
zaman önceden bellidir ama boyutları ve uzunlukları değişebilir. Dolayısıyla dizi
değişkenlerinin ismi, elemanlarının bellekte tutuldukları ilk yerin adresini temsil
eder. Ancak dizilerin tuttukları değerler referans tipinde olmayabilir.
Built-in Referans Tipleri
.NET içinde tanımlı olan class, array yapıları Object sınıfında türemiştir.
Object sınıfı .NET içinde tanımlı Built-in referans tipidir. Değişkenler
tanımlandıkları sırada tipleri belirtilmezse Object tipinde oluşturulur.
Kullanıcı tarafından oluşturulan diziler, bir Array sınıfından türetilir. Bu sınıf,
diziler üzerinde işlemleri kolaylaştıracak birçok özellik ve metot tanımlar.
Örneğin Length özelliği dizinin toplam eleman sayısını verir, Sort metodu ise
dizideki elemanların sıralanması işlemini yapar. Dolayısıyla Array sınıfı, diziler
için Built-in referans tipi sağlar.
5
Konu: 1
// Parametre olarak verilen dizinin başlangıç adresidir.
// Dolayısıyla, bu adres bölgesinde tanımlı
// değerlere ulaşılabilir.
public void Goruntule( int[] dizi ) {
for ( i=0; i<=dizi.Length - 1; i++ ) {
Label1.Text += dizi[ i ];
}
}
Kullanıcı Tanımlı Referans Tipleri
.NET içinde tanımlı sınıflar kullanılabildiği gibi, birçok nesneyse yönelik
programlama dilinde kullanıcılar da kendi sınıflarını oluşturabilirler. .NET
Framework çatısında, kullanıcıların oluşturduğu bu sınıflar Object sınıfından
türer. Dolayısıyla bu sınıflar kullanıcı tanımlı referans tipleridir.
// Kullanıcı tanımlı referans tipi
public class Class1 {
public int Deger;
}
public void Test1() {
Class1 sinif = new Class1();
sinif.Deger = 10;
Class1 sinif2 = null;
// Sinif değişkeninin tuttuğu adres bilgisi
// diğer değişkene aktarılır. Dolayısıyla Sinif2
// değişkeni de bellekte aynı yeri temsil eder.
sinif2 = sinif;
// Sinif değişkenin tuttuğu adres bölgesindeki
// değer değiştirilir.
sinif.Deger = 15;
// Sinif2 değişkeni de aynı adresi gösterdiği için
// sonuç 15 olur.
MessageBox.Show(sinif2.Deger.ToString());
End Sub
6
Modül 1: Programlamaya Giriş
Konu 3: Organizasyon Yapısını İnceleme
struct Organizasyon Yapısı Ve Belleğin
İncelenmesi
Structure Organizasyon Yapısı
ƒ Tanımlandıkları anda Stack bölümünde
oluşturulur.
ƒ Parametre geçilen tipler kopyalanır.
Stack
public void Test() {
Ogrenci Ali = new Ogrenci();
Ogrenci Veli = new Ogrenci( "Veli", "Mehmet" );
Goruntule(Veli);
}
public void Goruntule( Ogrenci ogr ) {
MessageBox.Show (ogr.adi + " " + ogr.soyadi);
}
ogr
Veli
Ali
struct veri tipi, değer tipi olduğu için, tanımlandıkları anda bellekte stack
bölümünde oluşturulur. Bellekte ayrılan yer struct içinde tanımlı olan Built-in
veri tiplerinin toplam boyutu kadardır.
Visual C# .NET dilinde struct veri tipleri New anahtar kelimesiyle de
oluşturulabilir. Ancak bu constructor metotları parametre alacak şekilde
tanımlanmalıdır. Varsayılan parametresiz constructor metotları CLR tarafından
işlenir. Dikkat edilmesi gereken bir durum da, New ile oluşturulan değişkenler
yine bir değer tipidir ve stack alanında tutulur.
NOT:
Classlardan nesne oluştururken New anahtar kelimesi kullanılır ancak bu nesneler
heap alanında tutulur.
public struct Ogrenci {
public string adi;
public string soyadi;
public Ogrenci( string isim, string soyisim ) {
this.adi = isim;
this.soyadi = soyisim;
}
7
Konu: 1
}
public void Test2() {
// 1 - Öğrenci değeri tanımlandığı sırada
// stack alanında yer ayrılır
Ogrenci Ali = new Ogrenci();
// 2 - New ile tanımlanan değişkenler de stack
// alanında oluşturulur.
// Farkı, bu değişkenin başlangıç değeri almasıdır.
Ogrenci Veli = new Ogrenci( "Veli", "Mehmet" );
// 3 - Parametre olarak sipariş nesnesinin
// adresi verilir
Goruntule(Veli);
End Sub
public void Goruntule( Ogrenci ogr ) {
MessageBox.Show (ogr.adi + " " + ogr.soyadi);
}
1. Ali değişkeni tanımlanırken Stack yapısı
Değişken Ali.soyadi
Değer = “”
Değişken Ali.adi
Değer = “”
Ali Ogrenci
2. Veli değişkeni tanımlanırken Stack yapısı
Değişken Veli.soyadi
Değer = “Mehmet”
Değişken Veli.adi
Değer = “Veli”
Veli Ogrenci
Değişken Ali.soyadi
Değer = “”
Değişken Ali.adi
Değer = “”
Ali Ogrenci
8
Modül 1: Programlamaya Giriş
Bu değişkenler oluşturulduktan sonra, bir yordama parametre olarak
verildiklerinde, tüm değerleri kopyalanır. Değer tipindeki değişkenler atama
işlemlerinde, oldukları gibi kopyalanır.
3. Goruntule yordamı çağrıldığı zaman Stack yapısı
Degisken ogr.soyadi
Değer = “Mehmet”
Değişken ogr.adi
Değer = “Veli”
ogr Ogrenci
Değişken Veli.soyadi
Değer = “Mehmet”
Değişken Veli.adi
Değer = “Veli”
Veli Ogrenci
Değişken Ali.soyadi
Değer = “”
Değişken Ali.adi
Değer = “”
Ali Ogrenci
Test isimli yordamdan çıkılınca, bu değişkenler oluşturuldukları sırayla stack
yapısından kaldırılır.
9
Konu: 1
Class Organizasyon Yapısı Ve Belleğin
İncelenmesi
Class Organizasyon Yapısı
ƒ Tanımlandıkları anda Stack bölümünde
oluşturulur.
ƒ Parametre geçilen tipler kopyalanır.
public void Test() {
Siparis ilkSiparis = null;
ilkSiparis = new Siparis(
DateAndTime.Now, "Enis Günesen", "Visual
Studio.NET 2003" );
ilkSiparis = new Siparis(
DateAndTime.Now.AddYears( -1 ), "Enis
Günesen", "Visual Studio.NET 2002" );
Siparis ikinciSiparis = new Siparis();
ilkSiparis = ikinciSiparis;
ilkSiparis.Urun = "BilgeAdam Yazılım
Uzmanlığı";
Goruntule( ikinciSiparis );
}
public void Goruntule( Siparis
parametreSiparis ) {
MessageBox.Show (parametreSiparis.Urun);
}
Heap
Stack
Siparis
parametreSiparis
Siparis
ikinciSiparis
Siparis
ilkSiparis
Classlardan (Sınıf) nesneler oluşturuldukları zaman bu nesnelerin değerleri
heap bölgesinde tutulur. Ancak bu nesneleri gösteren bir adres tutucusu
oluşturulur ve bu adresin değeri de stack alanında depolanır.
public class Siparis {
public DateTime Tarih;
public string AliciIsmi;
public string Urun;
public Siparis() {
}
public Siparis( DateTime Tarih, string Isim,
string Urun ) {
this.Tarih = Tarih;
this.AliciIsmi = Isim;
this.Urun = Urun;
}
}
public void Test() {
// 1 - Sipariş referansı oluşturulur
Siparis ilkSiparis = null;
// 2 - Yeni bir nesne oluşturulup,adresi
10
Modül 1: Programlamaya Giriş
// bu referansa aktarılır
ilkSiparis = new Siparis( DateAndTime.Now, "Enis
Günesen", "Visual Studio.NET 2003" );
// 3 - Yeni bir nesne daha oluşturulur ve adresi
// değişkene aktarılır
ilkSiparis = new Siparis(
DateAndTime.Now.AddYears( -1 ), "Enis Günesen", "Visual
Studio.NET 2002" );
// 4 - Yeni bir referans ve nesne oluşturulur
Siparis ikinciSiparis = new Siparis();
// 5 - İki değişkenin aynı bellek alanını göstermesi
// sağlanır
ilkSiparis = ikinciSiparis;
// 6 - Bu alandaki Ürün ismi değiştirilir
ilkSiparis.Urun = "BilgeAdam Yazılım Uzmanlığı";
// 7 - Parametre olarak sipariş nesnesinin
// adresi verilir
Goruntule( ikinciSiparis );
End Sub
public void Goruntule( Siparis parametreSiparis ) {
MessageBox.Show (parametreSiparis.Urun);
}
1.
ilkSiparis tanımlanırken Stack Alanı
Değer = 0x00000000
(Bellekte boş bir alanı gösterir)
ilkSiparis
Heap Alanı
Nesne
2.
Adres Bilgisi
ilkSiparis oluşturulurken Stack Alanı
Değer = 0x00000012
ilkSiparis
Heap Alanı
11
Konu: 1
Nesne
Adres Bilgisi
Siparis
Tarih = 10.05.2005
AliciIsmi = Enis Günesen
Urun = Visual Studio.NET 2003
0x00000012
3.
ilkSiparis referansına başka bir nesne verilirken Stack Alanı
Değer = 0x00000056
(Gösterdiği adres değeri değişir)
ilkSiparis
Heap Alanı
Nesne
Adres Bilgisi
Siparis
Tarih = 10.05.2004
AliciIsmi = Enis Günesen
Urun = Visual Studio.NET 2002
0x00000056
Siparis
Tarih = 10.05.2005
AliciIsmi = Enis Günesen
Urun = Visual Studio.NET 2003
0x00000012
(Bu adres alanına artık hiçbir referans
ulaşmıyor)
4.
ikinciSiparis oluşturulurken Stack alanı
Değer = 0x00000088
ikinciSiparis
Değer = 0x00000056
ilkSiparis
Heap Alanı
Nesne
Adres Bilgisi
Siparis
Tarih =
0x00000088
12
Modül 1: Programlamaya Giriş
AliciIsmi =
Urun =
Siparis
Tarih = 10.05.2004
AliciIsmi = Enis Günesen
Urun = Visual Studio.NET 2002
0x00000056
Siparis
Tarih = 10.05.2005
AliciIsmi = Enis Günesen
Urun = Visual Studio.NET 2003
0x00000012
5.
ikinciSiparis in adres bilgisi ilkSiparis e atanırken Stack Alanı
Değer = 0x00000088
ikinciSiparis
Değer = 0x00000088
(Gösterdiği adres ikinci
referansı ile aynı olur)
sipariş
ilkSiparis
Heap Alanı
Nesne
Adres Bilgisi
Siparis
Tarih =
AliciIsmi =
Urun =
0x00000088
Siparis
Tarih = 10.05.2004
AliciIsmi = Enis Günesen
Urun = Visual Studio.NET 2002
0x00000056
(Bu nesneyi
kalmamıştır)
Siparis
Tarih = 10.05.2005
AliciIsmi = Enis Günesen
Urun = Visual Studio.NET 2003
0x00000012
6.
gösteren
referans
ilkSiparis in gösterdiği nesnenin Ürün ismi değiştirilirken Stack
Alanı
13
Konu: 1
Değer = 0x00000088
ikinciSiparis
Değer = 0x00000088
ilkSiparis
Heap Alanı
Nesne
Adres Bilgisi
Siparis
Tarih =
AliciIsmi =
Urun = BilgeAdam Yazılım Uzmanlığı
0x00000088
Siparis
Tarih = 10.05.2004
AliciIsmi = Enis Günesen
Urun = Visual Studio.NET 2002
0x00000056
(Referanslarını kaybetmiş nesneleri,
Garbage Collector bellekten siler)
Siparis
Tarih = 10.05.2005
AliciIsmi = Enis Günesen
Urun = Visual Studio.NET 2003
0x00000012
(Referanslarını kaybetmiş nesneleri,
Garbage Collector bellekten siler)
7.
ikinciSiparis in gösterdiği değer Goruntule yordamı ile gösterilirken
Stack alanı
Değer = 0x00000088
parametreSiparis
Değer = 0x00000088
ikinciSiparis
Değer = 0x00000088
ilkSiparis
Heap Alanı
14
Modül 1: Programlamaya Giriş
Nesne
Adres Bilgisi
Siparis
Tarih =
AliciIsmi =
Urun = BilgeAdam Yazılım Uzmanlığı
0x00000088
Sonuç olarak gösterilen değer, heap alanında 0x00000088 adres numaralı
nesnenin ürün ismi olur. Parametre olarak verilen nesneler heap alanında
tekrar oluşturulmazlar. Referans olarak geçen değişkenler aslında değer
tipleridir. Ancak nesnenin tümü değil sadece adres değerinin kopyası
oluşturulur.
ByVal ve ByRef İncelemesi
ByVal – ByRef
ƒ ByVal
ƒ Parametreye, değişkenin değeri geçer.
public void ElemanDegistir( int[] dizi, int index, int
yeniDeger ) {
dizi[ index ] = yeniDeger;
}
ƒ ByRef
ƒ Parametreye, değişkenin adresi (referansı)
geçer.
public void Ekle( ref string Kelime, string eklenecek ) {
Kelime = Kelime.Insert( 0, eklenecek );
}
Fonksiyon ve yordamlara parametre verilirken varsayılan olarak, değişkenlerin
değerleri verilir. Parametre olarak verilen değişkenler üzerinde değişiklik
yapılması için bu parametrelerin bulunduğu adres bilgilerine ihtiyaç vardır.
Referans tipindeki değerler parametre olarak geçildiklerinde, referansları verilir.
Ancak değer tipleri parametre olarak verildiklerinde bu değerler kopyalanır ve
asıl değişkenin tuttuğu değere ulaşılamaz. Bu karışıklıkları çözmek için,
yordamlarda parametreler ref olarak belirtilir.
15
Konu: 1
Normal parametre olarak verilecek değişkenin değeri ile işlem yapılacağını
belirtir. Dolayısıyla bu parametrenin değeri değiştirilemez.
{
// Değişecek olan kelime normal verilmiştir
public void Ekle( string Kelime, string eklenecek )
Kelime = Kelime.Insert( 0, eklenecek );
}
private void Button1_Click1( System.Object sender,
System.EventArgs e ) {
string mesaj = "Hello";
Ekle( mesaj, " World" );
MessageBox.Show (mesaj);
}
mesaj değişkenin değeri, yordama değer olarak verilmiştir. Dolayısıyla
yordamın üzerinde çalıştığı değer, mesajın bir kopyasıdır. Bellek alanında
fiziksel olarak farklı yerlerde dururular. Yani değişiklik yapılan değer, sadece bir
kopyadır. Yordam sonlandığında kopya olarak oluşturulan değer silinecek ve
asıl değer değişmemiş olarak kalacaktır. Bu durumda parametre olarak mesaj
değişkeninin adresi verilmelidir. Dolayısıyla yordamdaki parametrenin ref
olarak tanımlanması gerekir.
public void Ekle2( ref string Kelime,
eklenecek ) {
Kelime = Kelime.Insert( 0, eklenecek );
}
string
Parametre olarak referans tipinde bir değişken verilirse bir fark olmaz.
Referans tipleri, nesnelerin bulunduğu heap alanlarının adresini tutar.
Dolayısıyla normal tanımlanan parametreye referans tipinin değeri (adres
bilgisi) kopyalanır. Bu kopya üzerinden aynı adres alanında değişiklik yapılır.
// Parametre ByVal ile tanımlı olsa dahi, değiştirir
// dizinin belirtilen indexteki değeri,
// adres olarak erişilir.
public void ElemanDegistir( int[] dizi, int index,
int yeniDeger ) {
dizi[ index ] = yeniDeger;
}
private void Button1_Click( System.Object sender,
System.EventArgs e ) {
int[] sayilar = new int[ 3 ];
sayilar[ 0 ] = 111;
sayilar[ 1 ] = 222;
sayilar[ 2 ] = 333;
ElemanDegistir( sayilar, 1, 1000000 );
MessageBox.Show( sayilar[ 1 ] );
// Sonuç = 1000000
16
Modül 1: Programlamaya Giriş
}
Modül Sonu Soruları & Alıştırmalar
Özet
Â
Â
Â
Â
Değer Veri Tipleri
Referans Veri Tipleri
Organizasyon yapısı
ByVal – ByRef
1. Değer değişkenleri ve referans değişkenleri arasındaki farkı açıklayınız.
Her iki değişken tipinin de yer aldığı parametreleri içeren bir yordam yazın.
Değişkenlerin verilerinin değişip değişmediğinin gözlemleyin.
2. struct yapısını açıklayınız. Kompleks bir veri tipi stucture yapısında
kodlayın. Yazılan veri tipinin uzunluğunu hesaplayın.
Modül 9: Windows Programlama
Hedefler
 Listeleme Kontrolleri
 ListBox, TreeView, ComboBox
 Resim Kontrolleri
 PictureBox, ImageList
 Düzenleme Kontrolleri
 TabControl, Panel, HScrollBar, VScrollBar
 Zaman ve Tarih Kontrolleri
 DateTimePicker, MonthCalendar
 Dinamik Kontroller
 Çalışma anında eklenen kontroller
Visual C#.NET ile Windows Tabanlı Programlama modülünde, Windows
Formlarına ve kontrollerine giriş yapılmıştı. .NET çatısında, Windows
uygulamalarının görünüm ve kullanım zenginliğini artırmak için birçok kontrol
vardır. Visual Studio ile varsayılan olarak gelen kontrollerin dışında birçok
kontrol de Windows uygulamalarına eklenebilir.
Bu modül tamamlandıktan sonra:
•
ListBox, TreeView, ComboBox gibi listeleme kontrollerini tanıyacak,
•
PictureBox, ImageList gibi resim kontrollerini tanıyacak,
•
TabControl, Panel, HScrollBar, VScrollBar gibi düzenleme
kontrollerini tanıyacak,
•
DateTimePicker, MonthCalendar gibi zaman ve tarih kontrollerini
tanıyacak
•
Çalışma anında forma yeni kontroller oluşturup ekleyebileceksiniz.
2
Modül 9: Windows Programlama
Konu 1: Formlar ve Windows Forms
Kontrolleri
Form Nesnesi
Formlar
ƒ Kullanıcı ile iletişimi sağlar
ƒ Show ve ShowDialog ile birden fazla
form açılır.
ƒ Başlangıç formu projenin özelliklerinden
ayarlanır.
Windows uygulamaları, kullanıcı ile iletişimi Form nesneleri ile sağlar. Formlar,
görünüm özellikleri, pencere stili değiştirilerek ve üzerine kontroller eklenerek
özelleştirilir. Ayrıca birden çok form nesnesi kullanılarak, uygulamalar
zenginleştirilir.
Birden Fazla Form Oluşturmak
Windows uygulamaları birden fazla form nesnesinden oluştuğu için, projelere
form eklemek her zaman gereklidir. Bir Windows projesine yeni bir form
eklemek için:
1. Solution Explorer panelinden projeye sağ tıklayarak ya da Project
menüsünden Add Windows Form komutunu seçilir.
2. Çıkan menüden Windows Form öğesinin seçili olduğuna kontrol edilir ve
bir isim verilerek form eklenir.
Başlangıç formlarının ayarlanmasının yanı sıra, uygulamada bir formdan
başka bir formun açılması ve ayarlanması sık karşılaşılan bir durumdur. Form
nesneleri, System.Windows.Forms namespace içinde bulunan Form
3
Konu: 1
sınıfından türemiş sınıflardır. Dolayısıyla yeni bir Form oluşturmak için, istenen
Form sınıfından bir nesne oluşturulması yeterlidir.
frmYeni yeniForm = New frmYeni;
Yeni oluşturulan formların gösterilmesi, formun Show ve ShowDialog metotları
ile yapılır. ShowDialog metodu, form gösterildikten sonra, kapanana kadar
diğer formlara erişimi engeller. ShowDialog metodundan sonra yazılan kodlar,
form kapandıktan sonra çalıştırılır.
frmYeni yeniForm = New frmYeni;
yeniForm.ShowDialog();
// Bu kodlar yeniForm kapandıktan sonra çalıştırılır
MessageBox.Show(“Form kapandı...”) ;
ShowDialog ile gösterilen formlar, hangi durum ile kapandıklarını belirten bir
DialogResult sonucu döndürürler. Bu kullanım MessageBox.Show hazır
fonksiyonu ile aynıdır.
frmSatis frm = New frmSatis;
if (frm.ShowDialog == DialogResult.Yes)
{
// Verileri kaydet
}
Formun hangi diyalog sonucu ile döneceğini, üzerindeki Button kontrollerinin
DialogResult özelliği ile belirlenir. Eğer düğmenin bu özelliği Yes olarak
ayarlanmışsa,
Form
bu
düğmeye
basılıp
kapandığı
zaman,
DialogResult.Yes değerini döndürür.
Örneğin bir Windows uygulamasının, kullanıcının girdiği verilere göre değişik
formların açması için Main yordamından faydalanılır.. Bu yordamda,
kullanıcının istediği form dinamik olarak yüklenir.
public void Main1() {
string grup = null, parola = null;
grup = Interaction.InputBox( "Kullanıcı grubu:",
"", "", -1, -1 );
parola = Interaction.InputBox( grup + " grubuna
giriş için parola girin:", "", "", -1, -1 );
//
//
//
//
) {
Grupların parolası kontrol edilir
ve ilgili grubun formu açılır.
Eğer parola veya grup ismi yanlış girilirse
hata formu yüklenir.
switch ( grup.ToUpper() ) {
case "SATIŞ":
if ( parola.ToUpper() != "SATIS_PAROLA"
parolası yanlış!" );
HataFormuYukle( "Satış departmanı
}
else {
4
Modül 9: Windows Programlama
frmSatis satisDepartmani = new
frmSatis();
satisDepartmani.ShowDialog();
}
break;
case "YÖNETİM":
if ( parola.ToUpper() !=
"YONETIM_PAROLA" ) {
HataFormuYukle( "Yönetim departmanı
parolası yanlış!" );
}
else {
frmYonetim yonetimDepartmani = new
frmYonetim();
yonetimDepartmani.ShowDialog();
}
break;
default:
HataFormuYukle( grup + " isminde bir
grup bulunamadı" );
break;
}
}
// Hata formu, verilen parametredeki mesajı
// gösterecek şekilde ayarlanır ve yüklenir.
public void HataFormuYukle( string mesaj ) {
frmHata hataFormu = new frmHata();
hataFormu.lblHataMesaji.Text = mesaj;
hataFormu.ShowDialog();
}
Aynı Windows projesi içinde açılan formlar açılmadan önce kontrollerinin
özellikleri değiştirilebilir. Örneğin hata formu gösterilmeden önce, üzerindeki
Label kontrolünün Text özelliği ilgili hata mesajını gösterecek şekilde
ayarlanabilir.
Form Özellikleri:
Özellik
Değer Tipi
Açıklama
AcceptButton
Button
Form üzerinde Enter
tuşuna basıldığı zaman
“tıklanacak”
Button
kontrolü
CancelButton
Button
Form üzerinde Esc
tuşuna basıldığı zaman
“tıklanacak”
Button
kontrolü
Opacity
Double
Formun şeffaflık oranı (0
-1 arası)
5
Konu: 1
MaximizeBox
Boolean
Ekranı
Kapla
düğmesinin görünürlüğü
MaximizeBox
Boolean
Simge
Durumunda
Küçült
düğmesinin
görünürlüğü
ControlBox
Boolean
Close,
ve
Minimize düğmelerinin
tümünün görünürlüğü
StartPosition
FormStartPosition
Form açıldığı zaman,
ekran
üzerindeki
konumu
TopMost
Boolean
Formun
pencerelerin
gözükmesi
FormBorderStyle
FormBorderStyle
Formun kenar stili
MaximumSize
Size
Formun
alabileceği
maksimum büyüklük
MinimumSize
Size
Formun
alabileceği
minimum büyüklük
Form Olayları:
Olay
Açıklama
Click
Form üzerine tıklandığı
zaman gerçekleşir
Closing
Form
kapanmadan
hemen önce gerçekleşir
Closed
Form
kapandıktan
sonra gerçekleşir
Load
Form
yüklenirken
gerçekleşir
KeyDown
Form üzerindeyken bir
tuşun basılması ile
gerçekleşir
KeyUp
Basılan
kaldırılması
gerçekleşir
tuşun
ile
Form Metotları:
Metot
Açıklama
Hide
Formu
Visible
Maximize
tüm
üzerinde
6
Modül 9: Windows Programlama
özelliğini
yaparak, gizler
False
Close
Formu kapatır. Eğer
form
başlangıç
formuysa
uygulama
sonlanır
Show
Formu gösterir. Hide ile
gizlenmişse, Visible
özelliği True yapılır.
ShowDialog
Formu diyalog kutusu
olarak gösterir.
Örnek: Bir Windows formunun kapanmasını yönetmek için, o formun Closing
olayına ve Close metoduna ihtiyaç vardır. Kapanmasını yavaşlatmak için bir
Timer kontrolü kullanılır ve formun şeffaflığı yavaşça azaltılır.
private void Form1_Load( System.Object sender,
System.EventArgs e ) {
this.Text = "Hogeldiniz... " + DateTime.Now;
}
private void Form1_Closing( object sender,
System.ComponentModel.CancelEventArgs e ) {
// Kapanma olayı gerçekleşmeden önce iptal edilir
e.Cancel = true;
Timer1.Start();
}
private void Form1_KeyDown( object sender,
System.Windows.Forms.KeyEventArgs e ) {
// Shift-Ctrl-F3 tuşları basıldığında uygulama kapanır
if ( e.Shift & e.Control & e.KeyCode == Keys.F3
) {
this.Close();
}
}
private void Timer1_Tick( System.Object sender,
System.EventArgs e ) {
// Formun görünmez hale gelince uygulama kapanır
if ( this.Opacity == 0 ) {
Application.Exit();
}
else {
this.Opacity -= 0.1;
}
}
7
Konu: 1
Label
Label
ƒ Kullanıcıya bilgi veren etikettir.
Label kontrolü Form üzerinde kullanıcıya bilgi vermek amaçlı kullanılan
etikettir.
Label Özellikleri
Özellik
Değer Tipi
Açıklama
TextAlign
ContentAlignment
Yazının,
üzerindeki
belirler.
BorderStyle
BorderStyle
Kontrolün kenar stilidir.
FixedSingle
değeri,
kontrolün
kenar
çizgilerini
gösterir.
Fixed3D
değeri,
kenarların üç boyutlu
olmasını sağlar
Image
Drawing.Image
Etiket
üzerinde
görüntülenmek istenen
resmi tutar
ImageAlign
ContentAlignment
Etiket üzerindeki resmin
nerede
duracağını
etiket
pozisyonu
8
Modül 9: Windows Programlama
belirler
RightToLeft
RightToLeft
Etiket üzerindeki yazının
yönünü belirler. Eğer
Yes
değerini alırsa,
yazılar sağdan sola
gösterilir
Label1.BorderStyle = BorderStyle.Fixed3D;
// Visual Studio klasörü altındaki simgeler kullanılabilir
Label1.Image = Image.FromFile("C:\Program Files\ _
Microsoft Visual Studio .NET
2003\Common7\Graphics\icons\Flags\FLGTURK.ICO");
Label1.ImageAlign = ContentAlignment.MiddleRight;
Label1.RightToLeft = RightToLeft.Yes;
Label1.Text = "Türkçe";
NOT:
Resmin bulunduğu yer kontrolün sağ tarafında bulunacak şekilde ayarlanmasına
rağmen sol tarafta gözükür. Bu durum, RightToLeft özelliğinin Yes olarak atanmasından
kaynaklanır.
9
Konu: 1
TextBox
TextBox
ƒ Kullanıcıdan bilgi almak için kullanılır.
Metin kutuları, kullanıcıdan bilgi almak için kullanılır.
TextBox Özellikleri
Özellik
Değer Tipi
Açıklama
MultiLine
Boolean
Metin kutusuna birden
fazla satırda değer
girilebilmesini
sağlar.
False durumunda ise,
metin
kutusunun
yüksekliği değiştirilemez
ScrollBars
ScrollBars
Metin
kutusunda
kaydırma çubuklarının
görünmesi. Varsayılan
olarak kaydırma çubuğu
görüntülenmez, ancak
Horizontal, Vertical
kaydırma çubukları ya
da
ikisi
birden
gösterilebilir.
PasswordChar
Char
Metin kutusuna parola
girilecekse,
girilen
10
Modül 9: Windows Programlama
karakterlerin
hangi
karakter
olarak
görüneceğini belirler.
WordWrap
Boolean
Metin kutusuna girilen
değerlerin,
satır
sonlandığında bir alt
satıra geçilmesini belirtir.
Eğer MultiLine özelliği
False ise, alt satırlar
tanımlı olmayacağı için
bu özelliğin bir etkisi
görülmez.
MaxLength
Integer
Metin
kutusunun
alabileceği maksimum
karakter sayısını belirtir.
ReadOnly
Boolean
Metin
kutusunun
yazmaya karşı korumalı
olduğunu belirtir.
CharacterCasing
CharacterCasing
Metin
kutusuna
karakterler
girilirken
büyük veya küçük harfe
çevrilmesini
sağlar.
Upper değeri büyük,
Lower değeri küçük
harfe çevrimi sağlar.
TextBox Olayları
Olay
Açıklama
TextChanged
Metin kutusundaki yazı
değiştiği
zaman
gerçekleşir.
TextBox Metotları
Metot
Açıklama
Cut
Seçilen karakterleri siler
ancak hafızada tutar.
Copy
Seçilen
kopyalar
Paste
Hafızaya
karakterleri
karakterleri
alınan
metin
11
Konu: 1
kutusuna yapıştırır
Clear
Metin kutundaki yazıları
temizler
SelectAll
Metin kutusundaki tüm
yazıyı seçer
Örnek: Form üzerinde girilen değerlere göre tek sayıların hesaplanması ve
görüntülenmesi işlemi için TextBox kontrolünün birçok olayından ve
özelliğinden yararlanılır.
private void Form1_Load( System.Object sender,
System.EventArgs e ) {
// Form yüklenirken kontrollerin ayarlanması:
txtAltSayi.MaxLength = 2;
txtUstSayi.MaxLength = 4;
txtSayilar.Multiline = true;
txtSayilar.ScrollBars = ScrollBars.Vertical;
txtClipBoard.ReadOnly = true;
txtClipBoard.Multiline = true;
}
// Bu olay hem txtUstSayi hem de txtAltSayi kontrolünün
// TextChanged olayında gerçekleşir.
// Handles ifadesinden sonra kontroller virgülle ayrılmıştır
private void txtUstSayi_TextChanged( System.Object
sender, System.EventArgs e ) {
TekSayiYazdir();
}
public bool Kontrol() {
// Metin kutularına sayı girildiyse
if ( IsNumeric( txtUstSayi.Text ) & IsNumeric(
txtAltSayi.Text ) ) {
// ve alt limit 0 dan büyük, ve üst limitten küçükse
int ust = txtUstSayi.Text;
int alt = txtAltSayi.Text;
if ( ust > alt & alt > 0 ) {
// giriş doğru yapılmıştır
return true;
12
Modül 9: Windows Programlama
}
}
// Kod buraya gelirse, giriş yanlış yapılmıştır
return false;
}
public void TekSayiYazdir() {
if ( !( Kontrol() ) ) { return; }
txtSayilar.Clear();
int alt = txtAltSayi.Text;
int ust = txtUstSayi.Text;
// Sayılar metin kutusuna, tek sayıların yazdırılması
for ( i=alt; i<=ust; i++ ) {
if ( i % 2 == 1 ) {
txtSayilar.Text += i + Constants.vbCrLf;
}
}
}
// Sayıların txtClipboard isimli metin kutusuna
kaydedilmesi:
private void btnKaydet_Click( System.Object sender,
System.EventArgs e ) {
txtClipBoard.Text = txtSayilar.Text;
// Sayıların kopyalanması için, önce seçilmesi gerekir
txtSayilar.SelectAll();
txtSayilar.Cut();
}
// Cut yordamı çağırıldıktan sonra veriler kopyalanır.
// Paste ile bu kopyalanan veriler geri yazdırılır.
private void btnYukle_Click( System.Object sender,
System.EventArgs e ) {
txtSayilar.Clear();
txtSayilar.Paste();
}
13
Konu: 1
Button
Button
ƒ Komut vermek için kullanılan düğmelerdir.
Windows uygulamalarında, form üzerinde komut düğmeleri olarak kullanılır.
Button Özellikleri
Özellik
Değer Tipi
Açıklama
DialogResult
DialogResult
Ait
olduğu
form
ShowDialog metodu ile
çağrıldığı zaman, dönüş
değerini belirler
FlatStyle
FlatStyle
Düğmeye basıldığında
ve düğmenin üzerine
gelindiğinde
görünen
formatı belirler
Button Olayları
Olay
Açıklama
Click
Düğme
tıklandığı
gerçekleşir
üzerine
zaman
14
Modül 9: Windows Programlama
Örnek: Bir formun üzerindeki düğmelerin DialogResult özellikleri değiştirilerek,
özel bir mesaj kutusu tasarlanabilir.
private void btnIslemYap_Click ( System.Object
sender, System.EventArgs e ) {
OnayFormu onay = New OnayFormu;
onay.btnHayir.DialogResult = DialogResult.No;
onay.FlatStyle = FlatStyle.Flat;
onay.btnEvet.DialogResult = DialogResult.Yes;
onay.btnEvet.FlatStyle = FlatStyle.Flat;
if (onay.ShowDialog == DialogResult.Yes)
// Kayıt işlemleri...
}
15
Konu: 1
CheckBox
CheckBox
ƒ Kullanıcıya seçenekler sunmayı sağlar.
ƒ Birçok seçenek seçilebilir.
Kullanıcının birçok seçeneği birden seçmesi için kullanılır.
CheckBox Özellikleri
Özellik
Değer Tipi
Açıklama
Checked
Boolean
Kontrolün seçili
olmadığını belirler
CheckAlign
ContentAlignement
Seçme kutusunun ve
üzerinde yazan metnin
birbirlerine
göre
konumlarını belirler
Appearance
Appearance
Kontrolün seçme kutusu
ya da düğme şeklinde
olmasını belirler
ThreeState
Boolean
Seçili olup olmaması
dışında, Intermediate
durum da eklenir. Eğer
kontrol Intermediate
durumundaysa Checked
özelliği True olur.
AutoChecked
Boolean
Kontrole
olup
basıldığı
16
Modül 9: Windows Programlama
zaman seçili duruma
geçileceğini belirtir. Eğer
bu özellik False ise,
kontrolün
durumunu
değiştirmek için, Click
olayında,
Checked
özelliğini güncellemek
gerekir
CheckBox Olayları
Olay
Açıklama
CheckChanged
Seçme
kutusunun
durumu değiştiği zaman
gerçekleşir.
Örnek: Bir GSM şebekesinden faturalı hat açılışında toplam tutar
hesaplanırken, bazı seçenekler CheckBox kontrolleri ile sunulabilir.
// Form üzerindeki tüm seçme kutularının durumu
// değiştiği zaman, toplam fiyat tekrar hesaplanır
double toplam = txtAcilisTutari.Text;
// İlk faturada 22 YTL açılış bedeli eklenir
if ( cbOzelIletisimIlkFatura.Checked ) {
toplam += 22;
}
// KDV eklenir
if ( cbKDV.Checked ) {
toplam *= 1.18;
}
// Özel İletişim vergisi eklenir
if ( cbOzelIletisim.Checked ) {
toplam *= 1.25;
}
txtToplam.Text = toplam;
17
Konu: 1
RadioButton
ƒ RadioButton
ƒ Sunulan seçeneklerin bir tanesini seçmeyi
sağlar.
ƒ GroupBox kontrolü ile gruplanır.
ƒ GroupBox
ƒ Kontrollerin düzenlenmesini sağlar.
ƒ Başlık yazısı bulunur.
ƒ Panel
ƒ Yatay – Dikey kaydırma çubukları bulunur.
RadioButton kontrolleri, kullanıcıya sunulan seçeneklerden sadece bir
tanesinin seçilmesine izin verir. Form üzerinde birden fazla RadioButton
konulduğunda bu kontrollerin sadece bir tanesi seçili olabilir. Fakat bazı
durumlarda, farklı seçenek grupları kullanılarak kullanıcının birden fazla seçim
yapması istenebilir. Bu durumda, bazı seçenekler GroupBox kontrolü ile
gruplanmalıdır.
Bu kontrolün özellikleri ve olayları CheckBox kontrolü ile aynıdır. Sadece bir
seçenek seçilebildiği için, kontrollerin yapılması CheckBox kontrolüne göre
daha kolaydır.
GroupBox
Bu kontrol kontrollerin mantıksal bir düzende gruplanması için kullanılır. İçinde
bulunan kontrollerin işleyişlerinde bir farklılık görünmez. Bir grup RadioButton
kontrolünün, diğer RadioButton kontrollerinden etkilenmemesi için kullanılır.
Panel
GroupBox kontrolü gibi, kontrollerin belli bir düzende gözükmesini sağlamak
için kullanılır. GroupBox kontrolünden farkı olarak yatay ve dikey kaydırma
çubuklarının bulunur, ancak Panel üzerinde başlık yazısı bulunmaz.
18
Modül 9: Windows Programlama
Panel özellikleri
Özellik
Değer Tipi
Açıklama
AutoScroll
Boolean
Panelde
kaydırma
çubuklarının
görünürlüğünü belirler
Paneller, seçeneklere göre bir grup kontrolün gizlenmesi veya görüntülenmesi
aşamasında etkili bir rol oynar.
Örnek: RadioButton, GroupBox ve Panel kontrolleri, BilgeAdam eğitim anketi
formunun tasarımında kullanılabilir. Anket, bir eğitimin ürünleri hakkında yapılır.
Anket bilgileri eğitim araç gereçleri ve eğitim içeriği üzerinde “çok iyi” den “çok
kötü” ye kadar bir değer verilmesiyle oluşturulur. Sonuç olarak elde edilen
anket bilgileri kullanıcıya gösterilerek onaylaması beklenir.
•
Global değişkenlerin oluşturulması:
// Ozet bilgilerinin tutulduğu değişken
private string AnketOzet;
// Onaylama düğmesinin aktif hale gelmesi için
// tüm oylamaların yapılmış olması gerekir
private bool IcerikOyuSecildi, AracOyuSecildi;
•
Formun yüklenmesi sırasında, kontroller üzerinde yapılan ayarlar:
private void Form1_Load( System.Object sender,
System.EventArgs e ) {
// Sistem ve yazılım seçeneklerini tutan
// GroupBox kontrolleri gizlenir:
19
Konu: 1
grpSistem.Visible = false;
grpYazilim.Visible = false;
// Anketleri tutan Panel kontrolü gizlenir
pnlAnket.Visible = False;
// Onayla düğmesi oylamadan önce pasif haldedir
btnOnayla.Enabled = False;
}
•
Eğitimler seçildiklerinde, ilgili alt seçeneklerin görüntülenmesi sağlanır.
Alt seçenekler, ayrı GroupBox kontrollerinde tutulur.
private void rbYazilim_CheckedChanged( System.Object
sender, System.EventArgs e ) {
// GroupBox kontrollerini görünümleri, eğitimleri
// seçili olmasıyla doğru orantılıdır.
grpYazilim.Visible = rbYazilim.Checked;
grpSistem.Visible = rbSistem.Checked;
UrunTemizle();
pnlAnket.Visible = False;
}
// Ürünler başlangıç değerlerine çevrilir
void UrunTemizle() {
rbMCSD.Checked = False;
rbMCSE.Checked = False;
rbSistemUzmanligi.Checked = False;
rbYazilimUzmanligi.Checked = False;
}
•
Alt ürünler seçildiklerinde, anket paneli görüntülenir ve panelin
karşılama mesajında, ilgili ürünün ismi gösterilir.
private void rbSistemUzmanligi_CheckedChanged(
System.Object sender, System.EventArgs e ) {
string panelMesaji;
// Bu olayı tetikleyen RadioButton kontrolü alınır
RadioButton basilan = sender;
lblKarsilamaMesaji.Text = basilan.Text + " iin
anket girişi:";
pnlAnket.Visible = true;
}
•
Anketlerde, ilgili konularda oylama yapıldığı zaman, oylama düğmesi
aktif hale getirilir ve anket mesajı oluşturulur.
// Eğitim içeriği için verilen oy
private void rbCokIyi_Icerik_CheckedChanged(
System.Object sender, System.EventArgs e ) {
IcerikOyuSecildi = true;
);
RadioButton basilan = sender;
AnketOzetiCikar( "Eitim ierii: " + basilan.Text
20
Modül 9: Windows Programlama
}
// Eğitim araç gereçleri için verilen oy
private void rbCokIyi_Arac_CheckedChanged(
System.Object sender, System.EventArgs e ) {
AracOyuSecildi = true;
RadioButton basilan = sender;
AnketOzetiCikar( "Eitim ara gereleri: " +
basilan.Text );
}
public void AnketOzetiCikar( string ozet ) {
AnketOzet += ozet + Constants.vbCrLf;
if ( IcerikOyuSecildi & AracOyuSecildi ) {
btnOnayla.Enabled = true;
}
}
Anket bilgileri oluşturulduktan sonra, onay düğmesi aktif hale gelir. Bu
düğmeye basıldığı zaman kullanıcıya girdiği bilgiler mesaj kutusu ile gösterilir.
Kullanıcı onayladıktan sonra kayıt işlemleri gerçekleşir.
private void btnOnayla_Click( System.Object sender,
System.EventArgs e ) {
string mesaj;
mesaj = "Yaplan anket sonucu: " +
Constants.vbCrLf + AnketOzet + Constants.vbCrLf;
mesaj += "Bilgileriniz kaydedilecektir. Devam
etmek istiyor musunuz?";
if ( MessageBox.Show( mesaj, MsgBoxStyle.YesNo,
"Anket Sonucu" ) == DialogResult.No ) {
return;
}
else {
// Anket kayıt işlemleri...
21
Konu: 1
}
}
ListBox
ListBox
ƒ Nesnelerin listelenmesini sağlar.
ƒ İstenen sayıda öğe seçilebilir.
Kullanıcıya sunulan seçeneklerin bir liste halinde görünmesini sağlar. Liste
kutusundan istenen sayıda öğe seçilebilir.
ListBox Özellikleri
Özellik
Değer Tipi
Açıklama
Items
ListBox.ObjectCollection
Liste
kutusuna
eklenen
öğelerin
tutulduğu koleksiyon
nesnesidir.
SelectedItem
Object
Liste
kutusundan
seçilen öğeyi alır.
SelectedItems
SelectedObjectCollection
Liste
kutusundan
seçilen öğeleri alır.
Seçilen
öğeler
dinamik bir dizide
tutulur.
SelectedIndex
Integer
Liste
kutusundan
seçilen öğenin indisini
22
Modül 9: Windows Programlama
alır.
SelectedIndices
SelectedIndexCollection
Liste
kutusundan
seçilen
öğelerin
indislerini
bir
koleksiyon
nesnesinde tutar.
DataSource
Object
Listenin
öğelerinin
tutulduğu
veri
kaynağıdır.
Veri
kaynağı boş geçilirse
Items koleksiyonuna
eklenen
öğeler
görüntülenir.
DisplayMember
String
Veri
kaynağından
gelen
öğelerin,
kullanıcıya
gösterilecek
özelliğidir.
ValueMember
String
Veri
kaynağından
gelen öğelerin, dönüş
değerini
belirleyen
özelliğidir.
SelectedValue
Object
Seçilen öğenin, liste
kutusunun
ValueMember
ile
belirtilen özelliğidir.
SelectionMode
SelectionMode
Liste kutusundan kaç
tane
öğe
seçilebileceğini
belirtir. None değeri 0,
One
değeri
1,
MultiSimple
ve
MultiExtended
değerleri birden fazla
öğenin
seçilebileceğini
belirtir.
MultiColumn
Boolean
Liste
kutusundaki
öğelerin biden fazla
kolonda
görüntülenmesini
belirler.
23
Konu: 1
ListBox Olayları
Olay
Açıklama
SelectedIndexChanged
Liste kutusunda bir öğe
seçildiği
zaman
gerçekleşir.
ListBox Metotları
Metot
Açıklama
GetItemText
Parametre
olarak
verilen nesnenin liste
kutusunda
gösterilen
yazısını döndürür.
GetSelected
Parametre
olarak
verilen indisteki öğenin
seçili olup olmadığını
döndürür.
FindString
Parametredeki String
ifadesini liste kutusunda
arayarak, bulduğu ilk
öğenin indisini döndürür
Örnek: Tedarikçiden alınacak ve stokta bulunan ürünleri listelemek ve alım
satım işlemi yapmak için ListBox kontrolleri kullanılabilir.
•
Ürünlerin tutulması için bir Struct oluşturulur. Bu ürün yapısının
ToString metodu tekrar yazılmıştır. Bunun nedeni, ListBox
kontrolünde listelenen nesnelerin görüntülendiği değer ToString
metodu çağırılarak belirlenir. Dolayısıyla liste kutularında istenen
formatta değerin gözükmesini sağlamak için ToString metodunun
tekrar yazılması gerekir.
public struct Urun {
public string Ismi;
24
Modül 9: Windows Programlama
public double Fiyat;
public Urun( string UrunIsim, double UrunFiyat )
{
Ismi = UrunIsim;
Fiyat = UrunFiyat;
}
public override string ToString() {
return string.Format( "{0} - {1:C}", Ismi,
Fiyat );
}
}
•
Liste kutularının özellikleri ayarlanır ve içine eleman doldurulur.
private void Form1_Load( System.Object sender,
System.EventArgs e ) {
lbTedarikci.SelectionMode =
SelectionMode.MultiExtended;
lbStok.SelectionMode =
SelectionMode.MultiExtended;
UrunEkle();
}
public void UrunEkle() {
Urun u = new Urun();
u = new Urun( "Kalem", 1.49 );
lbTedarikci.Items.Add( u );
u = new Urun( "Silgi", 0.39 );
lbTedarikci.Items.Add( u );
u = new Urun( "Defter", 4.99 );
lbTedarikci.Items.Add( u );
u = new Urun( "Cetvel", 1.99 );
lbTedarikci.Items.Add( u );
u = new Urun( "Pergel", 2.99 );
lbTedarikci.Items.Add( u );
u = new Urun( "Not Defteri", 3.79 );
lbTedarikci.Items.Add( u );
}
•
Tedarikçi liste kutusundan, stok liste kutusuna öğe aktarılması için,
seçilen değerler önce liste kutusuna eklenir. Daha sonra bu seçilen
değerler, diğer listede olmayacağı için tek tek çıkartılır.
private void btnEkle_Click( System.Object sender,
System.EventArgs e ) {
// Tedarikçiden alınan ürünler stok listesine eklenir
foreach ( object item in
lbTedarikci.SelectedItems ) {
lbStok.Items.Add( item );
}
// Stok listesine eklenen tüm ürünler
// tedarikçi listesinden çıkartılır
foreach ( object item in lbStok.Items ) {
lbTedarikci.Items.Remove( item );
}
25
Konu: 1
btnCikar.Enabled = true;
btnHesapla.Enabled = true;
}
•
Stok listesinden öğe çıkarmak için, ekleme işlemine benzer kodlar
çalıştırılır.
private void btnCikar_Click( System.Object sender,
System.EventArgs e ) {
// Tedarikçiden alınan ürünler stok listesine eklenir
foreach ( object item in lbStok.SelectedItems )
{
lbTedarikci.Items.Add( item );
// Stok listesine eklenen tüm ürünler
// tedarikçi listesinden çıkartılır
foreach ( object item in lbTedarikci.Items ) {
lbStok.Items.Remove( item );
}
if ( lbStok.Items.Count == 0 ) {
btnCikar.Enabled = false;
btnHesapla.Enabled = false;
}
}
•
Stoktaki toplam fiyatın hesaplanması işlemi, ürünlerin fiyatlarının alınıp
toplanması ile gerçekleşir.
private void btnHesapla_Click( System.Object sender,
System.EventArgs e ) {
double toplam = 0;
for (int i=0; i<=lbStok.Items.Count - 1; i++ ) {
Urun
urun
=
(
(
WindowsApplication8.Form1.Urun )( lbStok.Items[ i ]) );
toplam += urun.Fiyat;
}
lblToplam.Text = System.Convert.ToString( toplam
);
}
•
Stok listesindeki bir öğenin seçildiği durumda, bu öğenin fiyatı
görüntülenir.
private void lbStok_SelectedIndexChanged(
System.Object sender, System.EventArgs e ) {
Urun secilen = new
WindowsApplication8.Form1.Urun();
secilen = ( (Urun )( lbStok.SelectedItem ) );
lblUrunFiyat.Text = string.Format( "{0:C}",
secilen.Fiyat );
}
26
Modül 9: Windows Programlama
CheckedListBox
CheckedListBox
ƒ ListBox yapısındadır.
ƒ Öğeler işaret kutusu ile gösterilir.
Liste kutusunun tüm özellik, metot ve olaylarını alır ve listedeki öğelerin işaret
kutusu ile gösterilmesini sağlar.
CheckedListBox Özellikleri
Özellik
Değer Tipi
Açıklama
CheckedItems
CheckedItemCollection
Liste
kutusunda
işaretlenmiş
öğeleri
tutar
CheckedIndices
CheckedIndexCollection
Liste
kutusunda
işaretlenmiş öğelerin
indislerini tutar
CheckOnClick
Boolean
Liste kutusunda öğeye
tıklandığı
zaman
işaretlenmesini belirler.
False ise ilk tıklamada
öğe
seçilir,
ikinci
tıklamada
seçme
kutusu işaretlenir.
CheckedListBox Metotları
Metot
Açıklama
27
Konu: 1
GetItemSelected
Parametre
olarak
verilen indisteki öğenin
seçili olup olmadığını
döndürür
SetItemSelected
İlk parametrede verilen
indisteki elemanın seçili
olup olmadığını, ikinci
parametrede
verilen
Boolean
değeri ile
belirler
Örnek: Kategori başına stoktaki toplam ürünlerin gösterildiği bir uygulamada,
listelenen kategorileri seçmek için bu kontrol uygun olur.
•
Listede bir öğe seçildiği zaman, seçilen tüm kategorilerin ürün stok
durumu alınır ve toplam ürün sayısı kullanıcıya gösterilir.
private void chlistKategoriler_SelectedIndexChanged(
System.Object sender, System.EventArgs e ) {
int toplam;
toplanır.
i++ ) {
//
Listedeki seçilen öğelerin ürün adeti
for ( i=0; i<=chlistKategoriler.Items.Count - 1;
if ( chlistKategoriler.GetItemChecked( i ) )
{
object secilen = null;
secilen = chlistKategoriler.Items( i );
// Stok durumunu gsteren fonksiyon arlr
toplam += StokDurumu( secilen.ToString()
);
}
}
lblToplamUrun.Text = "Seilen kategorilerdeki
toplam ürün: " + toplam;
}
// Kategoriye göre, stoktaki ürünlerin belirlenmesi
public int StokDurumu( string kategori ) {
switch ( kategori ) {
28
Modül 9: Windows Programlama
case "Film":
return 1100;
case "Mzik":
return 982;
case "Bilgisayar":
return 302;
case "Kitap":
return 1222;
default:
return 10;
}
// Ekleme işlemi
private void btnKategoriEkle_Click( System.Object
sender, System.EventArgs e ) {
chlistKategoriler.Items.Add( txtKategoriAdi.Text
);
}
ComboBox
ComboBox
ƒ Listelenen öğeler açılan kutuda
görüntülenir.
ƒ Listeden bir tane öğe seçilebilir.
Liste kutusu ile aynı özelliklere sahiptir. Ancak listelenen öğeler açılan bir
kutuda görüntülenir ve listeden en fazla bir tane öğe seçilebilir. Liste kutusuna
göre bir başka farklılığı ise, isteğe bağlı olarak, kullanıcın açılan kutu üzerinde
değer girebilmesidir. Dolayısıyla bir TextBox kontrolü gibi de davranabilir.
ComboBox Özellikleri
29
Konu: 1
Özellik
Değer Tipi
Açıklama
DropDownStyle
ComboBoxStyle
Kontrolün
listeleme
stilini belirler. Simple
stil, listedeki sadece bir
öğeyi
görüntüler.
DropDown stili, listenin
tüm
elemanlarını
görüntüleyerek
seçilmelerini
ve
kullanıcının
değer
girmesini
sağar.
DropDownList
kullanıcının
değer
girmesini engeller.
DropDownWidth
Integer
ComboBox kontrolünün
açılan
listesinin
genişliğini belirler.
MaxDropDownItems
Integer
Kontrole eklenebilecek
maksimum
öğe
sayısını belirler.
MaxLength
Integer
Kullanıcının
girebileceği maksimum
karakter
sayısını
belirler.
SelectedText
String
Seçilen
öğenin
görüntülenen yazısını
belirler.
Örnek: Tarih ve sayı formatlarını, kullanıcının seçimine bırakarak bir sayı veya
tarih yazdırma işlemi ComboBox kontrolleri ile yapılabilir.
•
ComboBox kontrollerinin özelliklerinin ayarlanması ve format tiplerine
öğe eklenmesi
private void Form1_Load( System.Object sender,
System.EventArgs e ) {
30
Modül 9: Windows Programlama
cmbFormat.DropDownStyle =
ComboBoxStyle.DropDownList;
cmbFormatString.DropDownStyle =
ComboBoxStyle.DropDownList;
cmbFormat.Items.Add( "Tarih Formatı" );
cmbFormat.Items.Add( "Sayı Formatı" );
}
•
Tarih ya da sayı formatlarından biri seçildiği zaman, ikinci ComboBox
kontrolüne değişik format seçenekleri eklenir.
private void cmbFormat_SelectedIndexChanged(
System.Object sender, System.EventArgs e ) {
cmbFormatString.Items.Clear();
yyyy" );
switch ( cmbFormat.SelectedIndex ) {
case 0:
cmbFormatString.Items.Add( "dd - MM -
hh:mm" );
cmbFormatString.Items.Add( "yyyy*MM*dd
cmbFormatString.Items.Add(
dd.MM.yy hh:mm:ss" );
break;
case 1:
cmbFormatString.Items.Add(
cmbFormatString.Items.Add(
cmbFormatString.Items.Add(
break;
}
"dddd
"C" );
"P" );
"N" );
}
•
Format seçildikten sonra metin kutusuna girilen değer alınır ve ilgili
formatta gösterilir
private void
System.EventArgs e )
switch (
case
btnGoster_Click( System.Object sender,
{
cmbFormat.SelectedIndex ) {
0:
DateTime d = txtYazi.Text;
lblSonuc.Text = d.ToString(
cmbFormatString.Text );
break;
case 1:
int i = txtYazi.Text;
lblSonuc.Text = i.ToString(
cmbFormatString.Text );
break;
}
}
31
Konu: 1
NumericUpDown
NumericUpDown
ƒ Sayısal değerlerin yukarı aşağı okları ile
seçilmesini sağlar
DomainUpDown
ƒ Object tipinde nesnelerin seçilmesini
sağlar.
Bu kontrol kullanıcının, sayısal bir değeri girmesini veya yukarı aşağı okları ile
seçmesini sağlar.
NumericUpDown Özellikleri
Özellik
Değer Tipi
Açıklama
HexaDecimal
Boolean
Sayıların on altılık
tabanda
görüntülenmesini
belirler.
Increment
Decimal
Aşağı yukarı oklar
kullanıldığında,
sayıların artma ve
azalma
adımlarını
belirler.
Maximum
Decimal
Kontrolde gösterilen
sayıların
alabileceği
maksimum
değeri
belirler.
Minimum
Decimal
Kontrolde
sayıların
minimum
gösterilen
alabileceği
değeri
32
Modül 9: Windows Programlama
belirler.
ThousandSeparators
Boolean
Sayıların
basamak
ayracını gösterilmesini
belirler.
Value
Decimal
Kontrolün gösterdiği
sayı değerini belirler.
ReadOnly
Boolean
True değerini alırsa
kullanıcının
giriş
yapmasını engeller.
NumericUpDown Olayları
Olay
Açıklama
ValueChanged
Kontrolün sayı değeri
değiştiği
zaman
gerçekleşir
NumericUpDown Metotları
Metot
Açıklama
DownButton
Aşağı düğmesine basar
ve
sayı
değerini
düşürür.
UpButton
Yukarı
düğmesine
basar ve sayı değerini
artırır.
Örnek:
kurarken, tarih ve
NumericUpDown kontrolü ile yapılabilir.
•
Alarm
zaman
değerlerinin
ayarlanması
Tarih ve zaman değerlerinin alabileceği maksimum ve minimum
değerler ayarlanır.
private void Form1_Load( System.Object sender,
System.EventArgs e ) {
nYil.Minimum = 1;
nAy.Minimum = 1;
33
Konu: 1
nGun.Minimum = 1;
nYil.Maximum = 2099;
nAy.Maximum = 12;
nGun.Maximum = 31;
nSaat.Minimum = 0;
nDakika.Minimum = 0;
nSaat.Maximum = 23;
nDakika.Maximum = 59;
nYil.Value = DateAndTime.Now.Year;
nAy.Value = DateAndTime.Now.Month;
nGun.Value = DateAndTime.Now.Day;
nSaat.Value = DateAndTime.Now.Hour;
nDakika.Value = DateAndTime.Now.Minute;
}
•
Bu değerlerden herhangi biri değiştiği zaman, doğru tarih ve zaman
değerinin girilmesi kontrol edilir
private void nGun_ValueChanged( System.Object
sender, System.EventArgs e ) {
string tarih;
tarih = nGun.Value + "." + nAy.Value + "." +
nYil.Value;
if ( !( IsDate( tarih ) ) ) {
MessageBox.Show( tarih );
}
string zaman;
zaman = nSaat.Value + ":" + nDakika.Value;
if ( !( IsDate( zaman ) ) ) {
MessageBox.Show ( zaman );
}
}
DomainUpDown
NumericUpDown kontrolü ile aynı yapıdadır ancak sayısal değerler yerine
Object tipinde değerler tutar. Bu değerler kontrolün Items koleksiyonunda
tutulur. Kontrol, bu özelliği ile liste kutusuna benzemektedir.
DomainUpDown Özellikleri
Özellik
Değer Tipi
Açıklama
Items
DomainUpDownItemCollection
Kontrolün
öğelerinin
tutulduğu dinamik
bir listedir.
SelectedItem
Object
Kontrolde seçilen
öğeyi tutar.
34
Modül 9: Windows Programlama
Wrap
Boolean
Liste
sonuna
gelindiğinde
baştaki
veya
sondaki
öğeye
geri dönülmesini
belirler.
DomainUpDown Olayları
Olay
Açıklama
SelectedItemChanged
Kontrolde seçilen öğe
değiştiği
zaman
gerçekleşir.
Örnek: Metin kutularının değiştirilmek istenen yazı tipleri DomainUpDown
kontrolünde tutulabilir.
private void Form1_Load( System.Object sender,
System.EventArgs e ) {
for ( i=0; i<=10; i++ ) {
dFont.Items.Add(
System.Drawing.FontFamily.Families[ i ].Name );
}
dFont.Wrap = true;
}
private void dFont_SelectedItemChanged(
System.Object sender, System.EventArgs e ) {
if ( dFont.SelectedIndex >= 0 ) {
TextBox1.Font = new Font(
dFont.SelectedItem.ToString, 15 );
}
}
35
Konu: 1
HScrollBar / VscrollBar
HScrollBar – VScrollBar
ƒ Sayısal değer taşıyan kaydırma
çubuklarıdır.
Horizontal – Vertical ScrollBar kontrolleri, sayısal bir değer taşıyan
kaydırma çubuklarıdır. Tuttukları değerlerin sayısal olması bakımından
NumericUpDown kontrolüne benzer. Bu kontroller, üzerlerinde kaydırma
çubukları olmayan kontroller üzerinde kullanılabilir. Örneğin bir ListBox, Panel
gibi kontrollerin kendi ScrollBar kontrolleri vardır. TextBox kontrolünün de
ilgili özellikleri ayarlanarak yatay ve dikey ScrollBar kontrolleri gösterilebilir.
ScrollBar Özellikleri
Özellik
Değer Tipi
Açıklama
Value
Integer
Kaydırma
pozisyonuna
değeri tutar.
SmallChange
Integer
Kontrolü, üstündeki oklar ile
kaydırıldığı zaman eklenecek
ya da çıkartılacak değeri tutar.
LargeChange
Integer
Kontrolü,
kaydırma
çubuğundaki
boşluğa
tıklanarak
kaydırıldığında
zaman eklenecek ya da
çıkartılacak değeri tutar.
Minimum
Integer
Value özelliğinin alabileceği
maksimum değeri tutar
çubuğunun
göre alınan
36
Modül 9: Windows Programlama
Maximum
Integer
Value özelliğinin alabileceği
minimum değeri tutar
ScrollBar Olayları
Olay
Açıklama
Scroll
Çubuklar kaydırıldıkları
zaman gerçekleşir.
ValueChanged
Kod ile ya da çubuklar
kaydırılınca
Value
özelliği değiştiği zaman
gerçekleşir.
Örnek: Bir ComboBox kontrolünün öğelerini listelemek için, aşağıya doğru bir
kaydırma çubuğu görüntülenir. Ancak listedeki bazı elemanların kontrole
sığmıyorsa, çalışma anında bu kontrolün genişliği artırılabilir.
private void Form1_Load( System.Object sender,
System.EventArgs e ) {
hsGenislik.Maximum = ComboBox1.Width * 2;
hsGenislik.Value = ComboBox1.Width;
}
private void hsGenislik_Scroll( System.Object
sender, System.Windows.Forms.ScrollEventArgs e ) {
ComboBox1.Width = hsGenislik.Value;
}
37
Konu: 1
TrackBar
TrackBar
ƒ Kaydırma çubuğunun pozisyonu görsel
olarak takip edilir.
ƒ Pozisyon, klavye tuşları ile değiştirilebilir.
Bu kontrol, ScrollBar kontrollerine benzer yapıdadır ancak kontrol, bir cetvel
biçiminde olduğu için, üzerinde durulan pozisyon görsel olarak takip edilebilir.
Kontrolün, kaydırma çubuklarından bir farkı da üzerine odaklanabilir olmasıdır.
Dolayısıyla kontrolün Value değeri klavyede bulunan yukarı, aşağı, sağ, sol
okları ve PageUp, PageDown düğmeleri ile değiştirilebilir.
TrackBar Özellikleri
TrackBar kontrolünün birçok özelliği ScrollBar kontrollerinin özellikleriyle
aynıdır. Fakat kontrolü daha esnek hale getiren birkaç özelliği vardır.
Özellik
Değer Tipi
Açıklama
TickStyle
TickStyle
Kontrolün değerini gösteren
çizgilerin pozisyonunu belirler
TickFrequency
Integer
Çizgiler
arasında
kalan
değerlerin sayısını belirler
Orientation
Orientation
Kontrolün yönünün yatay
veya dikey olmasını sağlar.
38
Modül 9: Windows Programlama
TabControl
TabControl
ƒ Sekme sayfa yapısı sunar.
ƒ TabPage nesnelerinden oluşur.
TabControl nesnesi, içinde sekme sayfaları tutan yapıdır. Bu sayfalar,
TabPage nesneleri olarak oluşturulup yapılandırıldıktan sonra TabControl
nesnesinin TabPages koleksiyonuna eklenir. Ekleme işlemi, Properties paneli
ile tasarım anında da yapılabilir.
TabControl Özellikleri
Özellik
Değer Tipi
Açıklama
HotTrack
Boolean
Fare ile sekme sayfalarının
üzerine
gelindiğinde,
isimlerinin
görsel
olarak
değişmesini belirler
ItemSize
Size
Sekme sayfalarının boyutunu
belirler
Multiline
True
Eklenen sekmelerin birden
fazla satırda üst üste
gözükmesini belirler
ShowToolTips
Boolean
Fare sekme sayfalarının
üzerindeyken bilgi mesajının
gösterilmesini belirler
SelectedTab
TabPage
Seçilen
belirler
sekme
sayfasını
39
Konu: 1
SelectedIndex
Integer
Seçilen sekme
indisini belirler
TabCount
Integer
Sekme sayısını belirler
TabPages
TabPageCollection
Kontrolün içinde bulunduğu
sekme
sayfalarının
koleksiyonudur.
sayfasının
TabControl nesnesine TabPage sayfaları eklemek için tasarım anında
TabPages Collection Editor penceresinden yararlanılabilir.
TabPage Özellikleri
Sekme sayfaları, normal form tasarımları gibi kontroller eklenerek yapılır.
TabPage kontrolü Panel kontrolünden türer ve Panel kontrolünün tüm
özelliklerini alır.
Özellik
Değer Tipi
Açıklama
ToolTipText
String
Bu özelliğin değeri, fare
sayfanın üzerindeyken, bilgi
mesajı olarak gösterilir. Ait
40
Modül 9: Windows Programlama
olduğu
TabControl
nesnesinin
ShowToolTip
özelliği True olmalıdır.
Örnek: Bir kullanıcı kaydının tek bir formda görüntülenmesi isteniyorsa, bu
form TabControl ile küçük sayfalara bölünebilir.
DateTimePicker
DateTimePicker
ƒ Takvimden zaman değeri seçilmesini
sağlar.
ƒ Takvim yapısı açılan kutu şeklindedir.
Bir açılan kutudan zaman değeri seçmeyi sağlar. Seçilen değer Date tipinde
olur.
41
Konu: 1
DateTimePicker Özellikleri
Özellik
Değer Tipi
Açıklama
CalendarTrailingForeColor
Color
Bir önceki ve bir sonraki
ayın
günlerinin
görüntülenme rengi
CalendarTitleForeColor
Color
Takvim başlığının önalan
rengi
CalendarTitleBackColor
Color
Takvim başlığının arka plan
rengi
CalendarMonthBackground
Color
Takvim arka plan rengi
CalendarForeColor
Color
Takvimdeki
plan rengi
CalendarFont
Font
Takvimin gösterileceği yazı
tipi ayarları
ShowCheckBox
Boolean
Tarih değerinin yanında
seçme
kutusunun
gösterilmesi.
Checked
Boolean
Seçme
kutusu
görüntülendiği
zaman,
tarihin seçili olup olmadığını
gösterir
Format
DateTimePic
kerFormat
Kontrolün görüntüleneceği
formatı belirler. Long, Short
değerleri uzun ve kısa tarih
formatını, Time sadece
zamanı gösterir. Custom
değeri,
CustomFormat
özelliğine girilen formatta
gösterileceğini belirler
CustomFormat
String
Tarihin hangi formatta
gösterileceğini belirler.
Value
Date
Seçilen
belirler
MaxDate
Date
Kontrolün
alabileceği
maksimum tarih değeri
MinDate
Date
Kontrolün
alabileceği
minimum tarih değeri
ShowUpDown
Boolean
Kontrolün formunu açılan
kutu ya da yukarı aşağı
okları formatında gösterir.
Bu özellik True olduğunda,
kontrolün
formatı,
yazıların
tarih
NumericUpDown
ön
değerini
42
Modül 9: Windows Programlama
kontrolünün
olur.
formatında
Örnek: Verit tabanından bir kaydın belli tarih aralıkları ile sorgulanması
sırasında, kullanıcının başlangıç ve bitiş tarihlerini seçmesi için bu kontrol
kullanılır.
private void Form1_Load( System.Object sender,
System.EventArgs e ) {
TarihAyarla( dtBaslangic );
TarihAyarla( dtBitis );
}
);
public void TarihAyarla( DateTimePicker dtTarih ) {
dtTarih.Format = DateTimePickerFormat.Custom;
dtTarih.CustomFormat = "dd - MM - yyyy";
dtTarih.MaxDate = DateAndTime.Now.AddYears( 2 );
dtTarih.MinDate = DateAndTime.Now.AddYears( -2
}
private void
System.EventArgs e )
DateTime
basTarih
sonTarih
btnAra_Click( System.Object sender,
{
basTarih, sonTarih;
= dtBaslangic.Value;
= dtBitis.Value;
if ( DateTime.Compare( basTarih, sonTarih ) == 1
) { return; }
string Sql;
Sql = "Select * From Siparisler Where
SiparisTarih Between ";
Sql += basTarih + " And " + sonTarih;
//
}
komutunu çalıştır
43
Konu: 1
MonthCalendar
MonthCalendar
ƒ Takvimden bir zaman aralığı seçilmesini
sağlar.
DateTimePicker kontrolünün açılan takvimi biçimindedir. Bu kontrol
kullanıcıya, tarih alanları üzerinde daha esnek çalışmayı sağlar.
MonthCalendar Özellikleri
DateTimePicker kontrolünün birçok özelliğini almasına rağmen, bazı
özelliklerinde değişiklikler görülür. Örneğin Value özelliği bu kontrolde yoktur.
Bu kontrolden seçilen değerler, bir tarih aralığıdır. Dolayısıyla tek bir Date tipini
tutan bir özellik yoktur.
Özellik
Değer Tipi
Açıklama
MaxSelectionCount
Integer
Bir seferde maksimum kaç
gün seçileceğini belirler.
SelectionRange
SelectionRange
Başlangıç
ve
bitiş
tarihlerinden oluşan bir seçim
aralığı nesnesidir.
SelectionBegin
Date
Seçilen tarih aralığının hangi
tarihten itibaren başladığını
belirler
SelectionEnd
Date
Seçilen tarih aralığının hangi
tarihte bittiğini belirler
ScrollChange
Integer
İleri
geri
düğmelerine
44
Modül 9: Windows Programlama
basıldığı zaman kaç
atlanacağını belirler
ay
MonthlyBoldedDates
Date()
Takvimde hangi günlerin kalın
yazı tipinde gösterileceğini
belirler. İşaretlenen günler,
her ay için kalın gösterilir.
ShowToday
Boolean
Takvimin alt kısmında, sistem
takvimine göre hangi günde
olduğunu gösterir
ShowTodayCircle
Boolean
Takvimde, o günün seçili
olmasını belirler
ShowWeekNumbers
Boolean
Takvimin sol tarafında, yılın
hafta numaralarını gösterir
MonthCalendar Olayları
Olay
Açıklama
DateChanged
Seçilen tarihten farklı bir
tarih
seçildiğinde
gerçekleşir
DateSelected
Yeni bir tarih seçildiği
zaman
gerçekleşir.
DateChanged
olayı
gerçekleştikten hemen
sonra
bu
olay
gerçekleşir.
Örnek: Yapılacak görevlerin tutulduğu bir Windows uygulamasında, görevin
başlangıç ve bitiş tarihleri tek bir MonthCalendar kontrolünden kolaylıkla
seçilebilir.
45
Konu: 1
•
Görevlerin tanımlanması için bir Görev sınıfı oluşturulur.
public class Gorev {
public string GorevIsmi;
public DateTime BaslangicTarihi;
public DateTime BitisTarihi;
// Liste kontrollerinde görevin isminin görüntülenmesi
// için, ToString metodunu tekrar yazmak gerekir.
public override string ToString() {
return GorevIsmi;
}
public Gorev( string Isim, DateTime basTarihi,
DateTime bitTarihi ) {
this.GorevIsmi = Isim;
this.BaslangicTarihi = basTarihi;
this.BitisTarihi = bitTarihi;
}
}
•
Görevler ekleneceği zaman, yeni bir görev nesnesi oluşturulur ve
görevin başlangıç-bitiş tarihleri ayarlanır.
private void Form1_Load( System.Object sender,
System.EventArgs e ) {
// Maksimum iki hafta seçilsin
MonthCalendar1.MaxSelectionCount = 14;
}
private void btnEkle_Click( System.Object sender,
System.EventArgs e ) {
DateTime baslangicTarihi =
MonthCalendar1.SelectionStart;
DateTime bitisTarihi =
MonthCalendar1.SelectionEnd;
string gorevIsmi = txtYeniGorev.Text;
Gorev yeniGorev = new Gorev( gorevIsmi,
baslangicTarihi, bitisTarihi );
ListBox1.Items.Add( yeniGorev );
}
private void ListBox1_SelectedIndexChanged(
System.Object sender, System.EventArgs e ) {
Gorev secilen;
secilen = ListBox1.SelectedItem;
MonthCalendar1.SelectionStart =
secilen.BaslangicTarihi;
MonthCalendar1.SelectionEnd =
secilen.BitisTarihi;
txtYeniGorev.Text = secilen.GorevIsmi;
}
46
Modül 9: Windows Programlama
Timer
Timer
ƒ Zaman değeri ayarlanabilen sayaçtır.
ƒ Interval özelliği ile, kaç milisaniyede bir
çalışacağı belirlenir.
Windows uygulamalarında sayaç görevini görür.
Timer Özellikleri
Özellik
Değer Tipi
Açıklama
Enabled
Boolean
Kontrolün
aktif
olmadığını belirler.
Interval
Integer
Sayacın
hangi
zaman
aralığında
bir
çalışması
gerektiğini belirler. Milisaniye
cinsindedir.
Timer Olayları
Olay
Açıklama
Tick
Interval
özelliğinde
belirtilen zaman değeri
geçtiğinde gerçekleşir.
Timer Metotları
Metot
Açıklama
olup
47
Konu: 1
Start
Sayacı başlatır
Stop
Sayacı durdurur
ProgressBar
ProgressBar
ƒ Yapılan işlemlerin ilerleyişini gözlemeyi
sağlar.
ƒ Maksimum ve minimum değerleri
arasındaki pozisyonu gösterir.
ProgressBar, belli bir andaki değerinin, alabileceği değer aralığına göre
yüzdesini gösterir. Yapılan bir işlemin ilerleyişini göstermesi açısından oldukça
kullanışlı bir kontroldür.
ProgressBar Özellikleri
Özellik
Değer Tipi
Açıklama
Minimum
Integer
Kontrolün
alabileceği
minimum değer belirler
Maximum
Integer
Kontrolün
alabileceği
minimum değer belirler
Value
Integer
Kontrolün
verilen
değer
aralığındaki
pozisyonunu
belirler
Örnek: ProgressBar bir sayım işleminde kalan durumu göstermek için
kullanılabilir.
48
Modül 9: Windows Programlama
•
ProgressBar ile durumun gösterileceği ayrı bir form eklenir. Burada
sayma işleminin hızı için bir Timer bulunur. Sayaç her işlediğinde yeni
değer ProgressBar kontrolünde gösterilir.
public int kalan;
private void Durum_Load( System.Object sender,
System.EventArgs e ) {
kalan = ProgressBar1.Maximum;
Timer1.Start();
}
private void Timer1_Tick( System.Object sender,
System.EventArgs e ) {
if ( kalan == 0 ) {
Timer1.Stop();
this.Close();
}
int aralik;
aralik = ProgressBar1.Maximum ProgressBar1.Minimum;
int oran = ( aralik - kalan ) / aralik * 100;
Label1.Text = oran + "% tamamlandı";
ProgressBar1.Value = ProgressBar1.Maximum -
kalan;
kalan -= 1;
}
•
Oluşturulan bu form, başlangıç formundan çağırılarak durum gösterilir.
private void Form1_Load( System.Object sender,
System.EventArgs e ) {
CheckBox1.Checked = true;
}
private void btnBaslat_Click( System.Object sender,
System.EventArgs e ) {
Durum frmDurum = new Durum();
frmDurum.Timer1.Interval = TextBox1.Text;
if ( CheckBox1.Checked ) {
frmDurum.ShowDialog();
49
Konu: 1
}
}
ErrorProvider
ErrorProvider
ƒ Hata mesajlarını kontrollerin yanında
gösterir.
Form üzerindeki kontrollerin yanında hata mesajları gösterilmesini sağlar.
ErrorProvider Özellikleri
Özellik
Değer Tipi
Açıklama
BlinkRate
Integer
Hata
simgesinin
milisaniyede
bir
söneceğini belirler
BlinkStyle
ErrorBlinkSytle
Hata simgesinin yanıp sönme
stilini belirler. AlwaysBlink,
her
zaman,
kaç
yanıp
BlinkIfDifferentError
farklı bir hata meydana
geldiğinde yanıp söneceğini
belirler.
NeverBlink
ise
simgenin yanıp sönmeden
görüntüleneceğini belirler
Icon
Icon
Hata
mesajlarının
gösterilmesi sırasında çıkan
simgeyi belirler
50
Modül 9: Windows Programlama
ErrorProvider Metotları
Metot
Açıklama
SetError
Kontrollerin
mesajlarının
belirlenmesi
kullanılır
hata
için
ErrorProvider kontrolü forma eklendiği zaman, Properties panelinde,
kontrollerin ekstra özellikleri görünür. Bu özellikler, forma eklenen her
ErrorProvider için oluşturulacaktır.
Özellik
Açıklama
IconAlignment
On
ErrorProviderIsmi
Hata simgesinin, kontrolün
üzerinde nerde bulunacağını
belirler
IconPadding
On
ErrorProviderIsmi
Hata simgesinin, kontrolden
kaç piksel uzakta duracağını
belirler
Error
On
ErrorProviderIsmi
Varsayılan
belirler
hata
mesajını
Örnek: Kayıt işlemlerinin yapıldığı sırada, isim soyadı ve TC kimlik
numaralarının girişleri ErrorProvider kontrolü ile denetlenebilir.
•
Metin kutularının Validating olayında, girilen verilerin kontrolleri
yapılır ve gerektiği durumlarda ErrorProvider ile hata mesajları
gösterilir.
private void txtIsim_Validating( object sender,
System.ComponentModel.CancelEventArgs e ) {
if ( txtIsim.Text == "" ) {
ErrorProvider1.SetError( txtIsim, "sim alan
bo girilemez" );
// Bu komut olayın gerçekleşmesini engeller
// Dolayısıyla veri girilmeden bu alandan çıkılamaz
e.Cancel = true;
}
51
Konu: 1
else {
// Eğer beri doğru girilmişse, Error simgesini
// gizlemek için, hata mesajı boş girilir
ErrorProvider1.SetError( txtIsim, "" );
}
}
private void txtSoyad_Validating( object sender,
System.ComponentModel.CancelEventArgs e ) {
if ( txtSoyad.Text == "" ) {
ErrorProvider1.SetError( txtSoyad, "Soyad
alan bo girilemez" );
e.Cancel = true;
}
else {
ErrorProvider1.SetError( txtSoyad, "" );
}
}
private void txtTCKimlik_Validating( object sender,
System.ComponentModel.CancelEventArgs e ) {
if ( !( IsNumeric( txtTCKimlik.Text ) ) ) {
ErrorProvider1.SetError( txtTCKimlik,
"Kimlik numaras yanl girildi" );
e.Cancel = true;
}
else {
ErrorProvider1.SetError( txtTCKimlik, "" );
}
}
52
Modül 9: Windows Programlama
PictureBox
PictureBox
ƒ Resim görüntülemeyi sağlar.
Form üzerinde bir resim görüntülemek için kullanılır.
PictureBox Özellikleri
Özellik
Değer Tipi
Açıklama
Image
Image
Kontrolün resim kaynağını
belirler
SizeMode
PictureBoxSizeMode
Kontrolün,
resmi
nasıl
görüntüleyeceğini
belirler.
AutoSize değeri, kontrolün
büyüklüğünü
resmin
büyüklüğüne göre ayarlar.
CenterImage değeri, resmi
kontrolün ortasına gelecek
şekilde
ayarlar.
Normaldeğeri, kontrolün sol
üst
köşesine
göre
konumlandırır.
StretchImage değeri, resmi
kontrolün büyüklüğüne göre
boyutlandırır ve resmin tam
görünmesini sağlar.
53
Konu: 1
Örnek: Form üzerinde bir resmin değişik boyutlarda gösterilmesi için
PictureBox kontrolü tercih edilir.
private void Form1_Load(
System.EventArgs e ) {
ComboBox1.Items.Add(
ComboBox1.Items.Add(
ComboBox1.Items.Add(
ComboBox1.Items.Add(
}
System.Object sender,
"Normal" );
"Ortala" );
"Sdr" );
"Otomatik Boyutlandr" );
private void ComboBox1_SelectedIndexChanged(
System.Object sender, System.EventArgs e ) {
switch ( ComboBox1.SelectedIndex ) {
case 0:
PictureBox1.SizeMode =
PictureBoxSizeMode.Normal;
break;
case 1:
PictureBox1.SizeMode =
PictureBoxSizeMode.CenterImage;
break;
case 2:
PictureBox1.SizeMode =
PictureBoxSizeMode.StretchImage;
break;
case 3:
PictureBox1.SizeMode =
PictureBoxSizeMode.AutoSize;
break;
}
}
private void btnGoster_Click( System.Object sender,
System.EventArgs e ) {
PictureBox1.Image = Image.FromFile(
txtResimYeri.Text );
}
54
Modül 9: Windows Programlama
ImageList
ImageList
ƒ Resimleri liste halinde tutar.
ƒ Kontrollerin öğelerine resim atanmasını
sağlar.
ImageList kontrolü, form kontrolleri ve içinde bulunan öğeleri için arka plan
resmi sağlayan bir listesi görevini görür.
ImageList Özellikleri
Özellik
Değer Tipi
Açıklama
Images
ImageCollection
Kontrolün içinde bulunan
resimlerin listelendiği dinamik
bir koleksiyondur. Bu özellik
bir koleksiyon olduğu için,
diğer
liste
kontrollerinin
öğelerinin resmini belirleme
işlemi
büyük
ölçüde
kolaylaşır.
ImageSize
Size
Kontrolün tuttuğu resimlerin
büyüklüğünü belirler
TransparentColor
Color
Listedeki
resimlerin
bu
özellikte belirtilen renkteki
bölgeleri saydam olur.
Windows uygulamalarında ImageList kontrolünün kullanımı, diğer kontrollerin
ImageList özelliği olarak belirlendikten sonra gerçekleşir. Bu kontrollerin
listelediği öğelerin arka plan resimleri ImageList kontrolü ile belirlenir.
55
Konu: 1
Örnek: ImageList kontrolünde tutulan resimler bir sayı oyununda rasgele
resim göstermek için kullanılabilir.
private void btnYerlestir_Click( System.Object
sender, System.EventArgs e ) {
int max = ImageList1.Images.Count - 1;
Random r = new Random();
PictureBox1.Image = ImageList1.Images( r.Next(
max ));
PictureBox2.Image = ImageList1.Images( r.Next(
max ));
PictureBox3.Image = ImageList1.Images( r.Next(
max ));
PictureBox4.Image = ImageList1.Images( r.Next(
max ));
}
LinkLabel
LinkLabel
ƒ Nesnelere bağlantı kurulmasını sağlar.
ƒ Metin içinde birden fazla bağlantı tutabilir.
56
Modül 9: Windows Programlama
Bu kontrol, nesnelere bağlantı kurmak için kullanılır. Text özelliğinde birden
fazla nesneye bağlantı kurulabilir. Bu durumda, kontrole tıklandığı zaman hangi
bağlantının işleneceği Click olayında belirlenir.
LinkLabel Özellikleri
Özellik
Değer Tipi
Açıklama
LinkArea
LinkArea
Bağlantının
hangi
karakterler arasında
aktif olacağını belirler
LinkBehavior
LinkBehavior
Bağlantının yazısında
bulunan çizginin ne
zaman gösterileceğini
belirler.
HoverUnderline
değeri fare üzerinde
durduğu
zaman,
AlwaysUnderline
değeri her zaman altı
çizili olduğunu belirler.
NeverUnderline
değeri ise bağlantı
yazısının
altının
çizilmeyeceğini belirler.
LinkColor
Color
Bağlantının
özelliği
False olduğu zaman
gösterilecek
rengini
belirler
LinkVisited
LinkVisited
Boolean
Bağlantının en az bir
kere
tıklandığını
belirler
VisitedLinkColor
Color
Bağlantının
LinkVisited
özelliği
True olduğu zaman
gösterilecek
belirler
Links
LinkLabel.LinkCollection
LinkLabel Olayları
Olay
Açıklama
Click
Kontrolün
üzerine
rengini
Kontrolün
Text
özelliğinde
bulunan
bağlantıları tutar
57
Konu: 1
tıklandığı
zaman
gerçekleşir.
Diğer
kontrollerin
tıklama
olayından farklı olarak,
LinkLabel
üzerinde
hangi
bağlantıya
basıldığı anlaşılır.
Örnek: İletişim bilgi formunda e-posta ve internet adresleri gibi bağlantıları
göstermek için LinkLabel kullanılır.
private void Form1_Load( System.Object sender,
System.EventArgs e ) {
string bilgi;
bilgi = "BilgeAdam web sitesi:
http://www.bilgeadam.com" + Constants.vbCrLf;
bilgi += Constants.vbCrLf + "Mail ile ulamak iin
tklayn" + Constants.vbCrLf;
LinkLabel1.Text = bilgi;
// İnternet adresinin başladığı karakterden
// itibaren link eklenir
LinkLabel1.Links.Add( 22, 24,
"http://www.bilgeadam.com" );
// Mail adresinin başladığı karakterden
// itibaren link eklenir
LinkLabel1.Links.Add( 72, 8,
"mailto:[email protected]" );
}
private void LinkLabel1_LinkClicked( System.Object
sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e
) {
int tiklanan;
tiklanan = LinkLabel1.Links.IndexOf( e.Link );
//Tıklanan linkin ziyaret edildiği belirtilir
LinkLabel1.Links( tiklanan ).Visited = true;
// Linki çalıştırmak için ilgili işlem gerçekleştirilir
58
Modül 9: Windows Programlama
System.Diagnostics.Process.Start( e.Link.LinkData );
}
TreeView
TreeView
ƒ Öğelerin hiyerarşik yapıda
görüntülenmesini sağlar.
ƒ TreeNode nesnelerinden oluşur.
Bu kontrol, içinde bulunan öğeleri hiyerarşik bir yapıda görüntüler. Her eklenen
öğe bir düğümü temsil eder. Düğümler birleşerek ağaç yapısını oluştururlar.
Düğümler kök ve alt düğüm olarak ikiye ayrılır. Kök düğümler, kontrolün ilk
sırasında yer alır ve aynı seviyededir. Alt düğümler, kök düğümlerin ve diğer alt
düğümlerin altına eklenebilir.
TreeNode nesnesi
TreeView kontrolünde gösterilen öğeler, özelliklerini TreeNode sınıfından alır.
Kök ve alt düğümlerin tümü TreeNode tipindedir. Her düğümün bir Nodes
özelliği vardır. Bu özellik, düğümün, alt düğümlerinin tutulduğu koleksiyondur.
Alt düğümler oluşturulup bu özelliğe eklenebilir.
TreeNode düğümleri oluşturulup, özellikleri atandıktan sonra TreeView
kontrolünde gösterilmesi için, TreeView nesnesinin Nodes koleksiyonuna
eklenmesi gerekir.
TreeNode Özellikleri
Özellik
Değer Tipi
Açıklama
Text
String
Düğümün üstünde gösterilen
yazıyı belirler
59
Konu: 1
Nodes
TreeNodeCollection
Düğümün alt düğümlerini
tutan koleksiyondur
Checked
Boolean
TreeView kontrolünde seçim
kutuları
gösteriliyorsa,
düğümün
işaretli
olup
olmadığını belirler
NextNode
TreeNode
Aynı seviyedeki bir sonraki
düğümü gösterir
PrevNode
TreeNode
Aynı seviyedeki bir önceki
düğümü gösterir
LastNode
TreeNode
Alt
düğümlerinin
sonuncusunu gösterir
FirstNode
TreeNode
Alt düğümlerinin ilkini gösterir
NodeFont
Font
Düğümün yazı tipini belirler
FullPath
String
Düğümün, kökten kendisine
kadar olan tüm düğümlerin
Text özelliklerini sıralar
Parent
TreeNode
Düğümün
ait
en
olduğu
TreeNode nesnesini belirtir
TreeNode Metotları
Metot
Açıklama
Collapse
Düğümün ilk seviyedeki alt
düğümlerini
gizler.
Eksi
işaretine basılması ile aynı
görevi görür.
Expand
Düğümün ilk seviyedeki alt
düğümlerini gösterir. Artı
işaretine basılması ile aynı
görevi görür.
ExpandAll
Düğümün alt düğümlerini son
seviyeye kadar gösterir.
Toggle
Düğümün durumu açıksa
kapalı, kapalıysa açık duruma
getirir
GetNodeCount
Verilen parametre True ise
tüm alt düğümlerin, False ise
sadece
ilk
seviyedeki
düğümlerin sayısını verir.
60
Modül 9: Windows Programlama
TreeView Özellikleri
Özellik
Değer Tipi
Açıklama
CheckBoxes
Boolean
Düğümlerin yanında işaret
kutularının
gösterilmesini
belirler
ImageIndex
Integer
Kontrolün tüm öğeleri için
varsayılan
resmin,
ImageList içindeki indisini
belirler.
Bu
özelliğin
kullanılması için, kontrolün
ImageList
özelliğinin
belirlenmesi gerekir.
SelectedImageIndex
Integer
Öğenin
üzerine
gelip
seçildiğinde
gösterilecek
resmin, ImageList içindeki
indisini belirler
SelectedNode
TreeNode
Seçilen düğümü belirler
TopNode
TreeNode
Kontrolün ilk kök düğümünü
gösterir
ShowLines
Boolean
Düğümler arasında çizgilerin
gözükmesini belirler
ShowPlusMinus
Boolean
Alt
düğümleri
gösterip
gizlemek için kullanılan artı
eksi işaretlerinin gözükmesini
belirler
ShowRootLines
Boolean
Kök düğümlerinin çizgilerinin
ve artı eksi işaretlerinin
gözükmesini belirler
PathSeparator
String
Bir
düğümün
FullPath
özelliğinde
gösterilen
düğümleri ayıran karakterleri
belirler
TreeView kontrolüne kod ile düğüm eklenebildiği gibi, tasarım anında Visual
Studio TreeNode Editor penceresini kullanarak da düğüm eklenebilir.
61
Konu: 1
TreeView Metotları
Metot
Açıklama
CollapseAll
Kontrolün tüm düğümlerini
gizler
ExpandAll
Kontrolün tüm düğümlerini
gösterir
TreeView Olayları
Olay
Açıklama
BeforeSelect
Düğüm
seçilmeden
önce gerçekleşir
AfterSelect
Düğüm
seçildikten
sonra gerçekleşir
BeforeCollapse
Düğüm
kapanmadan
önce gerçekleşir
AfterCollapse
Düğüm
kapandıktan
sonra gerçekleşir
BeforeExpand
Düğüm açılmadan önce
gerçekleşir
AfterExpand
Düğüm açıldıktan sonra
gerçekleşir
62
Modül 9: Windows Programlama
Örnek: Ürün kategorileri, genelde tek kategori olarak ele alınsa da, aslında
hiyerarşik bir yapıda incelenmeleri gerekir. Her kategorinin sonsuz sayıda alt
kategorisi olabilir. Bu tip kategoriler, en iyi şekilde TreeView kontrolü ile
görüntülenebilir.
•
Yeni kategori ekleme işlemi kök düğüm ve alt düğüm olarak yapılabilir.
Eğer RadioButton kontrollerinde kök düğüm seçilmişse ana kategori;
alt düğüm seçilmişse, seçilen kategorinin altına bir alt kategori eklenir.
private void btnYeniKategoriEkle_Click(
System.Object sender, System.EventArgs e ) {
TreeNode secilen;
secilen = TreeView1.SelectedNode;
if ( RadioButton1.Checked ) {
// Kök düğüm eklenir
TreeView1.Nodes.Add( txtYeniKategori.Text );
}
else if ( RadioButton2.Checked ) {
// Seçilen kategoriye alt kategori eklenir
secilen.Nodes.Add( txtYeniKategori.Text );
}
}
•
Seçilen bir kategorinin silinme işlemi için, o düğümün hangi ana
düğüme ait olduğu bulunmalıdır.
private void btnSil_Click( System.Object sender,
System.EventArgs e ) {
TreeNode secilen = TreeView1.SelectedNode;
if ( !( secilen.Parent == null ) ) {
Seçilen düğüm, Parent düğümünün Nodes
// koleksiyonundan çıkartılır.
secilen.Parent.Nodes.Remove( secilen );
}
else {
// Eğer Parent yok ise Kök düğümdür.
TreeView1.Nodes.Remove( secilen );
//
63
Konu: 1
}
}
•
Tüm düğümlerin gösterilmesi ve seçilen düğümün hiyerarşik yapısının
gösterilmesi
private void btnGoster_Click( System.Object sender,
System.EventArgs e ) {
TreeView1.ExpandAll();
}
private void btnKategoriGoster_Click( System.Object
sender, System.EventArgs e ) {
TreeNode secilen = TreeView1.SelectedNode;
MessageBox.Show ( secilen.FullPath,
MsgBoxStyle.OKOnly, "Kategori Yolu" );
}
ListView
ListView
ƒ Öğelerin değişik şekillerde listelenmesini
sağlar.
ƒ ListViewItem nesnelerinden oluşur.
ƒ Her öğe, ListViewSubItem alt öğelerinden
oluşur.
Kullanıcıya değişik listeleme seçenekleri sunan bir kontroldür. İçinde bulunan
öğeler, tek bir nesne olarak veya detayları ile gösterilebilir. Dolayısıyla öğeler
ListViewItem nesnesi, detayları ise ListViewSubItem nesnesi olarak
tanımlanır.
64
Modül 9: Windows Programlama
ListView Özellikleri
Özellik
Değer Tipi
Açıklama
View
View
Listenin görünümünü
belirler.
LargeIcons
değeri listedeki öğelerin
büyük
resimle,
SmallIcons
küçük
resimle
görünmesini
sağlar. List değeri,
öğeleri küçük resimle
fakat
alt
alta
görünmesini
sağlar.
Details değeri, alt
öğelerin kolonlar altında
görüntülendiği
detay
görünümü sağlar.
AllowColumnReorder
Boolean
Detay görünümünde,
kolonların
kullanıcı
tarafından
düzenlenebilmesini
belirler
Activation
ItemActivation
Öğelerin ne zaman
etkinleştirileceğini
belirler.
OneClick
değeri, öğenin tek
tıklamayla, Standard
değeri,
öğenin
çift
tıklamayla aktif hale
geleceğini
belirler.
TwoClick değeri seçili
iken, ilk tıklandığında
öğe seçilir, daha sonra
ikinci defa tıklandığında
ise öğe aktif hale gelir.
CheckBoxes
Boolean
Öğelerin
yanında
seçme
kutularının
bulunmasını belirler
Columns
ColumnHeaderCollection
Detay
görünümünde
iken,
öğelerin
alt
öğelerinin gösterileceği
kolonları
tutan
koleksiyondur
FullRowSelect
Boolean
Detay
görünümde,
65
Konu: 1
öğenin
satırının
belirler
tüm
detay
seçilmesini
GridLines
Boolean
Kolonlar
arasında
çizgilerin
belirler
LabelEdit
Boolead
Çalışma
anında,
kullanıcın,
liste
öğelerinin
yazısını
değiştirmesini belirler.
Bu özelliğin kullanılması
için,
Activation
özelliği
Standard
olması gerekir.
ve
satırlar
ayırıcı
gözükmesini
ListView Olayları
Olay
Açıklama
AfterLabelEdit
Öğenin
değiştikten
gerçekleşir
yazısı
sonra
BeforeLabelEdit
Öğenin
değişmeden
gerçekleşir
yazısı
önce
Örnek: Windows Explorer ile dosya görünümleri ListView ile gerçekleştirilir.
•
Form yüklenirken ListView kontrolüne kolon ve öğeler eklenir. Ayrıca
ComboBox kontrolüne görünüm seçenekleri eklenir.
private
void
System.EventArgs e ) {
Form1_Load(
System.Object
sender,
66
Modül 9: Windows Programlama
ComboBox1.Items.Add( "Detay" );
ComboBox1.Items.Add( "Büyük Simgeler" );
ComboBox1.Items.Add( "Küçük Simgeler" );
ComboBox1.Items.Add( "Liste" );
ComboBox1.DropDownStyle
ComboBoxStyle.DropDownList;
ListView1.Columns.Add(
HorizontalAlignment.Left );
ListView1.Columns.Add(
HorizontalAlignment.Left );
ListView1.Columns.Add(
HorizontalAlignment.Left );
"Ad",
=
100,
"Boyut",
"Tür",
50,
170,
ListView1.View = View.Details;
ListViewItem oge = new ListViewItem( "bin" );
oge.SubItems.Add( "" );
oge.SubItems.Add( "Dosya Klasör" );
oge.ImageIndex = 0;
ListView1.Items.Add( oge );
oge = new ListViewItem( "Form1.vb" );
oge.SubItems.Add( "11 KB" );
oge.SubItems.Add( "Visual C# Source" );
oge.ImageIndex = 2;
ListView1.Items.Add( oge );
oge
=
new
"WindowsApplication1.sln" );
oge.SubItems.Add( "1 KB" );
oge.SubItems.Add(
"Microsoft
Solution Object" );
oge.ImageIndex = 1;
ListView1.Items.Add( oge );
}
ListViewItem(
Visual
Studio
ComboBox kontrolünde seçilen değer değiştiği zaman, ListView görünümü
değişir.
private void ComboBox1_SelectedIndexChanged(
System.Object sender, System.EventArgs e ) {
switch ( ComboBox1.SelectedIndex ) {
case 0:
ListView1.View = View.Details;
break;
case 1:
ListView1.View = View.LargeIcon;
break;
case 2:
ListView1.View = View.SmallIcon;
break;
case 3:
ListView1.View = View.List;
break;
}
67
Konu: 1
}
Dinamik Kontroller
s
Dinamik Kontroller
ƒ Çalışma anında oluşturulup forma eklenir.
ƒ AddHandler ile kontrolün olaylarına erişilir.
Void Yordam1()
{
Button b = new Button();
b.Click += new EventHandler(ButonaBasildi);
}
Private Void ButonaBasildi(Object sender ,EventArgs e)
{
}
Kontroller tasarım anında eklenip ayarlanabildiği gibi, çalışma anında da
oluşturulup forma eklenebilir. Kontrollerin, Properties panelinde gözüken tüm
özelliklere kod tarafında ulaşılabildiği için çalışma anında önceden
oluşturulmuş bir kontrolün özelliği değiştirilebilir. Bununla birlikte, yeni bir form
oluşturup gösterme işlemi gibi, çalışma anında yeni bir kontrol oluşturup,
özellikleri atanıp form üzerinde gösterilebilir.
Yeni eklenen kontrollerin olaylarına erişmek için EventHandler nesnesi
kullanılır. Olay gerçekleştiği zaman çalıştırılacak kodların bulunduğu yordam
ise EventHandler nesnesi oluşturulurken, parametre olarak geçilmelidir.
button1.Click+=new EventHandler(button1_Click);
Bu şekilde tanımlanan yordamların, kontrolün olay tanımlayıcısı ile aynı
parametrelere sahip olmalıdır.
private void button1_Click(object sender, EventArgs e)
{
}
68
Modül 9: Windows Programlama
Örnek: Form üzerinde sürekli düğme eklenen ve düğmelerin, basıldığı zaman
yok edildiği bir oyun yazılması için, bu düğmelerin dinamik bir şekilde
oluşturulması gerekir.
•
Form üzerindeki bir Timer kontrolü, iki saniyede bir düğme oluşturup
forma ekler.
private void Timer1_Tick( System.Object sender,
System.EventArgs e ) {
// Yeni bir düğme oluşturulur.
Button b = new Button();
b.Height = 30;
b.Width = 30;
b.Text = "X";
int maxLocation_Y, maxLocation_X;
// Yeni düğmenin yeri form dışında bir yerde olamaz
maxLocation_X = this.Width - b.Width;
maxLocation_Y = this.Height - b.Height;
Random r = new Random();
// Düğmenin bulunacağı yer rasgele ayarlanır.
b.Location = new Point( r.Next( maxLocation_X
), r.Next( maxLocation_Y ) );
b.Click +=new EventHandler(ButonaBasildi );
// Oluşturulan kontrol, Formun kontroller
// listesine eklenmelidir.
this.Controls.Add( b );
}
•
Oluşturulan kontrollere tıklandığı zaman çalıştırılacak yordam yazılır.
69
Konu: 1
private void ButonaBasildi( System.Object sender,
System.EventArgs e ) {
// Kontrolün, üzerine basıldığı zaman yok edilmesi
sender.Dispose();
}
•
Form yüklendiği zaman Timer nesnesi çalışmaya başlar
private void Form1_Load( System.Object sender,
System.EventArgs e ) {
Timer1.Interval = 500;
Timer1.Start();
}
Lab 1: Internet Tarayıcısı
Bu labda, Windows altında bulunan Microsoft Web Tarayıcısı kontrolünü
projeye ekleyerek Internet tarayıcısı gerçekleştirilir.
Bu labda kullanılan kontroller ve teknikler:
•
LinkLabel – Ana sayfaya bağlantı sağlar.
•
RadioButton – Bağlantıların yeni ya da aynı pencerede açılması
seçeneğini sunar.
•
GroupBox – RadioButton kontrollerini gruplamak için kullanılır.
•
TabControl – Tarayıcıların farklı pencerelerde gözükmesini sağlar.
•
Microsoft Web Tarayıcısı – Internet sitelerini görüntülenmesini sağlar.
•
Dispose Metodu – TabPage sayfalarının silinmesi için kullanılır.
•
foreach – Sayfaların tümünün kapanması için kullanılır.
•
Dinamik Kontroller – Bağlantılar yeni bir sayfada açıldığı zaman, yeni
bir TabPage oluşturulur. Bu sayfanın içine yeni bir tarayıcı kontrolü
oluşturulup eklenir. Daha sonra bu sayfa TabControl nesnesine
eklenir.
Kontrollerin eklenmesi
Yeni bir Windows projesi açın ve ToolBox paneline Microsoft Web Tarayıcını
ekleyin.
Not: ToolBox paneline kontrol ekleme işlemleri için Modül 3 e bakın
70
Modül 9: Windows Programlama
Form üzerine tablodaki kontrolleri ekleyin belirtilen özelliklerini ayarlayın.
Kontrol – Kontrol İsmi
Özellik
Değer
TextBox – txtAdres
Text
http://
RadioButton - rbAyniSayfa
Checked
True
RadioButton - rbYeniSayfa
GroupBox – GroupBox1
Text
LinkLabel – LinkLabel1
Text
Ana Sayfa
Button – btnSayfaKapat
Text
Sayfayı Kapat
Button – btnTumunuKapat
Text
Tüm Sayfaları Kapat
TabControl – TabControl1
TabPages
Yeni bir sayfa ekleyin
Dock
Bottom
TabPage – TabPage1
Text
Sayfa 1
Tarayıcı – AxWebBrowser1
Dock
Fill
71
Konu: 1
Kodların yazılması
1. Form yüklenirken LinkLabel kontrolünün göstereceği bağlantıyı ve
formun AcceptButton özelliğini ayarlayın.
private void Form1_Load( System.Object sender,
System.EventArgs e ) {
LinkLabel1.Links.Add( 0, 9,
"http://www.bilgeadam.com" );
this.AcceptButton = btnGit;
}
2. Yazılan Internet adresine gitmek için kullanıcı, aynı sayfayı veya yeni
açılacak bir sayfayı kullanabilir. Seçilen duruma göre aynı sayfada ya da
farklı sayfada Internet sitesini görüntüleyen kodları yazın.
private void btnGit_Click( System.Object sender,
System.EventArgs e ) {
// Girilen bağlantının başında http ifadesi
// bulunmuyorsa bu ifade eklenir
if ( !( txtAdres.Text.StartsWith( "http://" ) )
) {
txtAdres.Text = txtAdres.Text.Insert( 0,
"http://" );
}
// TabControl nesnesinde sayfa yoksa ya da Yeni Sayfa
// seçeneği seçilmişse, adres yeni sayfada gösterilir.
if ( rbYeniSayfa.Checked ||
TabControl1.TabPages.Count == 0 ) {
72
Modül 9: Windows Programlama
YeniSayfa( txtAdres.Text );
}
else {
AyniSayfa( txtAdres.Text );
}
public void YeniSayfa( string link ) {
// Dinamik kontroller oluşturulur.
TabPage sayfa = new TabPage( link );
AxSHDocVw.AxWebBrowser tarayici = new
AxSHDocVw.AxWebBrowser();
tarayici.Dock = DockStyle.Fill;
// Tarayıcı TabPage kontrolüne eklenir
sayfa.Controls.Add( tarayici );
// Oluşturulan sayfa TabControl nesnesine eklenir.
TabControl1.TabPages.Add(sayfa);
// Yeni açılan sayfa seçili olarak gösterilir
TabControl1.SelectedTab = sayfa;
// Tarayıcı, verilen bağlantıyı görüntüler
tarayici.Navigate(link);
}
public void AyniSayfa( string link ) {
// Internet sitesi, seçilen sayfada gösterilir.
TabPage sayfa = null;
sayfa = TabControl1.SelectedTab;
AxSHDocVw.AxWebBrowser tarayici = null;
// Tarayıcı, sayfanın kontrolleri içinde bulunur.
// Sayfada başka kontrol bulunmadığı için, ilk
// kontrol tarayıcıdır.
tarayici = ( ( AxSHDocVw.AxWebBrowser )(
sayfa.Controls[ 0 ] ) );
sayfa.Text = link;
tarayici.Navigate( link );
}
3. Ana sayfa bağlantısına tıklandığı zaman, BilgeAdam internet sitesinin yeni
bir sayfada açılmasını sağlayan kodları yazın.
private void LinkLabel1_LinkClicked( System.Object
sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e
) {
YeniSayfa( System.Convert.ToString(
e.Link.LinkData ) );
}
4. Seçilen sayfayı ve tüm sayfaları kapatan kodları yazın.
private void btnSayfaKapat_Click( System.Object
sender, System.EventArgs e ) {
TabPage sayfa = null;
sayfa = TabControl1.SelectedTab;
if ( !( sayfa == null ) ) {
73
Konu: 1
sayfa.Dispose();
}
}
private void btnTumunuKapat_Click( System.Object
sender, System.EventArgs e ) {
foreach ( System.Windows.Forms.TabPage sayfa in
TabControl1.TabPages ) {
sayfa.Dispose();
}
}
Lab 2: 4 Haneli Sayı Bulma Oyunu
Bu labda, MasterMind oyunundan uyarlanmış 4 haneli sayı bulma oyunu
programlanır. Oyunun işleyişi rakamları farklı ya da aynı olarak tutulan 4 haneli
sayının tahmin edilmesidir. Tahmin edilen sayıyla ilgili ipucular verilir. Yerini
tutan rakamlar için + ile, rakamları tutmayan ancak sayı içinde geçen rakamlar
– ile belirtilir.
Örnek:
Tutulan sayı: 1980
Tahmin 1: 4952
İpucu: +1 (Sadece 9 rakamı yerini tuttu)
Tahmin 2: 9820
İpucu: +1 -2 (0 yerini tuttu, 9 ve 8 bulundu ancak yeri tutturulamadı)
Bu labda kullanılan kontroller ve teknikler:
•
ListBox – Yapılan tahminleri tutmayı sağlar
•
DomainUpDown – Oyunun zorluk derecesinin seçilmesini sağlar
•
ErrorProvider – Kullanıcının, tahminleri düzgün formatta girip
girmediğini kontrol eder.
•
İç
İçe
Döngüler – Farklı rakamları olan sayılar üretmek ve
tahminleri kontrol etmek için kullanılır.
Kontrollerin eklenmesi
Form üzerine tablodaki kontrolleri ekleyin belirtilen özelliklerini ayarlayın.
Kontrol – Kontrol İsmi
Özellik
Değer
Items
Farklı Sayılar
Tekrarlı Sayılar
TextBox – txtTahmin
ListBox – ListBox1
DomainUpDown – DomainUpDown1
74
Modül 9: Windows Programlama
Text
Zorluk Seçin
Button – btnTahminEt
Text
Tahmin Et
Button – btnYeniOyun
Text
Yeni Oyun
Label – lblMesaj
Kodların Yazılması
Sistem tarafından tutulacak sayılar, DomainUpDown kontrolünde yapılan seçime
göre farklı ya da aynı rakamlara sahip olacaktır.
private int BulunacakSayi;
public int SayiUret() {
int sayi = DortHaneliSayi();
// Sayıdaki rakamlar tekrar edilebilirse
if ( DomainUpDown1.SelectedIndex == 1 ) {
return sayi;
}
// Sayının rakamları birbirinden farklı
// olana kadar sayı üretilir
while ( !( SayiKontrol( sayi ) ) ) {
sayi = DortHaneliSayi();
}
return sayi;
}
•
Rakamları birbirinden farklı dört haneli sayı üretir.
public int DortHaneliSayi() {
Random r = new Random();
int sayi = r.Next(10000);
// Sayı 4 haneli olana kadar tekrar üretilir
while ( sayi < 1000 ) {
75
Konu: 1
sayi = r.Next(10000);
}
return sayi;
}
•
Sayının rakamlarının birbirinden farklı olmasını kontrol eder.
public bool SayiKontrol( int sayi ) {
char[] rakamlar =
sayi.ToString().ToCharArray();
//
edilir
Rakamlar tek tek bir birleriyle kontrol
// Tekrarlanan rakam varsa False döner
for (int i=0; i<=rakamlar.Length - 2; i++ ) {
for (int j=i + 1; j<=rakamlar.Length - 1;
j++ ) {
if ( rakamlar[ i ] == rakamlar[ j ] ) {
return false;
}
}
}
return true;
}
•
Yeni oyun düğmesine tıklandığı zaman sayı üretilir ve oyun başlar
private
void
btnYeniOyun_Click(
System.Object
sender, System.EventArgs e ) {
BulunacakSayi = SayiUret();
lblMesaj.Text = "Yeni Oyun! Sayı üretildi...";
}
•
Metin kutusunun Validating olayında, girilen değerler kontrol edilir.
private void txtTahmin_Validating( object sender,
System.ComponentModel.CancelEventArgs e ) {
if ( txtTahmin.Text.Length == 4 ) {
ErrorProvider1.SetError( txtTahmin, "" );
}
else {
ErrorProvider1.SetError(
txtTahmin,
"Sayı
yanlış girildi" );
e.Cancel = true;
}
}
•
Tahmin edilen sayının hangi rakamlarının tutuğu kontrol edilir
public string TahminKontrol( int sayi ) {
string sonuc ="";
// Sonuç kümesindeki artı ve eksi sayısı
byte arti = 0;
byte eksi = 0;
byte i, j;
char[] sdizi;
sdizi = sayi.ToString().ToCharArray();
76
Modül 9: Windows Programlama
char[] sBulunacak;
sBulunacak =
BulunacakSayi.ToString().ToCharArray();
// Yerleri tutan sayılar bulunur
for ( i=0; i<=3; i++ ) {
if ( sdizi[ i ] == sBulunacak[ i ] ) {
arti += 1;
}
}
// Yerleri tutmayan sayıların kontrol
for ( i=0; i<=3; i++ ) {
for ( j=0; j<=3; j++ ) {
if ( i != j ) {
if ( sdizi[ i ] == sBulunacak[ j ] )
{
eksi += 1;
break;
}
}
}
}
if ( arti
sonuc
}
else if (
sonuc
}
else if (
sonuc
}
else if (
sonuc
}
== 0 & eksi == 0 ) {
= "0";
arti == 4 ) {
= "Tebrikler!";
arti != 0 && eksi != 0 ) {
= "+" + arti + " -" + eksi;
arti == 0 ) {
= "-" + eksi;
return sonuc;
}
private void btnTahmin_Click( System.Object sender,
System.EventArgs e ) {
ListBox1.Items.Add(
TahminKontrol(
int.Parse(txtTahmin.Text ) ) );
}
Lab 3: Hafıza Oyunu
Hafıza oyunu, belli sayıda kart içinden aynı resme sahip olanların bulunması
ile gerçekleştirilir. Bu labda, form üzerine, seçilen seviye kadar kart ekleme
işlemi yapılır. Kontroller çalışma anında ekleneceği için dinamik olarak
oluşturulmalıdır.
Bu labda kullanılan kontroller ve teknikler:
•
ComboBox –Seviyenin seçilmesi için kullanılır
•
ImageList – Eklenen kartların resimlerini tutar
77
Konu: 1
•
Dinamik kontroller – Kullanıcının seçtiği seviye kadar kart ekleme
işlemi için kullanılır.
•
Tag – Kontrollerin Tag özelliği, o kontrole ait bilgi tutmak için kullanılır.
Bu labda, yeni eklenen kartların hangi resmi taşıyacağı kontrolü Tag
özelliğinde tutulur.
Kontrollerin eklenmesi
Form üzerine tablodaki kontrolleri ekleyin belirtilen özelliklerini ayarlayın.
Kontrol – Kontrol İsmi
Özellik
Değer
ComboBox– ComboBox1
Items
4 Kart
8 Kart
16 Kart
ImageList – ImageList1
Images
8 tane resim ekleyin
Kodların Yazılması
1. ComboBox kontrolünden seviye seçildiği zaman, form üzerinde var olan
tüm düğmelerin silinip, seçilen seviye kadar düğme eklenmesi gerekir. Bu
işlem oyunu baştan başlatır.
public void KartYerlestir( int kartSayisi ) {
DugmeleriSil();
int x = 10;
int y = 50;
78
Modül 9: Windows Programlama
özellikleri
for (int i=1; i<=kartSayisi; i++ ) {
// Dinamik bir düğme oluşturulur ve
// ayarlanır
Button kart = new Button();
kart.Height = 30;
kart.Width = 30;
kart.Location = new Point( x, y );
kart.Click += new System.EventHandler(
ButonaTiklandi );
this.Controls.Add( kart );
//
//
olacaktır
Bir sonraki eklenecek olan düğme
ilk kontrolün 70 piksel sağında
x += 70;
//
gerekir.
Düğme Form sınırları içinde olması
if ( x > this.Width ) {
x = 10;
y += 50;
}
}
KartResimYukle();
}
2. Düğmeleri silme işlemi, form üzerindeki tüm düğmelerin bir listeye atılıp
daha sonra formun kontrollerinden kaldırılarak yapılır.
public void DugmeleriSil() {
ArrayList silinecek = new ArrayList();
//
tutulur
Form iindeki Button kontrolleri bir listede
foreach ( System.Windows.Forms.Control c in
this.Controls ) {
if ( c is Button ) {
silinecek.Add( c );
}
}
for (int i=0; i<=silinecek.Count - 1; i++ ) {
this.Controls.Remove( (Control)silinecek[ i
] );
}
}
3. Kartlara resim yüklerken, her resim iki karta yüklenmesi gerekir.
public void KartResimYukle() {
// Düğmeler bir listeye alnr.
ArrayList dugmeler = new ArrayList();
foreach ( System.Windows.Forms.Control c in
this.Controls ) {
if ( c is Button ) {
dugmeler.Add( c );
}
79
Konu: 1
}
Random r = new Random();
int i = 0;
//
da
Kartlar ikişer ikişer ele alınır. İki karta
// aynı resim atanır. Ve bu iki kart düğmeler
// listesinden çıkartılır.
while ( dugmeler.Count > 0 ) {
Button kart1 = null, kart2 = null;
kart1 = (Button)dugmeler[ r.Next(
dugmeler.Count - 1 ) ];
kart1.Tag = i;
dugmeler.Remove( kart1 );
kart2 = (Button)dugmeler[ r.Next(
dugmeler.Count - 1 ) ];
kart2.Tag = i;
dugmeler.Remove( kart2 );
i += 1;
}
}
4. Eklenen kartlara tıklandığı zaman, ilk seferde bir kart açılır ve resmi
gösterilir. İkinci kart açıldığı zaman bu iki kartın resmi aynıysa kart formdan
kaldırılır.
private Button AcikKart;
private bool acik = false;
private void ButonaTiklandi( object sender,
EventArgs e ) {
Button kart = (Button)sender;
// Eğer ilk kart açılıyorsa
if ( !( acik ) ) {
// Kart görüntüle
kart.BackgroundImage = ImageList1.Images[
int.Parse(kart.Tag.ToString()) ];
AcikKart = kart;
acik = true;
// Eğer ikinci kart açılıyorsa
}
else {
// Açılmış kartın resmi, yeni alan kartn
// resmi ile ayınıysa, bu kartlar silinir
if ( kart.Tag == AcikKart.Tag ) {
this.Controls.Remove( kart );
this.Controls.Remove( AcikKart );
}
else {
AcikKart.BackgroundImage = null;
}
acik = false;
}
}
80
Modül 9: Windows Programlama
Lab 4: Hesap Makinesi
Bu labda, bir hesap makinesinde kullanılan genel fonksiyonlar gerçekleştirilir.
Bu labda kullanılan kontroller ve teknikler:
•
Button – Hesap makinesindeki her işlem ve sayı için bir düğme
kullanılır
•
Try Catch Finally – Hesaplamalar yapılırken, kullanıcın yanlış bir
değer girmesi durumunda çıkacak hataları yakalamak için kullanılır.
Kontrollerin eklenmesi
Form üzerine tablodaki kontrolleri ekleyin belirtilen özelliklerini ayarlayın.
Kontrol – Kontrol İsmi
Özellik
Değer
Button– 0 – 9 arası her sayı için
Text
Temsil ettikleri sayılar
Text
Temsil ettikleri işlemler. *
+/-=C
Button(Sayi) isminde bir düğme
ekleyin. Örnek: 5 sayısı için
Button5
Button – Her işlem için bir düğme
ekleyin: Çarpma, bölme, toplama
çıkarma, eşitlik, temizleme
81
Konu: 1
Kodların Yazılması
1. İşlemin türünü ve seçildiğini belirleyen, girilen bir önceki sayıyı tutan global
değişkenleri yazın.
private bool IslemSecildi = false;
private double Sayi;
private string Islem;
2. Sayı düğmelerinden herhangi birine basıldığı zaman, metin kutusunun
görünümünü değiştiren işlemi yazın.
private void Button1_Click( System.Object sender,
System.EventArgs e ) {
if ( !( IslemSecildi ) ) {
txtSayi.Text += ((Button)sender).Text;
}
else {
txtSayi.Text = ((Button)sender).Text;
IslemSecildi = false;
}
}
3. İşlem seçildiği zaman, bir önceki girilen sayıyı tutan kodları yazın.
private void btnCarp_Click( System.Object sender,
System.EventArgs e ) {
Islem = ((Button)sender).Text;
try {
Sayi = double.Parse(txtSayi.Text);
IslemSecildi = true;
}
catch ( Exception ex ) {
MessageBox.Show( "Sayı düzgün formatta
girilmedi);
}
finally {
txtSayi.Text = "";
txtSayi.Focus();
}
}
4. Eşittir düğmesine basıldığı zaman aritmetik operasyonu yapan kodları
yazın.
private void
System.EventArgs e )
switch (
case
btnEsit_Click( System.Object sender,
{
Islem ) {
"*":
Sayi *= double.Parse(txtSayi.Text);
break;
case "/":
Sayi /= double.Parse(txtSayi.Text);
break;
case "-":
Sayi -= double.Parse(txtSayi.Text);
break;
82
Modül 9: Windows Programlama
case "+":
Sayi += double.Parse(txtSayi.Text);
break;
}
txtSayi.Text = Sayi.ToString();
}
5. C (temizle) tuşuna basıldığı zaman, metin kutusunu temizleyen ve global
değişkenleri başlangıç değerlerine getiren kodları yazın.
private void btnTemizle_Click( System.Object sender,
System.EventArgs e ) {
Sayi = 0;
IslemSecildi = false;
txtSayi.Text = "";
txtSayi.Focus();
}
Modül Sonu Soruları & Alıştırmalar
Özet
 Listeleme Kontrolleri
 ListBox, TreeView, ComboBox
 Resim Kontrolleri
 PictureBox, ImageList
 Düzenleme Kontrolleri
 TabControl, Panel, HScrollBar, VScrollBar
 Zaman ve Tarih Kontrolleri
 DateTimePicker, MonthCalendar
 Dinamik Kontroller
 Çalışma anında eklenen kontroller
1. Formun kapanmasını şeffaflığını yavaşça azaltarak sağlamak için, formun
hangi olay, özellik ve metotlarından faydalanır? Uygulamasını yazın.
2. Fiziksel olarak bulundukları yerlerin bir dizide tutulduğu resimlerin, slayt
gösterisi şeklinde gösterilmesi hangi kontroller ile sağlanır? Uygulamasını
yazın.
Konu: 1
83
3. Kurumsal bir şirketin elemanlarının bağlı oldukları departmanları ve
müdürleri hiyerarşik olarak hangi kontrol ile gösterilebilir? Her müdür ve
departman başka bir müdür ve departmana bağlıdır. Uygulamasını
structure yapısını kullanarak ve ilgili kontroller ile birlikte yazın.
4. Microsoft Excel ile oluşturulan sayfalar, aynı pencerede tutulur. Bir
Windows uygulamasında sınırsız sayıda sayfanın aynı form üzerinde
tutmayı hangi kontrol sağlar? Bu sayfalar çalışma anında oluşturulmak
istenirse, kontrolün hangi özelliklerinden faydalanılır.
Modül 10: Menü Tasarımı ve MDI Formlar
Hedefler
 Menüler
ÂMainMenu, ContextMenu
Â
Â
Â
Â
Â
ToolBar
ToolTip
StatusBar
NotifyIcon
RichTextBox
Konu 1: Menü Tasarımı
Windows uygulamalarında en çok kullanılan tasarım araçları menülerdir.
Dosya, düzen, görünüm gibi menüler neredeyse tüm Windows
uygulamalarında, belli başlı işlerin yapılmasında kullanıcıya kolay erişim sağlar.
Uygulamalarda, menülerde tanımlanan işlemlere görsel kısa yollar sunulur. Bu
işlem araç kutuları ile sağlanır.
Bu bölüm tamamlandıktan sonra:
•
MainMenu, ContextMenu kontrolleri ile menü tanımı yapabilecek,
•
ToolBar kontrolü ile tasarımda araç çubuklarını kullanabilecek,
•
ToolTip kontrolü ile menü araçlarının kullanımı hakkında bilgi
sağlayacak,
•
StatusBar, NotifyIcon kontrolleri ile uygulamaların tasarımını
zenginleştireceksiniz.
Menüler
Windows uygulamalarında kullanılan iki tip menü vardır. MainMenu, formların
başında duran sabit menüdür. ContextMenu, fare ile sağ tıklandığında çıkan
menüdür.
2
Modül 1: Programlamaya Giriş
MainMenu
MainMenu
ƒ Formların başında duran menüdür.
ƒ MenuItem nesnelerinden oluşur.
ƒ Menü öğelerine kısa yollar atanabilir.
Windows uygulamasına bir menü eklemek için, Toolbox panelinden bir
MainMenu kontrolünü forma sürükleyin. Eklenen menü bir bileşen olarak
formun alt bölümünde gözükecektir. Ancak üstüne gelindiğinde formun
başlığının hemen altında belirir. Menü öğesi eklemek veya ismini değiştirmek
için üstüne gelinir ve başlık yazısı yazılır. Properties panelinde bu menünün
MenuItem olarak eklendiği görülür.
Menüye MenuItem eklendiğinde hemen altında ve yanında, menü eklemek için
bir yer açılır. Bu açılan yere de menü ismi girip, alt menü öğeleri oluşturulabilir.
Menü öğelerine basıldığı zaman bir işlemin gerçekleşmesi için, kontrole çift
tıklanarak bu öğenin Click olayına geçilir. Çalıştırılmak istenen kodlar buraya
yazılır.
3
Konu: 1
private void menuYeni_Click(System.Object sender,
System.EventArgs e) {
}
Menü öğelerine isim verirken & işareti kullanılarak, kullanıcın klavyenin ALT
tuşuyla bu öğeyi çalıştırmasını sağlanabilir. & işareti hangi karakter ile
kullanılırsa, kısa yol olarak o karakter kullanılır.
MenuItem özellikleri
Özellik
Değer Tipi
Açıklama
Checked
Booleand
Menü öğesinin yanında
seçili olduğuna dair bir
işaretin
gözükmesini
sağlar
Enabled
Boolean
Menü öğesinin
durumda
olmadığını belirler
RadioCheck
Boolean
Öğenin seçilme stilinin
RadioButton düğmesi
olarak
gözükmesini
sağlar.
ShortCut
ShortCut
Menüye ulaşım için bir
kısa yol tanımlar.
ShowShortCut
Boolean
Menünün kısa yolunun,
isminin
yanında
gözükmesini belirler
MenuItems
MenuItemCollection
Alt menülerin tutulduğu
koleksiyondur.
Örnek:
private void Form1_Load( System.Object sender,
System.EventArgs e ) {
MenuItem dosya = new MenuItem( "D&osya" );
aktif
olup
4
Modül 1: Programlamaya Giriş
// Yeni işleminin yapılması için bir menü eklenir.
MenuItem yeni = new MenuItem( "&Yeni" );
yeni.Shortcut = Shortcut.CtrlN;
yeni.ShowShortcut = true;
yeni.Select += new System.EventHandler(
YeniClick );
dosya.MenuItems.Add( yeni );
// Açma işleminin yapılması için bir menü eklenir.
MenuItem ac = new MenuItem( "&Aç" );
ac.Shortcut = Shortcut.CtrlO;
ac.ShowShortcut = false;
ac.Select += new System.EventHandler( AcClick );
dosya.MenuItems.Add( ac );
MainMenu1.MenuItems.Add( dosya );
}
private void AcClick( System.Object sender,
System.EventArgs e ) {
}
private void YeniClick( System.Object sender,
System.EventArgs e ) {
}
5
Konu: 1
ContextMenu
ContextMenu
ƒ Kontrollerin ContextMenu özelliğine
atanır.
ƒ Kontrollere sağ tıklandığı zaman çıkan
menüdür.
ContextMenu, bir kontrolün üstüne sağ tıklandığı zaman çıkan menüdür. Bu
menü uygulamaya eklendiği zaman Properties panelinde, kontrollerin
ContextMenu özelliği olarak bu menü atanabilir.
6
Modül 1: Programlamaya Giriş
ToolBar
ToolBar
ƒ Menülerin işlevlerine görsel kısa yollar
sunar.
ƒ ToolBarButton nesnelerinden oluşur.
ƒ ImageList kontrolü ile kullanılır.
ƒ Hangi düğmeye basıldığı ButtonClick olayı
ile anlaşılır.
ToolBar kontrolü menülerin altında kullanıcıya kısa yollar, kullanım kolaylığı
sunan bir kontroldür. Kontroldeki öğeler çoğu zaman ImageList kontrolünün
sağladığı resimler ile gösterilir. Resim yerine yazı da gösterilebilir ancak yazı ile
işlem listelemek menüler ile sağlanır.
ToolBar kontrolünde yapılacak işlemler bir ToolBarButton olarak gösterilir.
ToolBar Özellikleri
Özellik
Değer Tipi
Açıklama
7
Konu: 1
Buttons
ToolBarButtonCollection
Kontrolün
düğmelerinin
tutulduğu koleksiyon
ButtonSize
Size
Kontroldeki
düğmelerin boyutunu
belirler.
Düğmelerin
boyutları ayrı ayrı
belirlenemez.
DropDownArrows
Boolean
Stili DropDownButton
olarak
seçilmiş
ToolBarButton
düğmelerinin
alt
menüsünün
görünmesini belirler
ToolBar kontrolüne ToolBarButton düğmeleri eklemek için kontrolün
Buttons özelliğinde faydalanılır. Tasarım anında Properties panelinden
Buttons özelliğine basıldığı zaman çıkan pencerede, kontrole düğme eklenir.
ToolBarButton özellikleri
Özellik
Değer Tipi
Açıklama
Style
ToolBarButtonStyle
Düğmenin görünüm stilini
belirler. PushButton değeri
standart
bir
düğmeyi,
ToggleButton
basıldığı
zaman basılı kalan bir
düğmeyi,
Separator
değeri düğmeler arasında
8
Modül 1: Programlamaya Giriş
bir
eder.
DropDownButton
değeri
düğmenin yanında bir
menünün
açılacağını
belirler.
DropDownMenu
Menu
ayracı
temsil
Kontrolün
stili
olarak
seçilmişse,
yanında
çıkacak menüyü belirler. Bu
menü
sadece
ContextMenu
cinsinden
olabilir.
DropDownButton
Pushed
Boolean
Düğmenin
basılı
olmadığını belirler
Text
String
Düğmenin üzerinde yazan
yazıyı belirler
ImageIndex
Integer
kontrolüne bir
bağlanmışsa,
bu özellik düğmenin hangi
resmi göstereceğini belirler.
olup
ToolBar
ImageList
ToolTipText
String
Düğmenin
durulduğu
gösterilecek
belirler.
üzerinde
zaman
ipucunu
Düğmelere tıklandığı zaman çalışması istenen kodlar, ToolBar kontrolünün
ButtonClick olayına yazılır. Ancak burada hangi düğmeye basıldığı kod
yazarak bulunması gerekir.
private void ToolBar1_ButtonClick( System.Object
sender, System.Windows.Forms.ToolBarButtonClickEventArgs e )
{
switch ( ToolBar1.Buttons.IndexOf( e.Button ) )
{
// Ayraçlar da bir ToolBarButton olduğu için
// indisler kontrol edilirken buna dikkat
edilmelidir
case 0:
// Kopyala
9
Konu: 1
case 1:
// Kes
case 2:
// Yapıştır
case 4:
// Geri Al
case 6:
// Yardım
break;
}
}
ToolTip
ToolTip
ƒ Kontrollerin üzerine gelindiğinde bilgi
mesajı verir.
ƒ Mesaj, kontrollerin “ToolTip on ToolTip1”
özelliğine yazılır.
Bu kontrol, form üzerindeki kontrollerin üzerine gelindiği zaman ipucu
göstermek için kullanılır. ToolTip forma eklendiği zaman, kontrollerin
özelliklerinde ToolTip on [ToolTip kontrolünün ismi] şeklinde bir özellik
belirir. Bu özelliğe verilen yazılar, çalışma anında kontrollerin ipucunu belirler.
ToolTip Özellikleri
Özellik
Değer Tipi
Açıklama
Active
Boolean
Kontrolün aktif olup
olmadığını
belirler.
False değerini alırsa,
form üzerinde ipucular
görüntülenmez.
AutomaticDelay
Integer
AutoPopDelay,
10
Modül 1: Programlamaya Giriş
InitialDelay,
ReshowDelay değerleri
için otomatik süreleri
ayarlar.
AutoPopDelay
Integer
İpucunun
görüntülenme süresini
belirler.
InitialDelay
Integer
İpucunun gözükmesi
için, fare imlecinin
kontrol
üzerinde
durması gereken süreyi
belirler
ReshowDelay
Integer
Yeni
bir
kontrolün
üzerine
gelindiği
zaman, bu kontrole ait
ipucunun gösterilmesi
için gereken süreyi
belirler.
ShowAlways
Boolean
Seçilen kontrol aktif
olmadığı zamanlarda
dahi
ipucunun
gösterilmesini sağlar.
11
Konu: 1
StatusBar
StatusBar
ƒ Windows formlarının durum çubuğudur.
ƒ ShowPanels birden fazla panelin
gözükmesini sağlar.
ƒ Paneller birden fazla durum mesajı
gösterilmek için kullanılır.
Windows uygulamalarında formların altında bulunan durum çubuğunu temsil
eder. Durum çubuklarında sadece bir yazının görüntülenebildiği gibi, içindeki
paneller ile birden fazla durum yazısı görüntülenebilir.
StatusBar Özellikleri
Özellik
Değer Tipi
Açıklama
Panels
StatusBarPanelCollection
Kontrolün içinde birden
fazla yazı görüntülemek
için kullanılan panelleri
tutar.
ShowPanels
Boolean
Birden fazla panelin
gözükmesini belirler.
SizingGrip
Boolean
StatusBar kontrolünün
yanında,
formun
boyutunu değiştirmek
için kullanılan simgenin
gözükmesini belirler
Text
String
üzerinde
yazan yazıyı belirler.
Eğer
ShowPanels
özelliği True ise, bu
özellikte yazılan yazı
StatusBar
12
Modül 1: Programlamaya Giriş
gözükmez.
StatusBar kontrolüne panel eklemek için kontrolün Panels özelliğinden
yararlanılır.
Panel özellikleri
Özellik
Değer Tipi
Açıklama
AutoSize
StatusBarPanelAutoSize
Panelin bazı durumlara
göre
otomatik
boyutlandırmasını
sağlar. None değeri
panelin
boyutunun
değişmeyeceğini,
Contents
değeri,
panelin içerdiği yazıya
göre
değişeceğini
belirler. Spring değeri,
durum
çubuğundaki
boş
alanların
paylaşılmasını sağlar.
BorderStyle
StatusBarPanelBorderStyle
Panelin kenarlık stilidir.
Raised değeri, panelin
bir
düğme
gibi
gözükmesini, Sunken
değeri, panelin basık
gözükmesini
sağlar.
None değeri, kenarların
gözükmesini engeller.
Alignment
HorizontalAlignment
Panelin
yazısının
hizalanmasının belirler.
13
Konu: 1
Text
String
Width
Integer
MinWidth
Integer
Panel üzerinde yazan
yazıyı belirler
Panelin
belirler
Panel
minimum
belirler.
genişliğini
boyutunun
değerini
Style
StatusBarPanelStyle
Panelin
üzerindeki
yazıların stilini belirler.
Text değeri, normal
yazı
gözükmesini
sağlar.
OwnerDraw,
değişik
font
ve
renklerde
yazıların
görüntülenmesini
sağlar
Icon
Icon
Panel
üzerinde
görüntülenen simgeyi
belirler
private void Form1_Load( System.Object sender,
System.EventArgs e ) {
StatusBarPanel p = new StatusBarPanel();
p.MinWidth = 100;
p.AutoSize = StatusBarPanelAutoSize.Contents;
p.Alignment = HorizontalAlignment.Left;
p.BorderStyle =
StatusBarPanelBorderStyle.Raised;
p.Style = StatusBarPanelStyle.Text;
StatusBar1.Panels.Add( p );
Timer1.Interval = 1000;
Timer1.Start();
}
private void Timer1_Tick( System.Object sender,
System.EventArgs e ) {
StatusBarPanel panel = new StatusBarPanel();
panel = StatusBar1.Panels[ 0 ];
panel.Text = System.Convert.ToString(
DateAndTime.Now );
}
14
Modül 1: Programlamaya Giriş
NotifyIcon
NotifyIcon
ƒ Windows görev çubuğunda görüntülenen
simgedir.
Windows uygulamalarının, Windows görev çubuğunda görüntülendiği simgeyi
belirler.
NotifyIcon Özellikleri
Özellik
Değer Tipi
Açıklama
Icon
Icon
Görev
çubuğunda
gözükecek
simgeyi
belirler
ContextMenu
Menu
Simgeye sağ tıklandığı
zaman açılacak menü
Text
String
Simge
üzerine
gelindiğinde
görüntülenecek yazıyı
belirler.
15
Konu: 1
RichTextBox
RichTextBox
ƒ TextBox kontrolünden daha gelişmiş
özelliklere sahiptir.
ƒ Seçilen yazının rengi, yazı tipi değiştirilebilir
ƒ Madde işaretleri kullanılabilir.
ƒ Satır başlarındaki boşluklar ayarlanabilir.
Normal bir metin kutusundan daha gelişmiş özelliklere sahip bir kontroldür.
TextBox kontrolünde yazının yazı tipi, büyüklüğü gibi ayarlar yapılabilir. Ancak
sadece seçilen yazının rengi, yazı tipi, satır başı genişliği, madde işaretleri
kullanımı gibi ayarlar yapmak mümkün değildir. RichTextBox kontrolü, bu tip
zengin özelliklerin kullanılmasını sağlar.
RichTextBox Özellikleri
RichTextBox kontrolü kullanıcıya birçok seçenek sunar, dolayısıyla tasarım ve
çalışma anında erişilebilen birçok özelliği bulunur.
Tasarım anında ulaşılabilecek özellikler:
Özellik
Değer Tipi
Açıklama
ZoomFactor
Single
Metnin büyüklüğünü
belirler. 1 – 64 arası bir
16
Modül 1: Programlamaya Giriş
değer alır.
WordWrap
Boolean
Uzun yazıların bir
sonraki satıra geçerek
görüntülenmesini
sağlar
DetectUrls
Boolean
Bağlantı olarak girilen
yazıların LinkLabel
şeklinde algılanmasını
belirler
Lines
String()
Satırları String dizisi
olarak tutar
BulletIntend
Integer
Satırların
madde
işaretinden kaç piksel
açıkta
duracağını
belirler
AcceptsTab
Boolean
Tab tuşunu bir karakter
olarak algılanmasını,
dolayısıyla bu tuşa
basıldığında
kontrolden
çıkılmasının
engellenmesini belirler
ShowSelectionMargin
Boolean
Satır
başındaki
boşluğun
gösterilmesini belirler
RightMargin
Integer
Satırların maksimum
uzunluğunu
piksel
cinsinden belirler.
Çalışma anında ulaşılabilecek özellikler:
Özellik
Değer Tipi
Açıklama
Capture
Boolean
Kontrol içine yazı
yazarken
farenin
gizlenmesini belirler
UndoActionName
String
En son yapılabilecek
Undo işleminin tipini
tutar
RedoActionName
String
Undo işlemi yapıldıktan
sonra,
en
son
yapılabilecek
Redo
işleminin ismini tutar.
SelectedText
String
Seçilen metni belirler
SelectionBullet
Boolean
Seçilen satırın madde
17
Konu: 1
işaretli
olarak
görüntülenmesini
belirler
SelectionAlignment
Boolean
Seçilen
satırın
hizalanmasını belirler
SelectionColor
Color
Seçilen metnin rengini
belirler
SelectionFont
Font
Seçilen metnin yazı
tipini belirler
SelectionIntend
Integer
Seçilen satırın, sol
kenara olan uzaklığını
belirler
SelectionLength
Integer
Seçilen
metnin
uzunluğunu belirler
RichTextBox Metotları
Metot
Açıklama
Find
Metin kutusu içinde,
parametre olarak verilen
bir yazıyı arar. Yazıyı ilk
gördüğü yerin indisini
döndürür.
LoadFile
Bir dosyadan
metni yükler
SaveFile
Parametre
olarak
verilen
konumdaki
dosyaya, metni yazar.
Dosyanın rtf veya doc
uzantılarında
kaydedilmesi,
zengin
içeriğin görüntülenmesi
açısından önemlidir.
Undo
Yapılan
alınır
Redo
Geri alınan işlem tekrar
yapılır
işlem
alınan
geriye
18
Modül 1: Programlamaya Giriş
RichTextBox olayları
Olay
Açıklama
TextChanged
Metin kutusundaki yazı
değiştiği
zaman
gerçekleşir
LinkClicked
Metin
içindeki
bir
bağlantıya
tıklandığı
zaman gerçekleşir
Lab 1: Notepad uygulaması
Bu labda, RichTextBox kontrolünün sağladığı kolaylıklarla bir metin editörü
uygulaması geliştirilir. Bu uygulamanın kullanımını kolaylaştırmak için menüler,
araç çubuğu ve durum çubuğundan faydalanılır.
Bu labda kullanılan kontroller ve teknikler:
•
MainMenu – Dosya, düzen, görünüm ve yardım işlemleri için kullanılır
•
ContextMenu – Araç çubuğunu gizlemek ve kopyala, yapıştır, kes gibi
metin işlemleri için kullanılır
•
RichTextBox – Yazılan metnin tutulması için kullanılır
•
NotifyIcon – Uygulamanın
gözükmesini sağlar
•
ToolBar – Kaydetme, dosya açma, hizalama gibi işlemlere kısa yollar
sağlamak için kullanılır.
•
ImageList – Araç çubuğundaki düğmeleri resimlerini belirlemek için
simgesinin
görev
çubuğunda
kullanılır
•
SaveFileDialog – Dosyaların kaydedilmesi sırasında kullanılır.
•
OpenFileDialog – Dosyaları açmak için kullanılır.
•
FontDialog – Yazı tipini değiştirmek için kullanılır.
•
StatusBar – Dosyalar açıldığı zaman isimlerini ve kayıt durumlarını
görüntülemek için kullanılır.
19
Konu: 1
Kontrollerin eklenmesi
Form üzerine tablodaki kontrolleri ekleyin belirtilen özelliklerini ayarlayın.
Kontrol – Kontrol İsmi
Özellik
Değer
ContextMenu – ContextMenu1
Geri Al, Kes, Kopyala,
Yapıştır, Sil, Tümünü
Seç değerlerini içeren
menü öğeleri ekleyin
ContextMenu – ContextMenu2
Gizle değerini içeren bir
menü öğesi ekleyin
ToolBar – ToolBar1
Buttons
Kaydet, Aç, Kopyala,
Kes, Yapıştır, Undo,
Redo, Madde İşaretle,
Sola
Hizala,
Sağa
Hizala, Ortala komutları
için düğmeler ekleyin.
Her
düğmenin
ImageIndex özelliğine,
ImageList
içinde
bulunan
resimlerden
uygun olanın indisini
atayın.
ImageList – ImageList1
Images
Araç
çubuğundaki
öğeleri temsil eden
resimler ekleyin
ShowPanels
True
Panels
İki tane panel ekleyin. İlk
panelin
AutoSize
özelliğini
Contents
olarak belirleyin.
Icon
Uygulamanız
simge seçin
Text
“Notepad Uygulaması”
Dock
True
OpenFileDialog
-
OpenFileDialog1
SaveFileDialog
-
SaveFileDialog1
FontDialog - FontDialog1
StatusBar - StatusBar1
NotifyIcon - NotifyIcon1
RichTextBox – RichTextBox1
için
bir
Uygulamaya son olarak bir MainMenu ve ilgili alanlara MenuItem öğelerini
ekleyin. Parantez içinde belirtilen tuşlar, menü öğelerine erişmek için
kullanılacak kısa yollardır. Bu değerleri, menü öğelerinin ShortCut özelliğine
ekleyin.
20
Modül 1: Programlamaya Giriş
•
Dosya
o Yeni (Ctrl– N)
o Aç (Ctrl– O)
o Kaydet (Ctrl– S)
o Farklı Kaydet
o Çıkış
•
Düzen
o Geri Al (Ctrl– Z)
o Kes (Ctrl– X)
o Kopyala (Ctrl– C)
o Yapıştır (Ctrl– V)
o Sil
o Bul
o Yazı Tipi
o Tümünü Seç
•
Görünüm
o Sola Hizala
o Sağa Hizala
o Ortala
o Madde İşaretle
o Araç çubuğunu gizle
•
Yardım
o Hakkında
Uygulamaya frmBul isminde yeni bir form ekleyin. Bu form, metin kutusunda
aranan değeri bulmak için kullanılacaktır.
Forma, arama işlemleri için gereken kontrolleri ekleyin.
Kontrol – Kontrol İsmi
Özellik
Değer
Button – Button1
DialogResult
DialogResult.OK
Text
“Bul”
Button – Button2
Text
“İptal”
CheckBox – cbTumKelimeyiSec
Text
“Bulduktan sonra tüm
kelimeyi seç”
Checked
True
TextBox – txtAranan
21
Konu: 1
Kontrolleri ekledikten sonra Button1 ve Button2 düğmelerinin Click olayına,
formu kapatan kodları yazın:
private void Button1_Click( System.Object sender,
System.EventArgs e ) {
this.Close();
}
Uygulamaya frmHakkinda isminde yeni bir form ekleyin. Bu form, uygulama
bilgilerini içerir.
Kodların yazılması
•
Dosya ismini ve dosyanın kaydedilip edilmediğini tutan değişkenleri
tanımlayın
private bool Kaydedildi = true;
private string DosyaIsmi;
Menü öğelerine kod eklemeden önce, yapılacak işlemler yordamlar içine
yazılır. Böylece kodun karmaşıklığı azalır ve değişiklik yapmak kolaylaşır.
•
Durum çubuğunda değişiklik yapma işlemlerini yazın. Durum çubuğu,
dosya açma kaydetme gibi işlemler sonunda değişecektir
public void DurumDegistir() {
StatusBar1.Panels[ 0 ].Text = DosyaIsmi;
if ( Kaydedildi ) {
StatusBar1.Panels[ 1 ].Text = "Kaydedildi";
}
else {
StatusBar1.Panels[ 1 ].Text =
"Kaydedilmedi";
}
}
22
Modül 1: Programlamaya Giriş
•
Dosyaya kaydetme ve farklı kaydetme işlemlerini yazın.
// Kaydetme işlemi
public void Kaydet() {
if ( DosyaIsmi == "" ) {
FarkliKaydet();
}
else {
RichTextBox1.SaveFile( DosyaIsmi );
Kaydedildi = true;
}
DurumDegistir();
}
// Farklı kaydetme işlemi
public void FarkliKaydet() {
string dosya;
// Kaydedilecek yeri seçmek için
// SaveFileDialog kutusu gösterilir
sağlanır
// Dosya yoksa otomatik olarak oluşturulması
SaveFileDialog1.CreatePrompt = true;
if ( SaveFileDialog1.ShowDialog() ==
DialogResult.OK ) {
dosya = SaveFileDialog1.FileName;
RichTextBox1.SaveFile( dosya );
DosyaIsmi = dosya;
Kaydedildi = true;
}
DurumDegistir();
}
•
Yeni bir dosya veya var olan bir dosyayı açma işlemlerini tanımlayın.
public void DosyaAc( bool yeniDosya ) {
if ( !( Kaydedildi ) ) {
switch ( MessageBox.Show( "Dosya kaydedilsin
mi?","", MessageBoxButtons.YesNoCancel) ) {
case DialogResult.OK:
// Kaydetme işlemi yapılır
Kaydet();
break;
case DialogResult.Cancel:
// İşlem iptal edildi
return;
}
}
if ( !( yeniDosya ) ) {
// Varolan bir dosya alır.
string dosya = null;
if ( OpenFileDialog1.ShowDialog() ==
DialogResult.OK ) {
dosya = OpenFileDialog1.FileName;
RichTextBox1.LoadFile( dosya );
DosyaIsmi = dosya;
}
}
else {
23
Konu: 1
// Yeni bir dosya açılır
RichTextBox1.Clear();
DosyaIsmi = "";
}
Kaydedildi = true;
DurumDegistir();
}
•
Bulma işlemlerini gerçekleştiren kodları yazın. Burada yeni bir form
açılıp, orda girilen değerlere göre arama işlemi yapılır.
çıkılır
public void Bul() {
// Bulma formu görüntülenir, iptal tuşuna basıldıysa
{ return; }
frmBul bul = new frmBul();
if ( !( bul.ShowDialog() == DialogResult.OK ) )
string aranan = bul.txtAranan.Text;
if ( aranan == "" ) { return; }
// Bulduktan sonra kelimenin tümünü işaretlenmesi
bilgisi alınır
bool TumKelimeyiSec =
bul.cbTumKelimeyiSec.Checked;
// Bulunan ilk indis alınır.
int start = RichTextBox1.Find( aranan );
if ( !( TumKelimeyiSec ) ) {
// Sadece aranan kelime seçilir.
RichTextBox1.Select( start, aranan.Length );
}
else {
int son = start;
int bas = start;
while ( son < RichTextBox1.Text.Length - 1
&& RichTextBox1.Text.Substring( son, 1 ) != " " ) {
son += 1;
}
while ( bas > -1 &&
RichTextBox1.Text.Substring( bas, 1 ) != " " ) {
bas -= 1;
}
RichTextBox1.Select( bas + 1, son - bas - 1
);
}
}
•
ToolBar düğmelerine basıldığı zaman gerçekleşecek kodları yazın.
Dikkat:
Bu kodda belirtilen indis numaraları, uygulamanızda ToolBar kontrolüne
eklediğiniz düğmelerin indis numaralı ile farklılık gösterebilir. Yapılan işlemler yorum satırı
olarak geçilmiştir. Bu işlemleri, düğmelerin indislerine göre tekrar düzenleyin. Düğmelerin
indislerini öğrenmek için ToolBar kontrolünün Buttons özelliğine bakın.
24
Modül 1: Programlamaya Giriş
private void ToolBar1_ButtonClick( System.Object
sender, System.Windows.Forms.ToolBarButtonClickEventArgs e )
{
// Basılan düğmenin indisine göre işlem yapılır.
switch ( ToolBar1.Buttons.IndexOf( e.Button ) )
{
case 0:
//Kaydet
Kaydet();
break;
case 1:
// Ac
DosyaAc(False);
break;
case 3:
// Kopyala
RichTextBox1.Copy();
break;
case 4:
// Kes
RichTextBox1.Cut();
break;
case 5:
// Yapıştır
RichTextBox1.Paste();
break;
case 7:
// Geri Al
RichTextBox1.Undo();
break;
case 8:
// Tekrarla
RichTextBox1.Redo();
break;
case 10:
// Madde işaretle
RichTextBox1.SelectionBullet = Not
RichTextBox1.SelectionBullet;
break;
case 11:
// Sola Hizala
RichTextBox1.SelectionAlignment =
HorizontalAlignment.Left;
break;
case 12:
// Ortala
RichTextBox1.SelectionAlignment =
HorizontalAlignment.Center;
break;
case 13:
// Sağa Hizala
RichTextBox1.SelectionAlignment =
HorizontalAlignment.Right;
break;
}
}
•
Dosya içinde bulunan bir bağlantıya tıklandığı zaman, bu bağlantıyı
ilgili tarayıcıda açan kodları yazın.
// Linke git
25
Konu: 1
private void RichTextBox1_LinkClicked( object
sender, System.Windows.Forms.LinkClickedEventArgs e ) {
System.Diagnostics.Process.Start( e.LinkText
);
}
•
Dosya içine yazılan yazı değiştiği zaman gereken kodları yazın
private void RichTextBox1_TextChanged( System.Object
sender, System.EventArgs e ) {
Kaydedildi = false;
DurumDegistir();
}
•
Uygulama kapanırken dosyanın kaydedilmesini soran kodları yazın.
// Kapanırken dosyanın kaydedilmesi kontrol edilir.
private
void
Form3_Closing(
object
sender,
System.ComponentModel.CancelEventArgs e ) {
if ( !( Kaydedildi ) ) {
switch
(
MessageBox.Show
("Dosya
kaydedilsin mi?", "", MessageBoxButtons.YesNoCancel) ) {
case DialogResult.OK:
// Kaydetme işlemi yapılır
Kaydet();
break;
case DialogResult.Cancel:
// işlem iptal edildi
e.Cancel = true;
break;
}
}
}
•
Her menü öğesinin altına, ilgili işlemleri yazın. Burada dikkat edilmesi
gereken nokta, bazı ContextMenu öğelerinin ve MainMenu öğelerinin
aynı işlemi yaptığıdır. Örneğin “Geri Al” komutu, her iki menüde de
vardır. Bu kodları farklı yordamlar yerine, aynı yordamın içine yazarak
Handles ifadesine iki menü öğesinin Click olayı yazılır.
Örnek:
private void MenuItem19_Click( System.Object sender,
System.EventArgs e ) {
RichTextBox1.Undo();
}
Dikkat:
Bu kodda belirtilen menü isimleri, uygulamanızda MainMenu veya
ContextMenu kontrolüne eklediğiniz menülerin isimleri ile farklılık gösterebilir. Yapılan
işlemler yorum satırı olarak geçilmiştir. İlgili menü öğesine çift tıklayarak Click olayında,
burada belirtilen işlemleri yazın.
// Yeni Dosya aç
private void MenuItem13_Click( System.Object sender,
System.EventArgs e ) {
26
Modül 1: Programlamaya Giriş
DosyaAc(True);
}
// Dosya Aç
private void MenuItem14_Click( System.Object sender,
System.EventArgs e ) {
DosyaAc(False);
}
// Kaydet
private void MenuItem15_Click( System.Object sender,
System.EventArgs e ) {
Kaydet();
}
// Farklı Kaydet
private void MenuItem16_Click( System.Object sender,
System.EventArgs e ) {
FarkliKaydet();
}
// Çık
private void MenuItem18_Click( System.Object sender,
System.EventArgs e ) {
Application.Exit();
}
// Geri al
private void MenuItem19_Click( System.Object sender,
System.EventArgs e ) {
RichTextBox1.Undo();
}
// Kes
private void MenuItem21_Click( System.Object sender,
System.EventArgs e ) {
RichTextBox1.Cut();
}
// Kopyala
private void MenuItem22_Click( System.Object sender,
System.EventArgs e ) {
RichTextBox1.Copy();
}
// Yapıştır
private void MenuItem23_Click( System.Object sender,
System.EventArgs e ) {
RichTextBox1.Paste();
}
// Yazı sil
private void MenuItem24_Click( System.Object sender,
System.EventArgs e ) {
// silinecek kelime RichTextBox kontrolünde seçilen
kelimedir
string silinecek = RichTextBox1.SelectedText;
// secilen kelimenin indisi bulunur
int i = RichTextBox1.SelectionStart;
RichTextBox1.Text = RichTextBox1.Text.Remove(i,
silinecek.Length);
27
Konu: 1
}
// Tüm yazıyı seç
private void MenuItem28_Click( System.Object sender,
System.EventArgs e ) {
RichTextBox1.SelectAll();
}
// Yazı tipini seç
private void MenuItem36_Click( System.Object sender,
System.EventArgs e ) {
// Font seçerken, renklerin de görünmesi sağlanır.
FontDialog1.ShowColor = True;
if (FontDialog1.ShowDialog == DialogResult.OK)
{
RichTextBox1.SelectionFont = FontDialog1.Font;
}
}
// Sola Hizala
private void MenuItem29_Click( System.Object sender,
System.EventArgs e ) {
RichTextBox1.SelectionAlignment =
HorizontalAlignment.Left;
}
// Sağa Hizala
private void MenuItem30_Click( System.Object sender,
System.EventArgs e ) {
RichTextBox1.SelectionAlignment =
HorizontalAlignment.Right;
}
// Ortala
private void MenuItem32_Click( System.Object sender,
System.EventArgs e ) {
RichTextBox1.SelectionAlignment =
HorizontalAlignment.Center;
}
// Madde işaretle
private void MenuItem33_Click( System.Object sender,
System.EventArgs e ) {
RichTextBox1.SelectionBullet = Not
RichTextBox1.SelectionBullet;
}
// Hakkında formunun gösterilmesi
private void MenuItem34_Click( System.Object sender,
System.EventArgs e ) {
frmHakkinda hakkinda = New frmHakkinda();
hakkinda.ShowDialog();
}
// Araç çubuğunun gizlenmesi, MainMenu ve Toolbar
kontrolüne
// atanan ContextMenu yapılır.
private void MenuItem37_Click( System.Object sender,
System.EventArgs e ) {
ToolBar1.Visible = MenuItem37.Checked;
MenuItem37.Checked = Not MenuItem37.Checked;
28
Modül 1: Programlamaya Giriş
}
// Dosya bulunması
private void MenuItem26_Click( System.Object sender,
System.EventArgs e ) {
Bul();
}
}
MDI Formlar
MDI Formlar
ƒ Multiple Document Interface – Bir çok alt
formu barındıran formlardır.
ƒ Bu formların IsMdiContainer özelliği True
yapılır.
ƒ Alt formun MdiParent özelliği, ait olduğu
ana formu belirler
ƒ MdiChildren özelliği alt form dizisini verir.
Multiple Document Interface formları, içinde birden fazla form barındıran
formlardır. MDIChild olarak eklenen bu formlar birbirinden tamamen
bağımsızdır. Örneğin bir Excel dosyası içinde birden fazla sayfa olabilir. Bu
sayfalar ana forma bağlıdır. Ana form kapandığı zaman bu sayfalar da kapanır.
MDIParent olarak nitelendirilen bu ana formların, MDIChild formlarını açmak
ve yönetmek için menülere ihtiyaçları vardır.
Formları MDI olarak tanımlamak için IsMdiContainer özelliğinin True olarak
ayarlanması gerekir.
29
Konu: 1
MDI formlara alt formlar eklemek için, form oluşturma işlemleri bilinen şekilde
yapılır. Ancak formun MDIParent özelliği belirlenmelidir.
AltForm f = New AltForm();
// Oluşturulan form, ana forma bağlanır.
f.MdiParent = this;
f.Show();
Bir formun sahip olduğu alt formlara ulaşmak için, MDIChildren özelliğinden
yararlanılır. Bu özellik tek boyutlu bir Form dizisidir.
// Tüm formları kapatır.
// Alt formlar kapandığı zaman, dizi otomatik olarak
// yeniden boyutlandırılır.
while (this.MdiChildren.Length > 0)
{
this.MdiChildren[0].Close();
}
// Tüm formları Minimize eder
for (int i = 0; i < Me.MdiChildren.Length; i++)
{
this.MdiChildren[i].WindowState =
FormWindowState.Minimized;
}
Alt formlar genişletildiklerinde, form üzerinde yazan başlığı ana forma taşınır.
Alt formda tanımlı bir menü, ana formun menüsü ile birleşir. Bu menü birleşim
işlemine Merge denir. Menü öğeleri varsayılan olarak, ana formdaki menülerin
yanına eklenir. Ancak menü öğelerinin MergeType özelliği ile varsayılan değer
değiştirilebilir.
•
MergeType.Add
Varsayılan değerdir. Bu değeri alan menü öğeleri, birleşme sonucunda
menüye eklenir.
•
MergeType.MergeItem
Bu değeri alan menüler, sonuç menüsünde aynı MergeOrder değerindeki
menülerle birleşir.
•
MergeType.Replace
Birleşme sonucunda bu menü, aynı MergeOrder değerinde olan öğe ile
değiştirilir.
•
MergeType.Remove
30
Modül 1: Programlamaya Giriş
Birleşme sonucunda bu menü çıkartılır.
Alt formlar, ana forma basamak şeklinde eklenir. Birçok alt form ile çalışılıyorsa
bu formların düzenlenmesine ihtiyaç duyulur. Alt formları düzenlemek için
formun LayoutMdi metodu kullanılır.
this.LayoutMdi(MdiLayout.TileHorizontal)
this.LayoutMdi(MdiLayout.TileVertical)
this.LayoutMdi(MdiLayout.Cascade)
this.LayoutMdi(MdiLayout.ArrangeIcons)
MDI Form içindeki alt formlardan seçili olana ulaşmak için, formun
ActiveMdiChild özelliği kullanılır.
if (! this.ActiveMdiChild == null)
{
this.Text = this.ActiveMdiChild.Text;
}
31
Konu: 1
Fare Olayları
Fare olayları
ƒ MouseEventArgs, olayla ilgili parametreleri
tutar.
ƒ MouseDown
ƒ Düğmeye basıldığı zaman gerçekleşir.
ƒ MouseUp
ƒ Basılan düğme kaldırılınca gerçekleşir.
ƒ MouseMove
ƒ Kontrolün üzerinde hareket edince gerçekleşir.
Fare olayları, formlar üzerinde farenin bir tuşunun tıklanması, üzerine gelmesi
gibi olaylardır. Bu olayla ilgili parametreler, olay gerçekleştiği zaman
MouseEventArgs nesnesi ile kullanıcıya bildirilir.
MouseEventArgs özellikleri:
•
Button
Hangi fare düğmesine basıldığını gösterir.
•
Click
Olay gerçekleşene kadar, düğmeye kaç defa basıldığını belirler. Örneğin
fareye çift tıklanmışsa 2 değerini alacaktır.
•
Delta
Farenin ortadaki düğmesinin dönme oranını gösterir.
•
X
Kontrole göre, farenin tıklandığı pozisyonun x koordinatını gösterir.
•
Y
Kontrole göre, farenin tıklandığı pozisyonun y koordinatını gösterir.
NOT: Fare olayları MDI formlar üzerinde gerçekleşmez.
MouseDown olayı
Farenin herhangi bir düğmesi basıldığı zaman gerçekleşir. Kontrolün Click
olayında önce çalışır.
32
Modül 1: Programlamaya Giriş
MouseUp olayı
Farenin basılan düğmesi kaldırıldığı zaman gerçekleşir.
MouseMove olayı
Farenin, kontrol üzerinde hareket etmesi ile gerçekleşir.
Lab 2: File Browser
Bu labda, verilen bir konumdaki klasörlerin listelenmesi, seçilen klasörün
bilgilerinin alt formlarda görünmesi uygulaması gerçekleştirilir.
Bu labda kullanılan kontroller ve teknikler:
•
MainMenu – Klasörlerin görüntüleneceği konumu belirlemek, yeni
klasör eklemek, klasör silmek gibi işlemler için kullanılır.
•
ContextMenu – Seçilen klasörün alt klasörlerini listelemek, klasörü
listeden kaldırmak için kullanılır.
•
TreeView – Belirtilen konumdaki klasörleri ve alt klasörleri listelemeyi
sağlar.
•
StatusBar – Seçilen dosyaların konumlarını görüntülemeyi sağlar.
•
ListBox – Alt klasörlerin listelenmesi için kullanılır.
Kontrollerin eklenmesi
Form üzerine tablodaki kontrolleri ekleyin belirtilen özelliklerini ayarlayın.
Kontrol – Kontrol İsmi
Özellik
Form
isMDIContainer
Değer
True
ContextMenu – ContextMenu1
Alt Klasörler, Kaldır
değerlerini
içeren
menü öğeleri ekleyin
MainMenu – MainMenu1
Yeni Konum, Dosya
33
Konu: 1
Bilgileri
değerlerini
içeren menü öğelerini
ekleyin
StatusBar – StatusBar1
TreeView – TreeView1
Uygulamaya DosyaBilgileri isminde yeni bir form ekleyin. Form içine tablodaki
kontrolleri ekleyin ve özelliklerini ayarlayın.
Kontrol – Kontrol İsmi
Özellik
MainMenu – MainMenu1
ListBox – ListBox1
Değer
Yeni,
Sil,
Kapat
değerlerini
içeren
menü öğelerini ekleyin
Dock
Fill
Kodların yazılması
Ana Form
•
Belirtilen konumdaki klasörleri listeleyen kodları yazın.
public string[] KlasorleriAl( string konum ) {
string[]
klasorler
System.IO.Directory.GetDirectories( konum + @"\" );
=
for (int i=0; i<=klasorler.Length - 1; i++ )
{
klasorler[ i ] = klasorler[ i ].Remove(
0, konum.Length + 1 );
}
return klasorler;
}
•
Form üzerinde görüntülenecek klasörlerin bulunduğu yeri tutan
değişkeni ve yeni formun açılmasını yazın.
private string YeniKonum;
public void FormBilgileri() {
DosyaBilgileri f = new DosyaBilgileri();
f.MdiParent = this;
f.Text = YeniKonum +
TreeView1.SelectedNode.FullPath;
f.KlasorleriListele();
f.Show();
}
•
Yeni konumu seçen menü altına, TreeView kontrolünde alt klasörleri
listeleyen kodları yazın
// Yeni konum seçilmesi
private void MenuItem2_Click( System.Object sender,
System.EventArgs e ) {
34
Modül 1: Programlamaya Giriş
YeniKonum =
Microsoft.VisualBasic.Interaction.InputBox( "Konum girin:",
"Yeni Konum", @"C:\", -1, -1 );
string[] klasorler = KlasorleriAl( YeniKonum );
for (int i=0; i<=klasorler.Length - 1; i++ ) {
TreeView1.Nodes.Add( klasorler[ i ] );
}
TreeView1.SelectedNode = TreeView1.Nodes[ 0 ];
}
•
TreeView kontrolünde bir klasör seçildiği zaman durum çubuğunda
klasörün ismini görüntüleyen kodları yazın.
private void TreeView1_AfterSelect( System.Object
sender, System.Windows.Forms.TreeViewEventArgs e ) {
StatusBar1.Text = YeniKonum +
TreeView1.SelectedNode.FullPath;
}
ContextMenu içinde tanımlanan işlemleri yazın.
•
Alt klasörlerin listelenmesi
// Alt klasörler
private void MenuItem3_Click( System.Object sender,
System.EventArgs e ) {
TreeNode secilen = TreeView1.SelectedNode;
secilen.Nodes.Clear();
string konum = YeniKonum + secilen.FullPath;
string[] altKlasorler = KlasorleriAl( konum );
for (int i=0; i<=altKlasorler.Length - 1; i++ )
{
secilen.Nodes.Add( altKlasorler[ i ] );
}
}
•
Klasörün kaldırılma işlemi
// Seçilen klasörün listeden kaldırılma işlemi
private void MenuItem4_Click( System.Object sender,
System.EventArgs e ) {
TreeNode secilen = TreeView1.SelectedNode;
if ( secilen == null ) { return; }
if ( secilen.Parent == null ) {
TreeView1.Nodes.Remove( secilen );
}
else {
secilen.Parent.Nodes.Remove( secilen );
}
}
•
Dosya bilgilerini görüntüleyen kodları yazın
// Dosya bilgileri – MainMenu öğesine tıklandığında
private void MenuItem5_Click( System.Object sender,
System.EventArgs e ) {
FormBilgileri();
}
35
Konu: 1
// Dosya bilgileri – TreeView öğesine çift tıklandığında
private void TreeView1_MouseDown( object sender,
System.Windows.Forms.MouseEventArgs e ) {
if ( e.Clicks == 2 ) {
FormBilgileri();
}
}
•
Farenin ortadaki tekerleğinin döndürülmesi işleminde, TreeView
içinde seçilen öğeden bir önceki veya bir sonraki öğeye gidilmesi için
gereken kodları yazın.
private void TreeView1_MouseWheel( object sender,
System.Windows.Forms.MouseEventArgs e ) {
if ( TreeView1.SelectedNode == null ) { return;
}
if ( e.Delta < 0 ) {
TreeNode sonraki =
TreeView1.SelectedNode.NextNode;
if ( !( sonraki == null ) ) {
TreeView1.SelectedNode = sonraki;
}
}
else {
TreeNode onceki =
TreeView1.SelectedNode.PrevNode;
if ( !( onceki == null ) ) {
TreeView1.SelectedNode = onceki;
}
}
}
DosyaBilgileri formunda yazılacak kodlar:
•
Alt klasörlerin listelendiği kodları yazın
public void KlasorleriListele() {
ListBox1.Items.Clear();
string[] klasorler =
System.IO.Directory.GetDirectories( this.Text + @"\" );
for (int i=0; i<=klasorler.Length -1; i++ ) {
ListBox1.Items.Add( klasorler[ i ] );
}
}
•
Yeni klasörün eklenmesi için gereken kodları yazın.
private void MenuItem3_Click( System.Object sender,
System.EventArgs e ) {
string yeniKlasor = Interaction.InputBox( "Yeni
klasr ismi girin:", "", "", -1, -1 );
yeniKlasor = yeniKlasor.Insert( 0, this.Text +
@"\" );
System.IO.Directory.CreateDirectory( yeniKlasor
);
KlasorleriListele();
}
•
Seçilen klasörün silinmesini sağlayan kodları yazın.
private void MenuItem2_Click( System.Object sender,
System.EventArgs e ) {
string silinecek;
36
Modül 1: Programlamaya Giriş
silinecek = ListBox1.SelectedItem.ToString();
System.IO.Directory.Delete( silinecek, true );
KlasorleriListele();
}
Modül Sonu Soruları & Alıştırmalar
Özet
 Menüler
ÂMainMenu, ContextMenu
Â
Â
Â
Â
Â
ToolBar
ToolTip
StatusBar
NotifyIcon
RichTextBox
1. MainMenu ve ContextMenu nesnelerini ve kullanım alanlarını açıklayınız.
Kontrolleri içeren bir uygulama geliştirin.
2. ImageList kontrolünün kullanım amacını ve kullanımını açıklayınız.
Kontolü içeren bir uygulama geliştirin.
3. SDI ve MDI form yapılarını açıklayınız ve her iki tür için birer örnek
uygulama geliştirin.
Modül 11: Veri Yapıları
Hedefler
 Access ortamı
 Veri tipleri
 Veri modelleme teknikleri
Birçok şirket, kurum ve kayıtlarını tutan yapılar için verinin önemi çok büyüktür.
Verilerin kâğıt üzerinde tutulması hem aramaların yapılması hem de kayıt
düzeni açısından çok zor bir yöntemdi. Bilgisayarların iş yaşamında
kullanılmaya başlanması ile verilen yönetimi daha da kolaylaştı. Ancak bu
teknoloji ilerledikçe kullanılması zorlaşmaya başladı. Verilerin tutulması metin
dosyalarından tablolara aktarıldı. Günümüzde veri ve tablo yapılarının yönetimi
artık veritabanı yöneticilerin eline bırakılmış durumdadır.
Windows ve Web uygulamaların çoğu veri üzerine yoğunlaşır. Uygulamalarda
veriye hızlı bir şekilde ulaşmak ve veriyi yönetmek için tablo yapılarının iyi bir
şekilde modellenmesi gerekmektedir. Bu modülde Microsoft Access veritabanı
üzerinde veri yapılarının kullanılması işlenir.
Bu modülü tamamladıktan sonra:
•
Microsoft Access ortamını tanıyacak,
•
Veritabanlarında kullanılan değişik veri tiplerini tanıyacak,
•
Veri modelleme tekniklerini öğreneceksiniz.
2
Modül 1: Programlamaya Giriş
Konu 1: Access’ e Giriş
Access Microsoft’un ilişkisel veritabanıdır. İçindeki birçok sihirbaz yardımı ile
kullanım kolaylığı ve hızlı bir şekilde tablo tasarımının yapılmasını sağlar.
Access tasarım görünümlerinde, tabloların yapısını analiz etmek için sorguları
kolay bir şekilde oluşturma işlemini kolaylaştırır. Karmaşık bir dosya yapısı
olmaması taşınabilirliğini kolaylaştırır ve her platformda çalışmasını sağlar.
Access Ortamı
Access ortamı
ƒ Görev Bölmesi
ƒ
ƒ
ƒ
ƒ
ƒ
Başlangıç
Yardım
Arama Sonuçları
Dosya Arama
Yeni Dosya
ƒ Tablo oluşturmak
ƒ Tasarım görünümünde tablo
ƒ Sihirbaz ile tablo
ƒ Veri girerek tablo
Access ortamı, veritabanı geliştirirken kullanıcıya birçok kolaylık sunar. Access
açıldığı zaman sağ panelde “Görev Bölmesi” çıkar. Bu panel birçok işleme kısa
yol sağlar.
• Başlangıç
Access Office Online başlangıç sayfasıdır. Microsoft haber sitelerine
bağlantıları ve en son açılan veritabanlarını listeler.
• Yardım
Online yardım seçeneklerini sunar
• Arama sonuçları
Online yardımda bulunan sonuçları listeler
• Dosya Arama
Belirtilen yerde, belli tipte dosyaları aramayı sağlar.
•
Yeni Dosya
3
Konu: 1
Yeni bir veri tabanı dosyası veya veri erişim dosyası açmak için kullanılır.
Boş veritabanı komutu verildiği zaman “Yeni Veritabanı Dosyası” diyalog
kutusunda, dosya ismi girilip yeni veritabanı oluşturulur. Oluşturulan veritabanı
dosyalarının uzantısı mdb olur.
Daha önceden oluşturulmuş bir veritabanını açmak için Dosya menüsünden
Aç komutu verilir. Ctrl – O kısa yolu da dosyaları açmak için kullanılabilir.
Veritabanı açıldığı zaman, veritabanı üzerinde yapılabilecek tüm işlemleri
sunan bir pencere çıkar. Veritabanı nesnelerini yönetilmesi bu pencere ile
yapılır. Sol panelde bulunan nesneler sekmesinde, veritabanında
bulunabilecek tüm nesneler listelenmiştir. Bir nesne tipi seçildiğinde,
veritabanında bulunan bu tipteki tüm öğeler görüntülenir. Örneğin Tablolar
sekmesine gelindiğinde veritabanı üzerindeki tablolar görüntülenir, yeni tablo
oluşturmak için seçenekler sunulur.
4
Modül 1: Programlamaya Giriş
Veritabanı Nesnesi oluşturmak
Veritabanı penceresinde nesneleri oluşturmak için farklı yollar
sunulmuştur. Tabloları oluşturmak için bu kısa yollardan yararlanılabilir.
• Tasarım görünümünde tablo oluştur
Bu seçenek ile tablodaki verilerin tasarımı tamamen kullanıcıya
bırakılmıştır. Kullanıcı alan adlarını kendisi girip, ilgili veri tipini ve gerekli
ayarları seçebilir.
• Sihirbaz kullanarak tablo oluştur
Access içinde çok sık karşılaşılan, kullanıcıya büyük hız sağlayan sihirbaz
yardımı ile tablo oluşturulur. Sihirbaz, hangi tipte tablo oluşturulacağını,
önceden hazırlanmış zengin şablonları kullanıcıya sunarak belirler.
•
Veriler girerek tablo oluştur
5
Konu: 1
Bu seçenek ile tablolar veri girişi ile oluşturulur. Access kullanıcının girdiği
verilere göre alan sayısı ve tipi belirler. Ancak alan adlarını daha sonradan
değiştirilmelidir.
Oluşturulan tablolar tasarım ve veri sayfası görünümlerinde incelenebilir. Veri
sayfası görünümü kullanıcıya veri girmesi için büyük kolaylıklar sağlar.
Örneğin Evet/Hayır veri tipindeki bir alan veri girilmesi için bir CheckBox
görüntülenir. Ayrıca tablonun ilişkide olduğu tablolar bulunur ve alt tablo olarak
kullanıcıya sunulur.
Tablolar oluşturulduktan sonra aralarındaki ilişkilerin kurulması
görüntülenmesi için araç çubuğunda “İlişkiler” düğmesi kullanılır.
ve
6
Modül 1: Programlamaya Giriş
Konu 2: Veri Yapılarına Giriş
Veri Yapıları
ƒ Metin Veri Tipleri
ƒ Text, Memo
ƒ Sayısal Veri Tipleri
ƒ Byte, Integer, Long Integer
ƒ Single, Double, Decimal
ƒ Tarih Veri Tipi
ƒ Genel Tarih, Uzun Tarih, Kısa Tarih
ƒ Orta Uzunlukta Tarih, Uzun Saat, Kısa Saat
ƒ Yes/No Veri Tipi
ƒ OLE Veri Tipi
Veritabanlarında veriler aynı tipinde tutulmaz. Bu durum küçük veriler için fazla
yer alanları açmayı engellediği gibi değişik formatlardaki verilerin
yönetilebilirliğini artırır. Örneğin kategori tablosunda tutulan verilerin sayısı
genellikle azdır ve çok fazla artmaz. Dolayısıyla bu verilerin tekil alanında
tutulan sayının çok büyük veri tipinde olması gerekmez. Ancak makalelerin
tutulduğu bir alanın kapasitesinin çok büyük olması gerekir.
Metin Veri Tipleri
• Metin (Text)
Metin bilgilerini tutmak için tanımlanan veri tipidir. Bu değere girilebilecek
maksimum karakter sayısı 255 tir. Bir alana belirtilen uzunluktan küçük bir
değer girildiğinde, kalan boş yerler için kaynak ayrılmaz. Metin veri tipi
sayısal değerler de içerebilir.
7
Konu: 1
• Not (Memo)
Maksimum 65535 karakter tutar. Büyük metinsel veriler için tercih
edilmelidir.
Sayısal Veri Tipleri
Sayı veri tipinin birden fazla alan boyutu vardır.
• Bayt (Byte)
0 – 255 arasında bir sayı
• Tamsayı (Integer)
- 32,768 ile 32,767 arasında bir sayı
• Uzun Tamsayı (Long Integer)
- 2,147,483,648 ile 2,147,483,647 arasında bir sayı
• Tek (Single)
Negatif sayı aralığı: –3.402823E+38 ile –1.401298E–45
Pozitif sayı aralığı: 1.401298E–45 ile 3.402823E38
• Çift (Double)
Negatif sayı aralığı: 1.79769313486231E+ 308
–4.94065645841247E–324
Pozitif sayı aralığı: 1.94065645841247E–324
1.79769313486231E+308
• Ondalık (Decimal)
–10^38–1 ile 10^38–1 arasında sayı
Otomatik Sayı (AutoNumber) veri tipi, alana veri girildiği zaman otomatik olarak
belirlenen sayıları ifade eder. Sayılar rasgele ya da birden başlayarak girilir.
Tarih Veri Tipi
Tarih alanları için değişik boyutlarda depolama seçenekleri sunar.
• Genel Tarih
Kısa Tarih ve Uzun Saat birleşimi bir görünümdür.
• Uzun Tarih
12 Aralık 2004 Pazar formatında görünür
• Orta Uzunlukta Tarih
12 Ara 2004 formatında görünür
• Kısa Tarih
12.12.2004 formatında görünür
• Uzun Saat
15:11:19 formatında görünür
• Kısa Saat
15:11 formatında görünür
8
Modül 1: Programlamaya Giriş
Evet/Hayır Veri Tipi
Bir bit değerinde, evet ve hayır değerlerini alan veri tipidir. Veri sayfalarında
veya sorgu sonucunda bir CheckBox ile ifade edilir. Eğer seçili ise bu alanın
değeri -1, değilse 0 olur. Bu alan sorgulanırken -1 ve 0 değerleri kontrol
edilmelidir.
OLE Veri Tipi
Alana bir nesne eklemek veya bağlamak için kullanılan veri tipidir. Resimler,
Excel dosyalarını veya bir dosyadan seçebileceğiniz herhangi bir nesne
bağlanabilir.
Konu 3: Veri Modelleme Gereksinimleri
Veri Modelleme Gereksinimleri
ƒ Normalizasyon
ƒ Birinci Normal Form
ƒ İkinci Normal Form
ƒ Üçüncü Normal Form
ƒ Primary Key
ƒ Foreign Key
ƒ İlişkiler
ƒ Bire Bir
ƒ Bire Sonsuz
ƒ Sonsuza Sonsuz
Verileri tablolarda tutarken bazı modellemelere gereksinim duyulur. Örneğin
yazılan bir verinin tekrarlamaması önemlidir. Ürünler tablosunda kategori isim
olarak tutulursa, aynı kategorideki ürünleri için bu isim tekrardan yazılması
gerekecektir. Bu durum, tabloya hem veri girişi zorlaştırır, hem de değişiklik
yapılmak istenirse her ürünün kategorisini değiştirmek gerekir. Bu tip sorunlar
normalizasyon kurallarını ortaya çıkarmıştır.
9
Konu: 1
Normalizasyon, yer alanından kazanma, veri tutarlılığı ve ölçeklenebilirlik
amacıyla tablolardan gereksiz verilerin çıkartılması işlemleridir. Bu işlemler,
tabloların üç etapta normal formlara getirilmesi ile gerçekleşir.
Birinci Normal Form
Birinci Normal Form
ƒ Yatay düzeyde gereksiz veri tekrarı
yapılmaz.
ƒ Bir kolonda sadece bir veri tutulur.
ƒ Tekrarlanan veriler için ayrı bir tablo
oluşturulur.
Bu işlem, yatay düzeyde gereksiz veya tekrarlanan verilerin çıkartılmasıdır.
Satırlarda en az düzeyde veri tutulması ve bir bilginin sadece bir kolonda
bulunması sağlanır.
Örnek:
Bu örnekte bir eğitmen grubunun yaptığı projeler bir veritabanında tutulur.
Verilerin tek bir tabloda tutulması bazı problemlere yol açacaktır.
Eğitmen1
Eğitmen2
Proje
Konu
Saat
Kurum
Ali
Veli
Uzmanlık
Kitabı
Windows
300
BilgeAdam
Ali
Veli
Mühendislik
Kitabı
Windows,
Web
350
BilgeAdam
Bu örnekte, projelerin eğitmenleri iki ayrı alanda tutulmuştur. Bu durum 1NF
(birinci normal form) kuralını ihlal etmiştir. Yani bir satırda, bir verinin tekrar
etmesi söz konusudur. Bu tabloda projeleri iki eğitmen ile sınırlanmış oluyor.
Ancak bir kitabı birçok eğitmenin yazdığı durumlar da olabilir.
10
Modül 1: Programlamaya Giriş
Ayrıca proje konularında birden fazla bilgi tutulur. Mühendislik Kitabı projesinin
Windows ve Web olmak üzere iki tane konusu bulunur. Belli bir konuya göre
arama yapmak zorlaşır.
Eğitmenler tek bir alanda toplanıp, konular kitaplara göre tekrar düzenlenebilir.
Eğitmen
Proje
Konu
Saat
Kurum
Ali
Uzmanlık
Kitabı
Windows
300
BilgeAdam
Veli
Uzmanlık
Kitabı
Windows
300
BilgeAdam
Ali
Mühendislik
Kitabı
Web
350
BilgeAdam
Veli
Mühendislik
Kitabı
Web
350
BilgeAdam
Yeniden düzenlenen bu tabloda ise bir kitap projesi için iki tane satır oluşuyor.
Ayrıca Mühendislik kitabının sadece Web konusunda olduğu görülüyor. Diğer
konu için de ayrıca iki satır eklenmesi gerekir.
Eğitmen
Proje
Konu
Saat
Kurum
Ali
Uzmanlık
Kitabı
Windows
300
BilgeAdam
Veli
Uzmanlık
Kitabı
Windows
300
BilgeAdam
Ali
Mühendislik
Kitabı
Web
350
BilgeAdam
Veli
Mühendislik
Kitabı
Web
350
BilgeAdam
Ali
Mühendislik
Kitabı
Windows
350
BilgeAdam
Veli
Mühendislik
Kitabı
Windows
350
BilgeAdam
Ancak bu şekilde verilerin gereksiz yere tekrarlandığı görülür. Veriler bu şekilde
tekrar yazıldıkları zaman hata yapılma olasılığı artar. Dolayısıyla veri bütünlüğü
bozulur. Örneğin Mühendislik Kitabı yerine Muhendis Kitapi gibi bir veri girildiği
zaman, alınacak raporlarda çelişkiler meydana gelir.
Dolayısıyla bu tekrarlanan verilerin ayrı bir tabloda tutulması gerekir.
Eğitmen No
Eğitmen
1
Ali
2
Veli
11
Konu: 1
Konu No
Konu
500
Windows
501
Web
Proje No
Proje
Saat
Kurum
100
Uzmanlık
Kitabı
300
BilgeAdam
101
Mühendislik
Kitabı
350
BilgeAdam
Eğitmenler ve konular tablosundaki verilerin birer numarası vardır. Bu verilere
erişmek için konu veya eğitmenin ismiyle değil, numara ile ulaşılacaktır.
Dolayısıyla tablolarda onlarca karakterin tekrarlanması yerine, verileri temsil
eden numaralar tekrarlanacaktır. Bu durum hem veritabanının büyümesini
engeller hem de tablo üzerinde kayıt aramalarını hızlandırır.
Tablolar birbirinden ayrıldıktan sonra projelerin hangi eğitmenler tarafından
yapıldığı ve hangi konularda olduğu bilgileri kaybedilmiştir. Bu bilgilerin elde
edilmesi için tablolar arasında ilişkiler kurmak gereklidir.
İlişkilerin kurulması için tabloların, birbirlerine referans vermesi gerekir. Yani bir
tablodan diğerine ulaşmak için bir bilgi gerekir. Örneğin bir projenin hangi
konuda olduğunu belirlemek için, konu numarasına ihtiyaç vardır. Bu numara,
projenin hangi konuda olduğunu belirleyecektir.
Tablolar arasında ilişkileri kurmak için bu numaraların doğru biçimde
kullanılması gerekir. Bu numaralar davranışlarına göre ikiye ayrılır.
12
Modül 1: Programlamaya Giriş
Birincil Anahtar (Primary Key)
Primary Key
ƒ Bir ya da birden fazla alan Primary Key
yapılabilir.
ƒ Alanlardaki veriler tekrarlanamaz.
Tablonun bir ya da birden fazla alanı, tek bir veriyi temsil etmesi için Birincil
Anahtar yapılır. Bu anahtar verinin bir daha tekrarlanmamasını sağlar ve
ilişkiler kurulurken ana tabloyu belirler.
Örnekteki Birincil Anahtar olan alanlar Eğitmen No, Proje No ve Konu No
alanlarıdır.
Birden fazla alanın Birincil Anahtar olarak tanımlanması, alanların tuttuğu
verinin birleşik olarak tekliğini sağlar. Örneğin sipariş detayları tablosunda,
sipariş numarası ile ürün numarasının beraber tekrarlanmaması gerekir. Aksi
halde bir siparişteki ürünün iki farklı adet, indirim vs. bilgileri olacaktır.
Sipariş No
Ürün No
Adet
İndirim
100
680
1
0
100
679
2
10
102
680
1
15
100
680
2
5
Bu tabloda sipariş ve ürün numarası beraber Birincil Anahtar yapılmıştır.
Dolayısıyla bu alanların herhangi birisinde bir veri tekrarı olabilir. Önemli olan
bu iki alanın beraber aynı veri tutmamasıdır. Örnekte 100 numaralı siparişte
680 numaralı ürün kaydı iki defa geçmiştir. Yapılacak sorgularda, bu ürünün
siparişte 1 adet olduğu ve 0 YTL indirim yapıldığını, aynı zamanda 2 adet
olduğunu ve indirimin 5 YTL olduğu görülür. Bu da verinin tutarlılığını bozar.
13
Konu: 1
Access ile tablolarda Birincil Anahtar oluşturmak için, istenen alanlar
seçilerek araç çubuğundaki Birincil Anahtar düğmesine basılır.
Yabancı Anahtar (Foreign Key)
Foreign Key
ƒ Başka bir tablonun Primary Key alanına
referans gösterir
ƒ İlişkideki Primary Key üzerinde güncelleme
ve silme işlemleri, bu alanda da yapılabilir.
ƒ Cascade Update
ƒ Cascade Delete
ƒ İlişkilerde, Foreign Key alanındaki değer
kontrol edilebilir
ƒ Enforce Referential Integrity
Bir tablo içinde başka bir tabloya referans vermek için, o tablonun numarası
kullanılır. Yani o tablonun Birincil Anahtar alanına gönderme yapılır. Bu
işlemin yapılması için, referans gönderen tabloda bu verinin tutulması gerekir.
Farklı bir tablonun birincil anahtarını tutan alana Yabancı Anahtar denir.
Örneğin, şarkı listesinin tutulduğu bir tabloda albüm numarası, albümler
tablosundaki Birincil Anahtar olan alana referans verir.
14
Modül 1: Programlamaya Giriş
Bu anahtarların kullanımı ilişkilerin tanımlanmasında büyük öneme sahiptir.
Tabloların normalizasyonunun sağlanması için birbirleriyle ilişkilendirilmeleri
gerekir. Üç çeşit ilişki vardır.
1. Bire bir ilişki (One to One)
2. Bire sonsuz ilişki (One to Many)
3. Sonsuza sonsuz ilişki (Many to Many)
Access ile tablolar arasındaki ilişkiler, bir alanının sürüklenip diğer tablodaki bir
alanın üzerine bırakılması ile kurulur. Access bu alanların Birincil Anahtar
olup olmadığına bakarak ilişkinin cinsini belirler.
İlişki tanımlanırken çıkan İlişkileri Düzenle penceresinde, tablolardaki hangi
alanlar üzerinde ilişki kurulacağı gösterilir. Buradan ilişkinin türü davranışı
hakkında özel ayarlamalar yapılır.
• Bilgi Tutarlılığına Zorla (Enforce Referential Integrity)
Bir tablodaki verinin diğer tabloda var olup olmadığını kontrol eder.
•
İlişkili Alanları Ardarda Güncelle (Cascade Update)
Birincil Anahtar üzerinde bir değişiklik yapılmışsa, ilişkide olduğu
tablolardaki Yabancı Anahtar alanları da değiştirir.
• İlişkili Kayıtları Ardarda Sil (Cascade Delete)
Tabloda bir kayıt silindiği zaman, ilişkide olduğu tablolardaki veriler de
silinir.
15
Konu: 1
Tekil Kısıtı (Unique Constraint)
Unique Constraint
ƒ Primary Key dışındaki alanların tekil
olması
ƒ Unique tanımlanırken alan indekslenir.
Bazı durumlarda, Birincil Anahtar olmayan alanların bazılarının da tabloda
birden fazla geçmesi istenmez. Örneğin öğrenci tablosundaki bir numara
başka bir öğrenci için geçerli değildir. Ya da sicil tablosundaki bir TC kimlik
numarası da tekrarlanmaz. Bu alanların Tekil olarak tanımlanması gerekir.
Access ile tablo tasarlarken, alanların Tekil olarak tanımlanması indekslemeyi
gerektirir. Bir alanın indekslenmesi, tabloda aramaların o alan üzerinden daha
hızlı yapılmasını sağlar. Ancak her alan üzerinde indeks kullanılmamalıdır. Bu
durum sorguların performansını artırmak yerine düşürür. Üzerinde sıkça sorgu
çalıştırılan alanlar indekslenebilir.
16
Modül 1: Programlamaya Giriş
Bire bir ilişki
Bir tablodaki bir kayıt, diğer tablodaki bir veri için ancak bir kez kullanılabilir.
Örneğin sicil tablosu, bir kişinin ismini, soyadını ve kimlik numarasını tutuyor.
Öğrenci tablosu ise öğrencinin okul numarası, sınıfı gibi kayıt bilgilerini tutuyor.
Öğrenci ile sicil arasında bire bir ilişki vardır. Öğrenci tablosundaki bir veri, sicil
tablosunda sadece bir veriyi referans gösterebilir. Sicil tablosundaki bir veri de,
öğrenci tablosundaki bir veri için kullanılabilir. Dolayısıyla bir öğrencinin bir sicili
olabilir, bir sicil ise sadece bir öğrenciye ait olabilir.
Tablolar arasındaki bu ilişkiler iki Birincil Anahtar üzerinden yapılır.
)
Bire sonsuz ilişki
Tablodaki bir verinin, ilişkide olduğu tabloda birden fazla kullanılabilir. Örneğin
bir araba ve model tabloları arasında bire sonsuz bir ilişki vardır. Araba
tablosundaki bir veri, model tablosundaki bir veriyi bir kez kullanabilir. Ancak
model tablosundaki bir veri, araba tablosunda birden fazla veri tarafından
kullanılabilir. Yani bir arabanın sadece bir modeli olur ve bir model birden fazla
arabanın modeli olabilir.
Tablolar arasında bire sonsuz bir ilişki oluşturmak için, birden fazla veride
geçecek olan tabloda Birincil Anahtar, bu değerin bir kere tutulacağı
tabloda Yabancı Anahtar olmak zorundadır.
17
Konu: 1
Sonsuza sonsuz ilişki
İki tablo arasında sonsuza sonsuz bir ilişkiyi temsil eder. Tablolardaki her veri
diğeri için birden fazla kullanılıyorsa, iki taraflı sonsuz bir ilişki vardır. Örneğin
bir film ve oyuncu tabloları arasındaki ilişki sonsuza sonsuzdur. Film
tablosundaki bir veri, oyuncular tablosunda birden fazla veri için kullanılabilir.
Aynı şekilde oyuncu tablosundaki bir veri, filmler tablosunda birden fazla veri
için kullanılabilir. İlişki şu şekilde tanımlanabilir:
Bir oyuncu birden fazla filmde oynayabilir. Bir filmde birden fazla oyuncu
bulunabilir.
Tablolar arasında sonsuza sonsuz bir ilişki kurmak için, ara tabloya ihtiyaç
duyulur. Bunun nedeni, her iki tablodaki verilerin birden fazla eşi bulunabilir
olmasıdır. Yapılan ara tabloda, iki tablodan alınan Birincil Anahtar alanları
konur. Bu alanlar ikili Birincil Anahtar yapılarak veri bütünlüğü sağlanmış
olur.
Tabloların birinci normal forma getirilmesi için ilişkilerin kurulması gerekir. Bu
durumda, ayrılan tabloların birbirleri ile ilişkiler saptanması ve bunun
sonucunda Yabancı Anahtar alanlarının eklenmesi veya ara tabloların
oluşturulması gerekir.
Örneğin, Proje ile konular arasında bir sonsuza sonsuz bir ilişki vardır. Bir
projenin birden fazla konusu olabilir ve bir konuda birden fazla proje yapılabilir.
Bunun için ara tablonun kurulması gerekir.
Konu No
Konu
500
Windows
501
Web
18
Modül 1: Programlamaya Giriş
Proje No
Proje
Saat
Kurum
100
Uzmanlık
Kitabı
300
BilgeAdam
101
Mühendislik
Kitabı
350
BilgeAdam
Proje No
Konu No
100
500
101
500
101
501
Bu tablo ile 100 numaralı Uzmanlık Kitabı projesinin 500 numaralı Windows
konusunda olduğu görülür. Bu tablo biçimi, belli konulardaki projelerin
sorgulanmasını da destekler.
Eğitmenler ile projeler arasında da sonsuza sonsuz bir ilişki vardır. Bir eğitmen
birden fazla projede bulunabilir. Bir projeyi birden fazla eğitmen yürütebilir.
Dolayısıyla bu ilişki için de bir ara tablo yapılması gerekir.
Eğitmen No
Proje No
1
101
2
101
1
100
2
100
19
Konu: 1
İkinci Normal Form
İkinci Normal Form
ƒ Kolon düzeyinde veri tekrarı yapılmaz.
ƒ Kolonlarda tekrar edilen veriler ayrı bir
tabloda tutulur.
Birinci normal form satır bazında gereksiz verilerin çıkartılmasıydı. İkinci normal
form ise kolon bazında veri tekrarını kontrol eder. Eğer bir kolonda bir veri,
birden fazla kullanılıyorsa bu verilerin ayrı bir tabloda tutulması gerekir.
Örnekte kurum ismi BilgeAdam, tüm satırlar için yazılmıştır. Dolayısıyla bu
kolonda veri tekrarı yapılmıştır. Bu kurum ismi ayrı bir tabloda tutulup, ana
tabloda numarası ile referans gösterilmelidir.
Kurum No
Kurum İsmi
Şehir
Adres
221214
BilgeAdam
İstanbul
Barbaros
Bulvarı
Beşiktaş
Bu durumda, projeler ve kurum tablosu arasında bire sonsuz bir ilişki olduğu
için, projeler tablosuna hangi kuruma ait olduğunu belirtmek için bir Yabancı
Anahtar eklenir.
Proje No
Proje
Saat
Kurum No
100
Uzmanlık
Kitabı
300
221214
101
Mühendislik
Kitabı
350
221214
20
Modül 1: Programlamaya Giriş
Üçüncü Normal Form
Üçüncü Normal Form
ƒ Primary Key ile direk ilişkisi bulunmayan
alanlar ayrı bir tabloya alınır.
Üçüncü normal formda tablonun, Birincil Anahtar ile direk ilişkisi
bulunmayan, ancak diğer alanlara bağlı alanlar bulunur. Örneğin kurumlar
tablosunda şehir ismi alanı, kurum ile doğrudan bağlantısı yoktur. Adres alanı
ile daha çok bağlantılıdır. Bu alanların ayrı bir tabloya alınması üçüncü derece
normalizasyondur.
Tablolar ayrıldıktan sonra aralarındaki ilişkiler belirlenmelidir. Bu örnekte bir
kurumun birden fazla adresi olabilir. Ancak bir adres, sadece bir kuruma aittir.
Kurum No
Kurum İsmi
221214
BilgeAdam
Adres No
Şehir
Adres
Kurum No
17982
İstanbul
Barbaros Bulvarı
Beşiktaş
221214
Üçüncü normal forma getirilen tabloların diğer formların da kısıtlarını sağlaması
gerekir. Adres tablosundaki şehirler alanı, her adres için tekrarlanacaktır. Bu da
ikinci normal form kuralının ihlali demek olur. Dolayısıyla şehir alanını ayrı bir
tablo olarak ayırmak gerekir.
21
Konu: 1
Şehir No
Şehir İsmi
34
İstanbul
Adres No
Şehir No
Adres
Kurum No
17982
34
Barbaros Bulvarı
Beşiktaş
221214
(Sehirler Ornek_İlişkiler)
Uygulama: Alışveriş Modeli
Bir e-ticaret internet sitesinin hedefi, ürünlerin büyük kitlelere satışını
gerçekleştirmektir. İnternet kullanıcıları bu hedef kitleyi oluşturur. Satılan
ürünler, bu kullanıcılara çeşitli hizmetler sunularak pazarlanmalıdır.
Veritabanında ürünlerin tutulması, stok durumlarının ve siparişlerin gözlenmesi
kadar kullanıcı kayıtlarının tutulması, yeni kampanyaların açılması, ürünler
hakkındaki yorumların tutulması gibi kavramlar da önemlidir. Veritabanının
tasarlanmasında bu kavramlar tek tek ele alınıp incelenmelidir.
Kaynak yönetimi modülü
E-ticaret firmasının ürünlerinin yönetimi, stok, sipariş ve firma bilgilerinden
oluşur. Ürünlerin stoklardaki durumları takip edilmeli ve gerektiği zaman
firmalardan tedarik edilmeleri gerekir. Dolayısıyla ürünler, firmalar, siparişler,
stoklar bu modülde işlenmelidir.
Ürünler:
Bu tablo, ürünlerin detaylı bilgilerini tutar. Ürünün ismi, birim fiyatı, eklenme
tarihi, özellikleri, üretimde olup olmadığı, incelenme sayısı gibi bilgilerin tutulur.
Ürünlerin hangi kategoride oldukları ve sağlayıcı firma bilgileri de tutulmalıdır.
Ancak kategori ismi kolon bazında birçok defa tekrarlanacağı için ikinci
normalizasyon kuralına göre ayrı bir tabloya alınmalıdır. Sağlayıcı firma bilgileri
de aynı şekilde ayrı bir tabloda tutulmalıdır. Bu durumda bire sonsuz bir ilişki
oluşur. Yani bir firma birden fazla ürün sağlar, ancak bir ürün sadece bir firma
tarafından sağlanır. Dolayısıyla bu iki alan Yabancı Anahtar olarak
tanımlanmalıdır.
22
Modül 1: Programlamaya Giriş
Firmalar:
Firma bilgileri ayrı bir tablo olarak tutulur. Bilgi olarak adres, müşteri temsilcisi
ismi, e-posta ve web sayfası tutulur.
Siparişler:
Ürünler satın alındıktan sonra, sipariş bilgisi olarak kayda geçer. Siparişlerin
nakliye ücreti, sipariş verilme ve gönderilme tarihi, havale ile ödeme
durumlarında son ödeme tarihi, gönderilecek adres, ödenip ödenmediği ve
Konu: 1
23
siparişin iptal edilip edilmediği gibi bilgileri tutulur. Ayrıca siparişin hangi kayıtlı
kullanıcının verdiğini de tutmak gerekir. Bir siparişi sadece bir kullanıcı verebilir
ve bir kullanıcı birden fazla sipariş verebilir. Dolayısıyla bir sonsuz bir ilişki
oluşturmak için kullanıcı numarası Yabancı Anahtar olarak tanımlanmalıdır.
Siparişler ile ürünler arasında sonsuza sonsuz bir ilişki vardır. Yani bir siparişte
birden fazla ürün bulunabilir. Bir kullanıcı aynı anda birden fazla ürün almak
isteyebilir. Aynı şekilde bir ürün birden fazla siparişte bulunabilir. Yani bir ürün
birden fazla kullanıcıya satılabilir. Bu durumda siparişler ile ürünler arasında
ayrı bir tablo yapılması gerekir.
Bu ara tablo, bir siparişteki bir ürün bilgisini tutacaktır. Dolayısıyla bu tabloyu
daha etkin bir şekilde kullanılabilir. Örneğin belli bir siparişte bir üründen kaç
tane alındığı ancak bu tabloda tutulabilir. Ve bu ürün, yapılan bir kampanyadan
alınıyor olabilir. Böylece bu kayıtta kampanya bilgilerinin de tutulması gerekir.
24
Modül 1: Programlamaya Giriş
Stok Merkezleri:
Ürünlerin belirli şehirlerde veya belirli merkezlerdeki stokları tutulması gerekir.
Siparişin verildiği yere en yakın stoktan ürün göndermek için bu stok
bölgelerinin tutulması gerekir. Bu stokun adres, e-posta, merkez olup olmadığı
bilgileri tutulmalıdır.
25
Konu: 1
Stok ile ürünler arasında sonsuza sonsuz bir ilişki vardır. Yani bir stok
merkezinde birden fazla ürün bulunabilir ve bir ürün birden fazla stok
merkezinde bulunabilir. Bu ilişki için ara bir tablo yapılmalıdır.
Müşteri yönetim modülü
Kaynak planlamaları yapıldıktan sonra, bu kaynakların müşteriye ne şekilde
sunulacağına karar verilmelidir. Kullanıcılar internet sitesini kullanırken
kendilerine bir hesap açabilirler. Ve siparişlerini bu hesap ile yaptıklarında,
kendilerine ait istatistikleri kolayca elde edebilirler. Örneğin bir kullanıcı, en çok
hangi kategoride ürünleri satın aldığını sorgulayabilir. Kullanıcılar, siparişlerini
vermeden önce ürünlerle ilgili bilgi almak isteyebilir. Bu ürünleri daha önce alan
kullanıcıların yazdıkları yorumlardan faydalanmaları için, ürün yorumlarının da
tutulması gerekir. Ayrıca kullanıcıya değişik tarihlerde açılan, belli süreli
kampanyaların sunulması e-ticaret sitesinin kullanımını artıracaktır. Kullanıcılar
ürünleri incelerken, satın almadan önce sepetlere ekleyebilirler. Böylece siteyi
tekrar ziyaret edince, daha önceden inceledikleri ve sepete ekledikleri ürünleri
görebilirler.
Kullanıcılar:
Bu tabloda kullanıcı hakkında bilgiler tutulur. İsim, soyadı, e-posta, kayıt tarihi
gibi bilgilerin yanı sıra siteye giriş yapmak için kullanıcı adı ve parolanın da
tutulması gerekir. Bu parolanın değişikliği durumda güvenlik sorusu ve cevabı
da ayrıca tutulmalıdır.
26
Modül 1: Programlamaya Giriş
Yorumlar:
Kullanıcıların yaptıkları yorumların bir tabloda tutulması gerekir. Ancak burada
dikkat edilmesi gereken nokta, bir kullanıcının yorum yazması için sisteme giriş
yapması gerekmez. Dolayısıyla burada kullanıcılar tablosuna bir referans
göstermeye gerek yoktur. Yorumları yazan kişileri takma adları, yazdığı
yorumlar, tarih ve verdiği puan tutulmalıdır.
Ayrıca yorumun hangi ürün hakkında yapıldığını belirten ve ürünler tablosuna
referans gösteren bir Yabancı Anahtaralanının tutulması gerekir.
Konu: 1
27
Sepetim:
Kullanıcıların ürünleri inceledikten sonra sepetlerinde saklaması için
oluşturulan bir tablodur. Bu tabloda ürün numarası ve kullanıcı numarasına
referans gösterilmelidir. Bu ürünlerin eklenme tarihi ve adeti de tabloda
tutulmalıdır.
Kullanıcılar ürünleri, sürekli sepete ekleyip çıkartabilir. Çıkarma işleminde,
verinin tablodan silinmesi gerekir. Ancak bir kaydın sürekli eklenip silinmesi
performansı düşürür. Dolayısıyla ürünün sepetten çıkartıldığını belirleyen bir
yes/no veri tipinde alan belirlenebilir. Bu alanın değeri evet ise ürün sepettedir
ve kullanıcıya gösterilir. Ürünün tekrar ekleme işleminde ise sadece bu alan
güncellenir.
Kampanyalar:
Kullanıcıya sunulan kampanyalar e-ticaret kavramında önemli bir yer alır. Bu
kampanyalar bir ya da birden fazla ürünün belli tarihler arasında toplam fiyatta
belli bir indirim yapılmasıyla gerçekleşir. Kampanya tablosunda kampanyanın
başlangıç bitiş tarihleri, devam edip etmediği, ve yapılan indirim birer alan
olarak tutulmalıdır.
28
Modül 1: Programlamaya Giriş
Bu durumda bir kampanyada birden fazla ürün olabilir. Bir ürün ise birden fazla
kampanya dâhilinde olabilir. Dolayısıyla ara tablo eklenerek sonsuza sonsuz
bir ilişki kurulmalıdır.
29
Konu: 1
Modül Sonu Soruları & Alıştırmalar
Özet
 Menüler
ÂMainMenu, ContextMenu
Â
Â
Â
Â
Â
ToolBar
ToolTip
StatusBar
NotifyIcon
RichTextBox
1. Veritabanı yönetim sistemi kavramını ve bu sistemlere neden ihtiyaç
duyulduğunu açıklayın.
2. Microsoft Access platformunun avantajlarını açıklayın.
30
Modül 1: Programlamaya Giriş
3. Microsoft Access'te yer alan veri türlerini ve kullanım alanlarını açıklayın.
4. Birincil Anahtar ve Yabancı Anahtar yapılarını ve kullanım alanlarını
açıklayın. Örnek bir veri tabanı geliştirin.
Modül 12: SQL Giriş
Hedefler
Â
Â
Â
Â
Â
Select cümlesi: Sorgulama
Update cümlesi: Güncelleme
Insert cümlesi: Veri Ekleme
Delete cümlesi: Silme
Join: Tabloları birleştirme
SQL dili (Structured Query Language), veritabanları üzerinde sorgu yapmak
için kullanılan bir dildir. Sorgular, analiz aşamalarında, veri eklerken
güncellerken ve silerken kullanılır. Sorgular tek bir tablo üzerinde yapılabileceği
gibi birçok tablodan veri okunmayı sağlar. Sorgular üzerinde konan kriterler,
detaylı veri analizi yapmak için kullanılır.
Bu modülü tamamladıktan sonra
•
Select cümleleri ile tablo sorgulayabilecek,
•
Kriterler,
hesaplama
şekillendirebilecek,
•
Update sorgusu ile tabloları güncelleyebilecek,
•
Insert sorgusu ile tablolara veri ekleyebilecek,
•
Delete sorgusu ile tablolardan veri silebilecek,
•
Join ile birden fazla tabloyu birleştirip sorgu çalıştırabileceksiniz.
fonksiyonları
kullanarak
sorguları
2
Modül 1: Programlamaya Giriş
Access ile Sorgu Oluşturmak
Access ile sorgu oluşturmak
ƒ Tasarım görünümünde sorgu
ƒ Sihirbaz ile sorgu
Access ile sorguları görüntülemek, oluşturmak için veritabanı penceresinden
sorgular sekmesi seçilir. Sorgular iki şekilde oluşturulabilir.
• Tasarım görünümünde sorgu
Sorgular, istenen tablolar ve gerekli alanlar eklenerek oluşturulur. Burada
sorgunun üç farklı görünüm şekli vardır. Tasarım görünümü, SQL
görünümü ve Veri sayfası görünümü.
Tasarım görünümünde sorgular, tabloların görsel olarak eklenip,
alanlarının seçilmesi ile oluşturulur. Tabloları bağlama işlemleri, kriterler ve
alan isimlerinin SQL diline çevrilmesi Access tarafından yapılır.
Konu: 1
3
SQL görünümünde sorgular, SQL cümlesinin kullanıcı tarafından yazılarak
oluşturulur. Bu modülde sorgular, bu görünümde oluşturulacaktır.
Veri sayfası görünümünde, SQL sorgusunu çalıştırıldıktan sonra verilerin
görünümüdür. SQL sorguları çalıştırıldıktan sonra da bu görünüme geçilir.
• Sihirbaz ile sorgu
Access sihirbazı, tablolar üzerinde yapılacak sorguların kolay ve hızlı bir
şekilde oluşturulmasını sağlar.
4
Modül 1: Programlamaya Giriş
Select From Where
Select Sorgusu
ƒ Tablolardan veri çekmek için kullanılır.
ƒ From ile tablolar belirtilir.
ƒ Where ifadesinden sonra kriterler yazılır.
SELECT Alanlar
FROM Tablo İsmi
WHERE Kriterler
SELECT Urunler.Isim, Urunler.BirimFiyat
FROM Urunler
WHERE Urunler.Isim LIKE '*Studio*'
Select sorgusu tablolardan veri kümesi çekmek için kullanılan sorgudur.
Sorgunun yapısı Select Alanlar From Tablo İsmi Where Kriterler şeklindedir.
Bu cümlede Select kelimesinden sonra gelen alanlar, tabloları oluşturulan
kolonlardır. Sonuç kümesinde, tablonun hangi alanları olacağını gösterir.
Burada yapılan kolon bazında filtrelemedir.
5
Konu: 1
From ifadesi, sorgunun hangi tablo veya tablolar üzerinde yapılacağını gösterir.
Where ifadesinden sonra, sorgu kümesinde, verilen kritere uyan satırlar
görüntülenir. Bu yapılan satır bazında filtrelemedir.
SELECT * FROM Urunler
Buradaki yıldız ifadesi, tüm alanların listeleneceği anlamına gelir.
SELECT
Urunler.Isim,
Urunler.BirimFiyat,
Urunler.EklenmeTarihi
FROM Urunler
Select ifadesinde alanların ismi verilirken, hangi tabloya ait olduğu da yazılır.
Ancak bu durum tek tablo üzerinden yapılan işlemler için gerekli değildir. Birkaç
tablo üzerinde sorgu yapıldığı zaman, alanları tablo ismiyle belirtmek gerekir.
SELECT
Isim,
BirimFiyat,
EklenmeTarihi
FROM Urunler
Where ifadesinden sonra yazılan kriterler mantıksal karşılaştırmalardır. Bu
karşılaştırmalar alanlardaki değerler üzerinde yapılır. Karşılaştırmalar aritmetik
olabildiği gibi metinsel de olabilir.
• Büyük
Alandaki değerin verilen bir değerden veya başka bir alandan büyük
olduğunu kontrol eder.
SELECT Urunler.*
FROM Urunler
WHERE Urunler.IncelenmeSayisi > 100
• Büyük Eşit
Verilen bir alanın veya değerin, kontrol edilen alandan büyük veya alana
eşit olduğunu kontrol eder.
SELECT Urunler.*
6
Modül 1: Programlamaya Giriş
FROM Urunler
WHERE Urunler.IncelenmeSayisi >= 100
• Küçük
Alandaki değerin verilen bir değerden veya başka bir alandan büyük
olduğunu kontrol eder.
SELECT Urunler.*
FROM Urunler
WHERE Urunler.IncelenmeSayisi < 100
• Küçük Eşit
Verilen bir alanın veya değerin, kontrol edilen alandan küçük veya alana
eşit olduğunu kontrol eder.
SELECT Urunler.*
FROM Urunler
WHERE Urunler.IncelenmeSayisi <= 100
• Between - And
Alandaki değerin iki değer arasında olduğunu kontrol eder. Değerlere eşit
oldukları durumlar da sonuç kümesine dâhil edilir.
SELECT Urunler.*
FROM Urunler
WHERE Urunler.IncelenmeSayisi BETWEEN 100 AND 200
•
Not
Verilen kritere uymayan kayıtları döndürür.
SELECT Urunler.*
FROM Urunler
WHERE NOT Urunler.IncelenmeSayisi = 0
•
Like
Alandaki değerin belirli bir metin biçimde olduğunu kontrol eder.
SELECT Alanlar FROM Tablo WHERE AlanIsmi LIKE ‘Pattern’
Pattern ifadesinde yazılan karakterler, alanların içinde kesin olarak
geçecek karakterlerdir. Örneğin Isim LIKE ‘Enis’. Ancak bazı özel
karakterler farklı anlam ifade ederler. Örneğin * karakteri sıfır veya daha
fazla karakteri temsil eder. Isim LIKE ‘*ni*’ ifadesi sıfır veya daha
fazla karakter ile başlayan, ni ile devam eden ve yine sıfır veya daha
fazla karakter ile biten kelimeleri kontrol eder. Örneğin Deniz, Nil, Seni, Ni
değerleri bu biçime uyacaktır.
Pattern
Örnek
değeri
döndüren
örnek
True
değeri
döndüren
örnek
False
7
Konu: 1
Sıfır veya birden
fazla karakter *
Nu*
Nuray, Nuri
Banu
Özel
karakterlerin
kullanımı
Beş [*]
Beş *
Beşiktaş
Tek karakter ?
Ç?n
Çan, Çin
Çıban, Çanak
Tek Sayı #
Versiyon #
Versiyon
Versiyon 1
Karakter Aralığı
[a-z]
a, b, c
43, 2
Aralık Dışı
[!0-9]
a, b, c
1, 2, 3
5,
Versiyon
10,
Versiyon Üç
Örnek: Microsoft Studio ürünlerin listelenmesi
SELECT Urunler.Isim
FROM Urunler
WHERE Urunler.Isim Like '*Studio*'
•
Is Null
Bazı alanların değerleri boş bırakılmış olabilir. Boş bırakılan alanların
değerleri Null olarak geçer. Sorgularda boş alanların kontrolü Is Null
ifadesi ile yapılır.
SELECT Urunler.*
FROM Urunler
WHERE Urunler.Ozellikler Is NULL
Bir sorguda birden fazla kriter kullanılabilir. Ancak bu kriterlerin AND veya OR
ifadeleri ile ayrılmaları gerekir. AND ifadesi ile ayrılan kriterlerin hepsinin
sağlandığı satırlar sonuca dâhil edilir. OR ifadesi ile ayrılan kriterlerin herhangi
biri sağlandığı satırlar sonuca dâhil edilir.
Örnek: 12.12.2002 den sonra kaydolmuş, ismi E ile başlayan kullanıcılar.
SELECT *
FROM Kullanicilar
WHERE Kullanicilar.KayitTarihi > #12/12/2002# AND
Kullanicilar.Isim Like 'E*';
E-posta adresi veya web adresi olan firmalar.
SELECT Firmalar.Isim, Firmalar.Email, Firmalar.WebSayfasi
FROM Firmalar
8
Modül 1: Programlamaya Giriş
WHERE ((Not (Firmalar.Email) Is Null)) OR ((Not
(Firmalar.WebSayfasi) Is Null));
Hesaplama Fonksiyonları
Hesaplama Fonksiyonları
ƒ
ƒ
ƒ
ƒ
ƒ
Sum – Toplam
Avg – Ortalama
Max – Maksimum
Min – Minimum
Count – Sayma
ƒ AS anahtar kelimesi ile sonuç alanına
mantıksal isim verilir.
SELECT Count(KullaniciId) AS [Toplam Kullanıcı Sayısı]
FROM Kullanicilar;
Alanlar üzerinde sayma, toplama, ortalama alma gibi aritmetik işlemlerin yanı
sıra minimum maksimum değerlerin alınması gibi işlemler de yapılabilir. Bu
işlemlerin sonucunda sayısal bir sonuç ortaya çıkar. Bu sayı, sonuç tablosunda
gösterilirken herhangi bir alan ismi ifade etmez. Dolayısıyla sonuç tablosunda
sayısal değerleri gösterilirken mantıksal bir isim verilmesi gerekir. Bu ifade ise
AS anahtar kelimesi ile belirtilir.
Sum
Kriterlerin sağlandığı alanlar üzerinde toplama işlemi yapar.
SELECT Sum(IncelenmeSayisi) AS [Toplam Incelenme Sayisi]
FROM Urunler WHERE Uretiliyormu = -1;
9
Konu: 1
Avg
Kriterlerin sağlandığı alanların ortalama değerini alır.
SELECT Avg(Urunler.BirimFiyat) AS [Ortalama Fiyat]
FROM Urunler WHERE Uretiliyormu = -1;
Max
Kriterlerin sağlandığı alanların maksimum değerini alır. Metinsel değerlerde
alfabetik olarak sıralama yapar.
SELECT Max(Isim) AS [En son geçen kullanıcı]
FROM Kullanicilar;
SELECT Max(KayitTarihi) AS [En son kaydolan kullanıcı]
FROM Kullanicilar;
10
Modül 1: Programlamaya Giriş
Min
Kriterlerin sağlandığı alanların minimum değerini alır.
SELECT Min(Isim) AS [En başta geçen kullanıcı]
FROM Kullanicilar;
SELECT Min(KayitTarihi) AS [İlk kaydolan kullanıcı]
FROM Kullanicilar;
Count
Değeri Null olmayan satırların kaç tane olduğunu verir. Genellikle tablolardaki
satır sayısı istendiğinde bu fonksiyon kullanılır. Ancak bu tip bir sorguda,
sayılan alanın boş bir değer almaması gerekir. Primary Key alanının
üzerinden bir sayım yapılabilir.
SELECT Count(KullaniciId) AS [Toplam Kullanıcı Sayısı]
FROM Kullanicilar;
11
Konu: 1
Insert
Insert Sorgusu
ƒ Tablolara veri eklemek için kullanılır.
INSERT INTO Tablo (Alan1, Alan2,…)
VALUES (Değer1, Değer2…)
INSERT INTO Siparisler (KullaniciId, NakliyeUcreti,
SiparisTarihi, SonOdemeTarihi, Adres )
VALUES (1, 3, '20.05.2005', '25.05.2005', 'Beşiktaş
Istanbul')
ƒ Insert Select cümlesi ile birden fazla
satır tabloya eklenir.
Insert sorguları tablolara kayıt eklemek için kullanılır. Bu kayıtlar eklenirken
tablo isimi, alan adı ve hangi değerlerin ekleneceği belirtilmelidir. Insert
sorgularında dikkat edilmesi gereken nokta, gerekli olan (Null kabul etmeyen)
alanlara değer eklenmesi unutulmamalıdır.
Sözdizimi:
INSERT INTO Tablo (Alan1, Alan2,…) VALUES (Değer1, Değer2…)
Values ifadesinde verilen değerler, tablonun yazılan alanlarıyla aynı sırada
olması gerekir.
INSERT INTO Siparisler ( KullaniciId, NakliyeUcreti,
SiparisTarihi, SonOdemeTarihi, Adres )
VALUES (1, 3, '20.05.2005', '25.05.2005', 'Beşiktaş
Istanbul')
Bu tip Insert sorgularında sadece tek bir değer girilebilir. Ancak bazı
durumlarda birden fazla verinin girilmesi istenebilir. Bu durumda, girilecek
değerler Select cümlesiyle başka bir tablodan alınır.
Örnek: Ödenen siparişlerin tutulduğu ayrı bir tablo oluşturulur. Sipariş
tablosundan bu tabloya tüm ödenen kayıtların aktarılması işlemi Insert
Select cümlesi ile yapılır.
INSERT INTO OdenenSiparisler ( SiparisId, KullaniciId,
NakliyeUcreti, SiparisTarihi, GonderilmeTarihi, Adres)
12
Modül 1: Programlamaya Giriş
SELECT SiparisId, KullaniciId, NakliyeUcreti, SiparisTarihi,
GonderilmeTarihi, Adres
FROM Siparisler
WHERE Odendi = -1;
Update
Update Sorgusu
ƒ Tablolarda veri güncellemek için
kullanılır.
UPDATE Tablo
SET Alan1 = Değer1, Alan2 = Değer2, …
UPDATE Kullanicilar
SET ParolaSorusu = 'Yeni Soru', ParolaCevabi = 'Yeni Cevap'
WHERE KullaniciId = 23
ƒ Sorgu yazılırken Where kriterinin
unutulmaması gerekir.
Update sorguları tablolarda var olan kayıtların belirli alanlarının güncellenmesi
işlemini yapar. Bu sorguda da tablo, alan ve yeni değerlerin belirtilmesi gerekir.
Sözdizimi:
UPDATE Tablo SET Alan1 = Değer1, Alan2 = Değer2, …
Bu sorguda dikkat edilmesi gereken en önemli nokta, belli kayıtlarda
güncelleme işlemi yapılıyorsa WHERE kriterinin unutulmaması gerekir. Aksi
halde tablodaki tüm kayıtlar, sorguda belirlenen değerleri alacaktır.
Örnek:
UPDATE Kullanicilar
SET ParolaSorusu = 'Yeni Soru', ParolaCevabi = 'Yeni Cevap'
WHERE KullaniciId = 23
13
Konu: 1
Delete
Delete Sorgusu
ƒ Tablolardan veri silmek için kullanılır
DELETE FROM Tablo
DELETE FROM Sepetim WHERE KullaniciId = 12
Tablodan veri silmek için kullanılır. Bu sorguda alan isimleri belirtilmez, ancak
WHERE kriterinin unutulmaması gerekir.
Sözdizimi:
DELETE FROM Tablo İsmi
Örnek:
DELETE FROM Sepetim Where KullaniciId = 12
14
Modül 1: Programlamaya Giriş
INNER JOIN
Inner Join
ƒ Tabloları birleştirmek için kullanılır.
ƒ Primary Key ve Foreign Key alanları
üzerinden birleştirme yapılır.
SELECT Alanlar
FROM Tablo1 AS isim1 INNER JOIN Tablo2 AS isim2
ON isim1.Alan = isim2.Alan
SELECT StokDurumu.Adet, Urunler.Isim
FROM
Urunler INNER JOIN
StokDurumu ON Urunler.UrunId = StokDurumu.UrunId;
Birden fazla tablodan kayıt çekilmek istendiğinde, bu tabloların Primary Key
ve Foreign Key alanları üzerinden birleştirilmeleri gerekir. Tabloları
birleştirmek, birçok bilgiyi sonuç kümesinde tek bir tablo olarak göstermeyi
sağlar. Örneğin bir ürünün hangi kategoride olduğu bilgisi ürünler tablosunda
vardır. Ancak bu değer o kategori numarasını belirttiği için, son kullanıcıya bir
şey ifade etmez. Kategori ismi ise, kategoriler tablosunda durur. Sonuç
kümesinden kategori ismini görüntülemek için bu tabloların birleştirilmesi
gerekir.
Sözdizimi:
SELECT Alanlar
FROM Tablo1 AS isim1 INNER JOIN Tablo2 AS isim2
ON isim1.Alan = isim2.Alan
Burada tablo isimlerine birer takma isim verilmiştir. Bu isimler alanların
seçiminde yazım kolaylığı sağlar. Bazı alanlar birbirleriyle aynı isimde oldukları
için bu alanın hangi tabloya ait olduğu belirtilmelidir. Alan isimleri
SELECT isim1Alan1, isim1.Alan2, …, isim2.Alan1, isim2.Alan2
FROM Tablo1 AS isim1 INNER JOIN Tablo2 AS isim2
ON isim1.Alan = isim2.Alan
İki tablonun birleştirme işlemi, ON ifadesinden sonra belirtilen alanlar üzerinden
yapılır. Burada, iki tablo arasında ilişki kurulan alanlar belirtilmelidir.
15
Konu: 1
Örnek: Ürünlerin stoklardaki miktarını öğrenmek için stok ve ürünler tablolarını
birleştirmek gerekir.
SELECT
StokDurumu.Adet,
Urunler.Isim
FROM
Urunler INNER JOIN
StokDurumu ON Urunler.UrunId = StokDurumu.UrunId;
İkiden fazla tablodan bilgi çekmek için, önce iki tablo birleştirilir. Sonuç olarak
çıkan tablo ile de diğer tablolar tek tek birleştirilir. Birleştirme işlemi ((Tablo1 +
Tablo2) + Tablo3) + Tablo4… şeklindedir. Inner Join kullanılırken
parantezlerin unutulmaması gerekir.
Örnek: Bir kullanıcının sepetindeki ürünlerin birim fiyatları sorgulanmak
istendiği zaman kullanıcılar, sepetim, ürünler tabloları ilişkide oldukları alanlar
üzerinden birleştirilmelidir.
SELECT
k.Isim,
k.Soyad,
s.Adet,
u.BirimFiyat
FROM
(Urunler u INNER JOIN
Sepetim AS s ON u.UrunId = s.UrunId) INNER JOIN
Kullanicilar AS k ON k.KullaniciId = s.KullaniciId
WHERE k.KullaniciId = 1
16
Modül 1: Programlamaya Giriş
Group By
Group By
ƒ Aynı verilerin gruplanmasıdır.
ƒ Hesaplama fonksiyonları ile kullanılır.
ƒ Hesaplama fonksiyonunda
kullanılmayan alanlar gruplanmalıdır.
SELECT k.Isim, k.KategoriId,
SUM(u.BirimFiyat) AS [Toplam Fiyat],
COUNT(UrunId) AS [Ürün Sayısı]
FROM
Urunler u INNER JOIN
Kategoriler k ON u.KategoriId = k.KategoriId
GROUP BY k.KategoriId, k.Isim
Hesaplama fonksiyonlarının kullanıldığı sorgularda Select ifadesinden sonra
sadece hesaplanan alan sonuç kümesine eklenmişti. Ancak çoğu zaman,
hesaplanan bir alanlar ile birlikte diğer alanların da sonuç kümesinde olması
istenir.
Örneğin belli bir kategoride kaç tane ürünün bulunduğu, kategori numarası
sonuç kümesinde olacak şekilde isteniyor. Bu durumda, ürünler tablosundaki
kayıtların sayma işleminin gerçekleştirilmesi için önce kategori numarasına
göre gruplanması gerekir.
SELECT
k.KategoriId,
COUNT(UrunId) AS [Ürün Sayısı]
FROM
Urunler u INNER JOIN
Kategoriler k ON u.KategoriId = k.KategoriId
GROUP BY k.KategoriId
Tablodan kategori numarası dışında başka herhangi bir alan daha isteniyorsa,
bu alan Group By ifadesine ya da bir hesaplama fonksiyonunun içine
alınmalıdır.
SELECT
k.Isim,
k.KategoriId,
Sum(u.BirimFiyat) AS [Toplam Fiyat],
17
Konu: 1
COUNT(UrunId) AS [Ürün Sayısı]
FROM
Urunler u INNER JOIN
Kategoriler k ON u.KategoriId = k.KategoriId
GROUP BY k.KategoriId, k.Isim
Aritmetiksel İşlemler
Aritmetiksel İşlemler
ƒ Toplama, Çıkarma, Bölme, Çarpma
SELECT Urunler.Isim, BirimFiyat * 1.18 AS [KDV Dahil Fiyat]
FROM Urunler
Sorgular sırasında, alanlar üzerinde toplama, çıkarma, çarpma, bölme gibi
aritmetiksel işlemler yapılabilir. Bu işlemler sabit değerler ile yapılabildiği gibi
başka alanlardaki değerler ile de yapılabilir.
Örnek: Birim fiyatlarının KDV eklenmiş halini gösteren sorgu.
SELECT
Urunler.Isim,
BirimFiyat * 1.18 AS [KDV Dahil Fiyat]
FROM Urunler
18
Modül 1: Programlamaya Giriş
SELECT
Sum(BirimFiyat) * 1.18 AS [Toplam Ürünler Fiyatı KDV Dahil]
FROM Urunler
Örnek: Stoklarda, rezerve edilmemiş toplam ürün sayısı
SELECT Urunler.Isim, Sum(StokDurumu.Adet StokDurumu.Rezerve) AS [Açık Ürün Sayısı - Tüm Stoklar]
FROM Urunler INNER JOIN StokDurumu ON Urunler.UrunId =
StokDurumu.UrunId
GROUP BY Urunler.Isim;
Toplama işlemi, sayılar üzerinde yapılabildiği gibi metinsel değerler üzerinde de
birleştirme görevi görür.
Örnek: Kullanıcıların isim ve soyadlarının beraber görüntülenmesi
SELECT
Kullanicilar.Isim + ' ' + Kullanicilar.Soyad AS [İsim Soyad]
FROM Kullanicilar
Modül Sonu Soruları & Alıştırmalar
Özet
 Menüler
ÂMainMenu, ContextMenu
Â
Â
Â
Â
Â
ToolBar
ToolTip
StatusBar
NotifyIcon
RichTextBox
1. Select ifadesinin kullanım alanını açıklayın ve bir örnek SQL cümlesi
geliştirin.
Konu: 1
19
2. Insert ifadesinin kullanım alanını açıklayın ve bir örnek SQL cümlesi
geliştirin.
3. Update ifadesinin kullanım alanını açıklayın ve bir örnek SQL cümlesi
geliştirin.
4. Delete ifadesinin kullanım alanını açıklayın ve bir örnek SQL cümlesi
geliştirin.
5. Delete ve Update ifadelerini kullanırken dikkat etmemiz gereken noktaları
açıklayın.
6. Cascade Delete ve Cascade Update ifadelerini içeren bir veri tabanı
uygulaması geliştirin ve silme durumunu gözlemleyin.
Modul 1:
ADO.NET
2
Modül 1: Geliştirme Ortamını Tanımak
Bu modülde, Visual Studio .NET ortamını ile tanışacak ve içerisinde kullanılan
temel proje bileşenleri hakkında genel bilgiler verilecektir. Ayrıca çalışma
zamanı hatalarını yakalamayı ve uygulamayı derlemeyi öğreneceksiniz.
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
Bu modül tamamlandıktan sonra:
Proje oluşturabilecek,
Projeye referans ekleyebilecek,
Projeye isim alanı ekleyebilecek,
Proje özelliklerini değiştirebilecek,
Dinamik yardım alabilecek,
Proje içerisine görevler ekleyebilecek
Çalışma zamanı hatalarını yakalayabilecek,
Uygulamaları derleyebileceksiniz.
ADO.NET
3
Modül 1:
Konu 1: C# .NET ile Proje Oluşturmak
C# ortamı, C#.NET projelerini kolay bir şekilde oluşturma imkanı sağlar.
Projenin çalışması için gereken dosyaları otomatik olarak ekler. Projenin
geliştirilme aşamasında yeni bileşenlerin eklenmesi, menü ve araç çubukları ile
kolay bir şekilde gerçekleştirilir.
ADO.NET
4
Proje Şablonu Seçmek
C#.NET ile Windows tabanlı, Web tabanlı gibi çeşitli projeler geliştirilebilir. Bu
projeler farklı platformlarda çalışacağı veya farklı amaçlara yönelik
oluşturulacağı için, başlangıç bileşenleri farklılık gösterecektir. Örneğin
Windows tabanlı projeler için Windows formlarının kullanılması ve bazı
referansların eklenmesi gerekir. Visual Studio ortamının sağladığı şablonlar,
proje dosyalarının başlangıç kodlarını otomatik olarak yazıp gerekli referansları
ekleyerek geliştiriciye hızlı bir başlangıç sağar.
•
Windows Application
Windows tabanlı uygulamalar geliştirmek için kullanılır.
•
Class Library
Diğer projeler için class kütüphaneleri sağlayan DLL (Dynamic Link Library)
oluşturmak için kullanılır. Bu bileşenler projelere Reference olarak eklenerek
tekrar kullanılır.
•
Windows Control Library
Kullanıcı tanımlı Windows kontrolleri oluşturmak için kullanılır. Bu kontroller
Windows uygulamalarında, birçok formda tekrar kullanılmak üzere tasarlanır.
•
Smart Device Application
Mobil cihazlar üzerinde uygulama geliştirmek için kullanılır.
•
ASP.NET Web Application
IIS (Internet Information Services) üzerinde çalışacak Web uygulamaları
geliştirmek için kullanılır.
•
ASP.NET Web Service
ADO.NET
5
Modül 1:
Web uygulamalarına XML Web Service sağlayan projeler geliştirmek için
kullanılır. Oluşturulan bu projeler, diğer uygulamalara Web Reference olarak
eklenir.
•
Web Control Library
Web uygulamalarında, kullanıcı tanımlı kontroller oluşturmak için kullanılır.
•
Console Application
Komut penceresinde çalışacak konsol uygulamaları geliştirmek için kullanılır.
•
Windows Service
Windows altında sürekli çalışan uygulamalar için kullanılır. Bu uygulamalar,
kullanıcıların sisteme giriş yapmadığı durumlarda da çalışmaya devam eder.
•
Other Projects
Enterprise Applications (Şirket uygulamaları), Deployment Projects (Yükleme
projeleri), Database Projects (Veritabanı projeleri) gibi değişik şablonlardır.
•
Empty Project
Herhangi bir şablon uygulanmadan açılan Windows projelerdir. Başlangıç
nesnesi ve referanslar eklenmez.
•
Empty Web Project
Herhangi bir şablon uygulanmadan açılan Web projelerdir. Bu proje IIS
üzerinde tanımlanır ancak form ve referans nesneleri eklenmez.
•
Blank Solution
Başlangıç olarak bir proje açılmaz. Boş bir solution dosyası açılır. İstenen
projeler, Add New Project komutu ile bu solution içine dâhil edilir.
Visual Studio ile yeni bir proje birkaç adımda oluşturulabilir.
1. File menüsünden New alt menüsüne işaret edin ve Project
komutunu seçin.
2. “New Project” penceresinden Visual C# Projects tipini ve
çalışmak istediğiniz şablonunu seçin.
3. Name özelliğine projeye vereceğiniz ismi yazın.
4. Location özelliği projenin dosyalarının bulunacağı yeri belirler.
Browse düğmesine basarak Windows dizinine ulaşın ve projenin
yerini seçin.
5. More düğmesine basıldığı zaman, solution dosyası için yeni bir isim
kullanılması ve ayrı bir klasör açılmasını sağlayan panel görüntülenir.
Solution için farklı bir isim vermek için Create directory for
Solution seçeneğini işaretleyin ve metin kutusuna solution için
yeni bir isim yazın.
6. OK tuşuna basıldığı zaman proje açılır. Solution için ayrı bir klasör
seçilmemişse, proje dosyaları proje ismi ile oluşturulan klasör altında
oluşturulur.
ADO.NET
6
Proje Dosyalarına Genel Bakış
Visual C# .NET ile oluşturulan bir projenin çalışması için gereken bazı dosyalar
vardır. Bu dosyaların birçoğu, projenin tipine göre farklılık gösterir. Yeni bir proje
açıldığında, projeye verilen isim ile bir klasör açılır ve proje dosyaları bu klasör
altına yerleştirilir.
• Solution Dosyaları (.sln, .suo)
Visual C# .NET projeleri bir solution dosyası (.sln) altında oluşturulur.
Solution dosyası farklı projeleri bir arada tutar ve birden fazla projeyi
içerisinde barındırır. Visual Studio ile proje oluşturulurken solution dosyası
otomatik olarak eklenir.
Solution User Option (.suo) dosyaları, kullanıcının solution ile çalışırken
yaptığı ayarları tutar ve proje tekrar açıldığı zaman bu ayarları getirir.
• Project Dosyaları (.csproj, .csproj.user)
Bir projenin içinde bulunan bileşenlerin, eklenen referansların tutulduğu proje
dosyasıdır. Visual C# projeleri .csproj uzantılı dosya ile oluşturulur. Bu dosya
aynı zamanda, bir solution içinde farklı dilde ve tipteki projeleri ayırt etmek
için kullanılır. Projeye özgü ayarlar ise .csproj.user dosyasında tutulur.
• Yerel Proje Dosyaları (.cs)
Form, class gibi bileşenlerin tutulduğu dosyalardır. Bir .cs uzantılı dosya
içinde birden class tutulabilir. Ancak projedeki her form için ayrı bir .cs dosyası
oluşturulur.
• Web Projeleri Dosyaları (.aspx, .asmx, .asax)
Web uygulamalarında oluşturulan dosyalar Web sunucusunda (ISS) tutulur. Bu
dosyalar web formları için .aspx, Web Service için .asmx, global sınıfı için .asax
uzantısına sahiptir.
ADO.NET
7
Modül 1:
Proje oluşturulduktan sonra yeni nesnelerin eklenmesi Project menüsü ile ya
da Solution Explorer paneli kullanımı ile gerçekleşir. Project menüsünden
yeni bir form, module, class, component, user control eklemek için
ilgili menü komutu seçilebilir. Add New Item komutu ile farklı tipte birçok dosya
projeye dâhil edilebilir.
Assembly Nedir?
Visual Studio .NET ortamında geliştirilen uygulamalar derlendiğinde, .exe veya
.dll uzantılı dosyalar oluşur. .NET’in otomatik olarak oluşturduğu bu dosyalara
assembly denir. Assembly içerisinde dosyaya ait başlık, açıklama ve telif hakkı
gibi kritik bilgiler tutulur.
Visual Studio .Net içerisinde geliştirilen bir projeye, farklı kişiler tarafından
geliştirilmiş assembly’ler eklenebilir. Özellikle gelişmiş projelerde assembly’ler
ayrı programcılar tarafından yazılarak ortak bir proje altında toplanabilir.
ADO.NET
8
Projeye Referans Eklemek
Herhangi bir projenin içerisine, bileşen kütüphanelerinin eklenmesi için
kullanılır. Bu bileşen kütüphaneleri, .NET ve COM bileşenlerden oluşur.
Projeye referans eklemek için belirtilen adımlar takip edin.
1. Solution Explorer penceresinden References menüsü seçin. References
menüsüne sağ tıklayın.
2. Açılan menüden Add Reference komutunu verin.
3. Açılan pencere üzerinden .NET, COM, Projects sekmelerinden herhangi birini
seçin.
.NET, projeye NET bileşen kütüphanelerini eklemek için kullanılır.
COM, projeye COM bileşen kütüphanelerini eklemek için kullanılır.
Projects, proje ile aynı solution içerisinde yer alan bileşen kütüphanelerini
eklemek için kullanılır.
4. Eklenecek assembly nesnesini seçin ve Select düğmesini tıklayın. Birden fazla
assembly seçmek için aynı işlemi tekrar edin.
5. Referans ekleme işlemini tamamlamak için OK düğmesine tıklayın.
Proje şablonları içerisinde en çok kullanılan referans’lar şunlardır:
ADO.NET
9
Modül 1:
ƒ
ƒ
ƒ
ƒ
System: Programın çalışması için gerekli en temel referanstır. System.dll
kütüphanesi içerisinde tutulur.
System.Data: Veritabanı bağlantılarının yapılması için gerekli referanstır.
System.Data.dll kütüphanesi içerisinde tutulur.
System.Drawing, System.Windows.Forms: Windows form ve kontrollerini
içeren referanstır. System.Drawing.dll ve System.Windows.Forms.dll
kütüphaneleri içerisinde tutulur.
System.XML: XML teknolojisinin kullanılmasını sağlayan referanstır.
System.XML.dll kütüphanesi içerisinde tutulur.
ADO.NET
10
İsim Alanı (Namespace) Nedir?
.NET içerisindeki tüm kütüphaneler, .NET Framework ismi verilen ortak çatı
altında toplanır. Bu çatı altındaki tüm kütüphaneler amaçlarına göre
namespace denilen isim alanı altında gruplandırılır. Bu isim alanı içerisinde
sınıflar, ara yüzler ve modüller bulunur.
.NET içerisinde veritabanı uygulamaları geliştirmek için System.Data.dll
kütüphanesine ihtiyaç duyulur. Bu kütüphane Visual Studio .NET içerisindeki
tüm proje şablonlarında otomatik olarak yer alır. System.Data.dll
kütüphanesi içerisinde;
•
•
•
•
•
•
System.Data
System.Data.Common
System.Data.SqlClient
System.Data.OleDb
System.Data.SqlTypes
System.Xml
isim alanları yer alır.
ADO.NET
11
Modül 1:
Yeni İsim Alanı Eklemek
Yeni isim alanı oluşturmak için namespace anahtar kelimesi kullanılır.
namespace Isimalani_ismi
{
...
}
Örnekte NSBilgeAdam isminde bir isim alanı tanımlanmıştır. Bu isim alanı
içerisine Egitim ve Ogrenci isminde sınıflar eklenmiştir.
namespace NSBilgeAdam
{
// BilgeAdam isim alanında kullanılacak
//Sınıf, Modul ve Arayüzler tanımlanır
class Egitim
{
//...
}
class Ogrenci
{
//…
}
// vs...
}
BilgeAdam isim alanı içindeki Ogrenci sınıfını kullanmak için, sınıf ismini, isim
alanı ile birlikte belirtilmelidir.
ADO.NET
12
bilgeadam.NSbilgeadam.Ogrenci yeniogrenci;
yeniogrenci = new bilgeadam.NSbilgeadam.Ogrenci() ;
UYARI: Proje ile aynı isimdeki bir isim alanı .NET derleyicisi tarafından yeni oluşturulan
tüm projelere eklenir. Bu genel isim alanına kök isim alanı (root namespace) denir.
Dolayısıyla kendi oluşturulan isim alanlarını, kök isim alanını ile birlikte belirtilmelidir.
Herhangi bir isim alanı içerisinde birden fazla isim alanı tanımlanabilir. Örnekte
NSBilgeAdam isim alanı içerisinde Idari, Egitim ve Ogrenci adında üç ayrı
isim alanı eklenmiştir.
namespace NSBilgeAdam
{
// BilgeAdam isim alanında kullanılacak
// Class, Module ve Interface’ler tanımlanır
namespace Idari
{
class Personel
{
}
}
namespace Egitim
{
class Grup
{
}
}
namespace Ogrenci
{
class Bilgi
{
}
}
// vs...
}
ADO.NET
13
Modül 1:
Projeye İsim Alanı Dâhil Etmek
Bir isim alanı içerisinde yer alan sınıfları tanımlamak için, sınıfın bulunduğu
kütüphanenin yolunu eksiksiz olarak belirtmek gerekir. Ancak bu şekilde
kullanımlar, kodun okunmasını oldukça zorlaştırır. Örnekte sınıflar bu yöntemle
tanımlanmıştır.
bilgeadam.NSbilgeadam.Idari.Personel kisi1;
kisi1 = new bilgeadam.NSbilgeadam.Idari.Personel();
bilgeadam.NSbilgeadam.Ogrenci.Bilgi Ogrencibilgi;
ogrencibilgi = new bilgeadam.NSbilgeadam.Ogrenci.Bilgi();
Her sınıf için kütüphane yolunun tekrarını ortadan kaldırmak için, using
anahtar sözcüğü kullanılır. using sözcüğü ile eklenen isim alanlarının
nesnelerine, proje içerisinden doğrudan erişilebilir.
Örnekte NSBilgeAdam isim alanının projeye dâhil edilmesi gösterilmektedir.
using bilgeadam.Nsbilgeadam;
NSBilgeAdam isim alanında bulunan bir sınıfı kullanmak için sadece ismini
yazmak yeterli olacaktır.
Ogrenci.Bilgi ogrenciBilgi = new ogrenci.Bilgi();
İç içe isim alanının kullanımında, içteki isim alanına kolayca erişmek için
kısaltmalar kullanılabilir. Örnekte, NSBilgeAdam isim alanı içerisindeki Ogrenci
isim alanına erişim gösterilmektedir
ADO.NET
14
using ogr = bilgeadam.NSBilgeadam.Ogrenci;
Public Class Form1:System.Windows.Forms.Form
{
//
...
ogr.Bilgi OgrBilgi = new ogr.Bilgi();
}
Proje Özelliklerini Ayarlamak
Projenin genel davranışlarını ve konfigürasyon özelliklerini değiştirmek için
Property Page penceresi kullanılır.
Proje özelliklerini değiştirmek için belirtilen adımları takip edin.
1. Proje isminin üzerinde farenin sağ butonunu tıklayın.
2. Açılan menüden Properties komutunu verin.
3. Açılan Property Page penceresi üzerinde Common Properties (Genel
Özellikler) ve Configuration Properties (Konfigürasyon Özellikleri)
sekmelerinden herhangi birini seçin.
4. Genel Özellikler, projenin genel davranışlarını değiştirmek için kullanılır.
5. Konfigürasyon Özellikleri, Hata ayıklama ve Derleme seçeneklerinin değiştirilmesi
için kullanılır.
6. Proje özelliğini değiştirdikten sonra OK butonunu tıklayın.
En çok kullanılan proje özellikleri şunlardır:
ADO.NET
15
Modül 1:
ƒ
ƒ
ƒ
ƒ
Assembly Name: Derlenen uygulamanın exe veya .dll uzantılı çıktı dosyasının
adını belirler.
Root Namespace: Kök isim alanını belirler. Varsayılan olarak projenin ismi gelir.
Project Output Type: Derlenen uygulamanın hangi tipte assembly
oluşturacağını belirler. Bu tipler Windows, konsol uygulamaları ya da sınıf
kütüphaneleri (.dll) olabilir.
Startup Object: Uygulamanın hangi formdan veya modülden çalışmaya
başlayacağını belirtilir.
ADO.NET
16
Konu 2 : Proje Bileşenlerini Tanımak
Solution Explorer Kullanmak
Solution Explorer paneli, bir solution içindeki tüm dosyaları görüntüler.
Solution içinde birden fazla proje bulunabildiği için, bu projeler sıralı bir
ADO.NET
17
Modül 1:
şekilde listelenir. Koyu renkle gösterilen proje, solution içinde ilk çalıştırılacak
projedir.
Bu panel ile solution içine proje ekleme – silme, projelere yeni nesne ekleme
– silme işlemleri gerçekleştirilir.
Panelin üst tarafında buluna araç çubuğu, dosyalar üzerinde bazı işlemlerin
gerçekleştirilmesi için kısa yollar sunar. Örneğin araç çubuğundan Show All
Files komutu seçildiği zaman, projelerin bulunduğu klasördeki tüm dosyalar
gösterilir. Solution Explorer panelinde beyaz ile gösterilen nesneler projeye
dâhil edilmemiştir. Örneğin, proje klasöründe bulunan bir resim dosyasını
projeye dâhil etmek için, resme sağ tıklayıp Include In Project komutu
verilmelidir.
Solution Explorer panelini görüntülemek için View menüsünden Solution
Explorer komutunu verin.
Object Browser Kullanmak
Object Browser, Visual Studio .NET içerisindeki kütüphane ve isim
alanlarını tüm alt öğeleriyle ile beraber hiyerarşik şekilde listeler.
Object Browser ı görüntülemek için, View Penceresinden Object Browser
komutunu verin.
Object Browser pencerenin sol üst köşesinde Browse alanı Selected
Components seçeneği ile birlikte varsayılan olarak görünür. Bu seçenek ile
ADO.NET
18
projeye dâhil edilen referanslar ve bu referanslarla ilişkili isim alanları hiyerarşik
bir şekilde listelenir.
Objects paneli içerisinden seçilen herhangi bir isim alanı genişletilirse, içindeki
tüm öğeler hiyerarşik şekilde listelenir. Bu öğelerin herhangi biri seçildiğinde, o
öğeye ait tüm alt öğeler Members penceresinde listelenir.
Objects penceresinin sağ alt köşesinde ise, seçilen öğenin tanımını ve hangi
isim alanının altında olduğu gösterilir.
Server Explorer Kullanmak
Server Explorer, Visual Studio .NET ortamı içerisinde veri sağlayıcılarla
çalışmayı kolaylaştırmak için tasarlanmış bir araçtır. Ayrıca Server Explorer
sunucu makine bileşenlerinin yönetimi ve kullanımını sağlar.
Server Explorer, Data Connections ve Servers olmak üzere iki sekmeden
oluşur. Veri sağlayıcıları ile çalışmak için Data Connections seçeneği
kullanılır.
Yeni bir veri sağlayıcı oluşturmak için belirtilen adımları takip edin.
1. Server Explorer üzerinden Data Connections seçeneğini seçin.
2. Data Connections seçeneği üzerinde farenin sağ butonunu tıklayın. Açılan
menüden Add Connection komutunu verin.
3. Açılan Data Link Properties penceresinden bağlantı oluşturulur.
ADO.NET
19
Modül 1:
Servers sekmesinin altındaki SQL
Servers menüsünü kullanarak, veritabanı
işlemleri yerine getirilebilir ve veritabanı nesneleri, sürekle bırak metodu ile form
üzerine sürüklenebilir.
Dinamik Yardım Almak
Visual Studio .NET, içerisinde çok fazla konuyu barındırdığı için tümüne hakim
olmak neredeyse imkânsızdır. Bu nedenle yazılım geliştiricilerin işini
kolaylaştırmak için, Visual Studio .NET içerisinde dinamik yardım kütüphanesi
oluşturulmuştur. Dinamik yardım, uygulama geliştirirken yazılan koda göre tüm
yardım konularını listeler.
İPUCU: Dinamik yardımı aktif hale getirmek için, “Help” menüsünden “Dynamic Help”
komutunu tıklayın.
ADO.NET
20
Görev Listesini Kullanmak
Görev Listesi, aktif proje içerisine görev eklemek için kullanılır. Bu görevler
uygulama gelişiminin takip edilmesini sağlar. Görev Listesi içersine eklenen
tüm görevleri önem sırasına göre sıralanabilir.
Görev Listesi aracını proje ortamında aktif hale getirmek için View menüsünün
Other Windows alt menüsünden Task List komutunu tıklayın.
Görev Listesi aracı üzerinde Click here to add a new task alanı
tıklanarak yeni görev eklenebilir. Biten görevin önündeki onay kutusu
tıklanarak, görev sonlandırılabilir.
ADO.NET
21
Modül 1:
Konu 3: Uygulamalarda Hata Ayıklama
Uygulamaların geliştirme sırasında birçok hata ile karşılaşılır. Bu hataların çoğu
çalışma zamanında ortaya çıktığı için, kodun yazılması sırasında hatanın
kaynağının anlaşılması zordur. Hata üreten kod satırlarını, hataların nedenini
anlamak için Visual Studio Debug (Hata ayıklama) aracı kullanılır.
Visual Studio Debug aracı
•
Kodlar arasına BreakPoint konarak, çalışmanın istenen satırda
durmasını,
•
Kodlar arasında ilerlerken
değerlerinin gözlenmesini,
•
Command
Debug
panelleri
ile
paneli ile çalışma anında komut
değişkenlerin değerlerinin değiştirilmesini sağlar.
ADO.NET
değişkenlerin
çalıştırılmasını,
22
BreakPoint
BreakPoint kullanımı, uygulamanın çalışmasının istenen kod satırında
durdurulmasını sağlar. Çalışma, bir şartın gerçekleştiği durumda da
durdurulabilir. Örneğin bir değişkenin, belli bir değeri aldığı kod satırında
uygulamanın durması istenebilir.
İstenen bir kod satırına BreakPoint koymak için, kod sayfasının sol tarafında
bulunan panele tıklanır ya da F9 tuşuna basılır.
Belirtilen bir şart gerçekleştikten sonra çalışmanın durması isteniyorsa,
Breakpoint üzerine sağ tıklanıp BreakPoint Properties komutu verilmelidir.
Çıkan pencerede Condition düğmesine basılarak BreakPoint Condition
penceresi açılır. Bu pencerede bir değişkenin istenen bir değeri aldıktan sonra
çalışmanın durması belirtilir.
ADO.NET
23
Modül 1:
Çalışmanın, şartın belli bir sayı kadar sağlandığı zaman durdurulması için,
BreakPoint Properties penceresinde Hit Count düğmesine basılır.
BreakPoint Hit Count penceresinde, şartın gerçekleşme sayısı girilir.
Örnekte, BreakPoint beş defa veya daha fazla ulaşıldığı zaman durulması
belirtilir.
Debug Panelleri
Çalışma durdurulduktan sonra, değişkenlerin o andaki durumları Debug
panelleri ile gözlemlenir. Bu paneller ancak hata ayıklama sırasında
kullanılabilir. Debug panelleri, Debug menüsü altında Windows menüsünden
seçilebilir.
•
Autos
ADO.NET
24
Çalışmakta olan satırla, bir önceki ve bir sonraki arasında kalan değişkenleri
listeler.
•
Locals
Çalışılan kapsam içindeki tüm değişkenleri listeler. Bu kapsam bir modül,
yordam veya döngü olabilir.
•
Watch
Değeri incelenmek istenen değişken veya özellikler, bu panele yazılarak
eklenir.
Çalışma durdurulduktan sonra kodlar arasında ilerlemek gerekir. Kodlar
arasında ilerlemenin, yordamların içine girilmesi, üzerinden atlanması gibi
birçok yol vardır.
1. Step Into
Çalıştırılan kod eğer bir yordam veya fonksiyon ise bu yordam veya
fonksiyonun içine girilir ve hata ayıklamaya devam edilir.
2. Step Over
Bir yordam veya fonksiyon içine girilmeden ilerlenir.
3. Step Out
Bir yordam veya fonksiyon içinde ilerleniyorsa, buradan çıkılarak yordam veya
fonksiyonun çağırıldığı yere dönülür.
4. Continue
Bir sonraki BreakPoint satırına gidilir. Eğer başka bir BreakPoint
konmamışsa, uygulama normal çalışmasına devam eder.
ADO.NET
25
Modül 1:
Command Panelini Kullanmak
Command paneli iki farklı modda kullanılır.
• Immediate
Bu modda, değişken değerleri değiştirebilir, .NET Framework sınıflarındaki
metotlar veya kullanıcı tanımlı metotlar çalıştırılabilir. Immediate moduna
geçmek için immed komutu kullanılır.
Immediate modunda bir değişkenin değeri ? ile öğrenebilir ve yeni değer
atanabilir.
?sayi
40
sayi = 50
?sayi
50
• Command
Bu modda, Visual Studio ortamında tanımlı veya kullanıcı tanımlı
makroları, menü öğeleri kullanılabilir. Command moduna geçmek için >cmd
komutu kullanılmalıdır.
>cmd
>Debug.StepOver
>Help.About
ADO.NET
26
Konu 4: Uygulamanın Derlenmesi
Derleme Seçeneklerine Bakış
C# .NET ile geliştirilen uygulamalar çalıştırılmadan önce derleme işleminden
geçer. Derleme işlemi ile kodun C# söz dizimine uygun yazılıp yazılmadığı
kontrol edilir ve kod çalıştırılmak üzere makine diline çevrilir.
ADO.NET
27
Modül 1:
Uygulamaları derlenmesi Build menüsünden yapılır.
•
Build Solution
Solution içindeki, son derleme işleminden sonra değişen projelerin
derlenmesini sağlar.
•
Rebuild Solution
Solution içindeki tüm projelerin tekrar derlenmesini sağlar.
• Build “Proje İsmi”
Belirtilen projenin, son derleme işleminden sonra değişen bileşenlerinin
derlenmesini sağlar.
• Rebuild “Proje İsmi”
Belirtilen projenin tüm bileşenlerinin tekrar derlenmesini sağlar.
Uygulama derlendikten sonra bulunan hatalar Task List panelinde
görüntülenir. Task List panelinde görüntülenen hatalara çift tıklanarak,
hatanın yapıldığı satıra ulaşılır.
NOT:
C# .NET ile uygulama geliştirirken yapılan söz dizimi hataları hemenTask List
paneline yansır. Buna Background Compiling denir.
ADO.NET
28
Modül Özeti
1.
2.
3.
4.
5.
6.
Assembly nedir?
İsim Alanı nedir?
Object Browser niçin kullanılır?
Server Explorer ne işe yarar?
Çalışma zamanı hatalarını yakalamak için neler yapılır?
Proje nasıl derlenir?
ADO.NET
29
Modül 1:
LAB1 : Geliştirme Ortamını Tanımak
Uygulama1
Windows Uygulaması Oluşturmak
Bu uygulamada “Windows Application” kullanarak Çağrı Merkezi (Call Center)
isminde bir uygulaması oluşturacağız.
Çağrı Merkezi uygulasını oluşturmak
1.
Visual Studio .Net’i kullanarak Çağrı Merkezi isminde uygulama oluşturmak.
ƒ File menüsü altından New alt menüsünü işaret edin ve Project komutunu
tıklayın.
ƒ New Project ileti kutusundan “Windows Application” şablonunu seçin.
ƒ Name metin kutusuna “CagriMerkezi” yazın.
ƒ Location metin kutusuna “C:\Proje” yazın ve OK butonunu tıklayın
2.
Uygulamanın Assembly Name “Cagri” adı ile değiştirmek.
ƒ Proje isminin üzerinde farenin sağ butonunu tıklayın.
ƒ Açılan menüden Properties komutunu verin.
ƒ Açılan pencere üzerinden Common Properties (Genel Özellikler) klasörünü
seçin
ƒ Common Properties klasörü altındaki General sekmesi içerisinden Assembly
Name metin kutusuna “Cagri” yazın ve OK butonunu tıklayın.
ADO.NET
30
Uygulama 2
Object Browser Kullanmak
Bu uygulamada Object Browser’ı kullanarak System.Data kütüphanesini
inceleyeceğiz.
“System.Data” kütüphanesini açmak
1.
2.
3.
View menüsü içerisinden Object Browser alt menüsünü seçin.
Object paneli içerisindeki System.Data kütüphanesini genişletin.
System.Data Kütüphanesi içerisindeki System.Data.OleDb isim alanını
genişletin.
4.
alanını içerisindeki OleDbConnection,
OleDbCommand, OleDbDataReader, OleDbDataAdapter sınıflarını inceleyin.
System.Data.OleDb
isim
Uygulama 3
Debug Aracını Kullanmak
Bu uygulamada çağrı merkezi veritabanına bağlantı açılan kodlar Debug
kullanarak incelenir.
Kodların yazılması
1. Form1 nesnesinin kod sayfasına geçin ve OleDbConnection
oluşturan bir fonksiyon yazın.
ADO.NET
31
Modül 1:
private System.Data.OleDb.OleDbConnection ConnectionOlustur
(string connectionString)
{
return new
System.Data.OleDb.OleDbConnection(connectionString);
}
2. Formun üzerine çift tıklayarak Load olayına gelin. Load olayında, veri
tabanına bağlantı açan kodları yazın. Bu veri tabanı
“C:\Proje\CagriMerkezi” klasörü altında bulunacaktır.
System.Data.OleDb.OleDbConnection con = new
System.Data.OleDb.OleDbConnection();
// Connection oluşturan fonksiyon çağrılır
con =
ConnectionOlustur(@"data
source=C:\Proje\CagriMerkezi\CagriMerkezi.mdb;Provider=Micro
soft.Jet.OleDB.4.0");
con.Open();
// Veritabanı işlemleri ilerleyen modüllerde
// anlatılacaktır. Bu kısmı boş bırakın.
con.Close();
Hata ayıklama
1. Formun Load metoduna bir BreakPoint yerleştirin.
2. Projeyi F5 ile çalıştırın. Başlangıç formu yüklendiği zaman Load olayı
çalışacağı için, çalışma belirtilen noktada durur.
3. Debug menüsünden Step Into komutunu seçerek ya da F11 tuşuna
basarak kod içersinde ilerleyin. ConnectionOlustur isimli metodun
içine girildiği görülür.
4. ConnectionOlustur metodundan çıkıldıktan sonra, Locals panelini
açın ve con isimli değişkeni inceleyin.
5. Command panelini açın ve immed komutunu yazarak, Immediate
moduna geçin.
6. Command paneline con.State yazarak Connection nesnesinin State
özelliğini öğrenin.
7. Debug menüsünden Continue komutunu vererek ya da F5 tuşuna
basarak çalışmanın ilerlemesini sağlayın.
8. Formu kapatarak uygulamayı sonlandırın.
9. con.Open() kodunun bulunduğu satıra BreakPoint koyun ve sağ
tıklayarak BreakPoint Properties komutunu verin.
10. Condition düğmesine tıkayın ve metin kutusuna con.State = 1
yazın. con nesnesinin State özelliği 1 (bağlantı açık) olduğu zaman
çalışmanın durması ayarlanır.
ADO.NET
32
11. OK tuşuna basın ve projeyi çalıştırın. Çalışmanın belirtilen noktada
durmadığı gözükür. Bunun nedeni, BreakPoint içinde verilen şartın
sağlanmamasıdır.
12. Formu kapatarak uygulamayı sonlandırın ve Visual Studio ortamından
çıkın.
ADO.NET
Modul 1:
ADO.NET
34
Modül 2: Veri Merkezli Uygulamalar ve
ADO.NET’e Giriş
Bu modülde verilerin hangi ortamlarda depolandığını öğreneceksiniz. Ayrıca
depolanan veriye erişmek için kullanılan yöntemleri öğrenecek ve ADO.NET
teknolojisi hakkında bilgi sahibi olacaksınız.
Bu modülün sonunda:
ADO.NET
35
Modul 2:
•
Veri depolama yöntemlerini öğrenecek,
•
Bağlantılı ve Bağlantısız veri ortamlarını öğrenecek,
•
Veri erişim yöntemlerini öğrenecek,
•
ADO.NET nesne modelini öğrenecek,
•
ADO.NET nesne modelinde veri sağlayıcılarını seçebileceksiniz.
ADO.NET
36
Konu 1: Veri Merkezli Uygulamalar
Veri Depolama
Günümüzde verileri saklamak için çeşitli teknikler kullanılır. Örneğin bir emlakçı
emlak alım, satım bilgilerini dosya kâğıtları üzerinde depolayabilir. Bu yöntem
veri arama ve listeleme işlemlerinin karmaşık hale gelmesine ve arama
ADO.NET
37
Modul 2:
süresinin uzamasına sebep olur. Hatta daha büyük organizasyonlarda
işlemlerin yavaşlamasına ve durmasına sebep olabilir.
Artan ihtiyaçlar doğrultusunda veri depolamak ve depolanan veriye erişmek
için çeşitli veri depolama yöntemleri geliştirilmiştir. Bu yöntemler:
•
Yapısal Olmayan: Bu yöntem ile depolanan veriler için belirli bir
sınıflandırma ve sıralama yoktur. Veriler düz bir şekilde kaydedilir.
Örneğin basit not dosyaları.
•
Yapısal: Bu yöntem ile depolanan veriler çeşitli gruplara ayrılarak
saklanır fakat bu gruplar arasında bir alt-üst ayrımı yapılmaz. Örneğin
virgülle ayrılmış dosyalar (csv), Excel belgeleri.
•
Hiyerarşik: Hiyerarşik depolama yöntemini ağaç yapısına
benzetebiliriz. Bu yöntemde veriler çeşitli kategorilere bölünerek
depolanır. Her bir kategorinin içerisinde alt kategorilerde olabilir.
Örneğin XML (eXtensible Markup Language) dosyalar.
•
İlişkisel Veritabanı: İlişkisel veritabanlarında veriler tablolar üzerinde
depolanır. Tablo içerisindeki her bir satır kaydı, her bir sütun ise veriyi
ifade eder. Örneğin SQL Server, Oracle, Access.
•
Nesne Yönelimli Veritabanı: En gelişmiş veri depolama yöntemidir.
Bu yöntemde veriler; ihtiyaca göre gruplandırılarak,
nesneler
içerisinde saklanır. Örneğin Versant, AOL
ADO.NET bu depolama tekniklerinin tümünü destekler.
ADO.NET
38
Bağlantılı (Connected) Veri Ortamları
Bağlantılı veri ortamları, uygulamaların veri kaynağına sürekli bağlı kaldığı
ortamlardır. Bu ortamlarda veri alma ve değiştirme işlemleri uygulama ile veri
kaynağı arasında bağlantı kurulduktan sonra gerçekleştirilir. Bağlantılı veri
ortamlarında, veri işlemleri gerçekleştiği sürece bağlantı açık kalır.
İlk bilgisayar üretiminden bugüne en çok tercih edilen yöntem bağlantılı veri
ortamları olmuştur. Bağlantılı ortamlar veriye erişmek için birçok avantaj sağlar.
Avantajları:
•
En güvenli veri ortamıdır.
•
Veri kaynağına yapılan eş zamanlı erişimlerde, veri kaynağının
kontrolünü kolaylaştırır.
Dezavantajları:
•
Uygulama ile veri kaynağı arasında gerçekleşen
koruyabilmek için sabit bir ağ bağlantısının olması gerekir.
•
Uygulama ile veri kaynağı arasındaki bağlantı ağ üzerinden
gerçekleştiği için, ağ trafiğinin yoğunluğunu artırır.
bağlantıyı
Örneğin araba üreten bir fabrikada yapılan üretim bilgilerinin diğer birimlere
ulaştırılması ve bu kayıtların depolanması için eşzamanlı bir bağlantı kurulması
gereklidir. Ya da bir emlak firmasında emlakçının, mülk ve menkul bilgilerini
güncel tutabilmesi için sabit bir bağlantı kurması gereklidir.
ADO.NET
39
Modul 2:
Bağlantısız (Disconnected) Veri Ortamları
Bağlantısız veri ortamı, uygulamanın veri kaynağına sürekli bağlı kalmadığı
veri ortamıdır. Uygulama ile veri kaynağı arasında bağlantı, veri alış verişi
yapılırken açılır ve işlem bittikten sonra kapatılır. Bu veri ortamları çevrimdışı
çalışmak için kullanılır.
Teknolojinin ilerlemesi ve veri depolayan araçların taşınabilirliğinin sağlanması
ile tüm dünyada çevrimdışı ortamlara duyulan ihtiyaç artmıştır. Laptop,
Notebook ve Pocket PC gibi araçların yaygınlaşması ile günümüzde
uygulamanın veri kaynağına bağlı olmadığı durumlarda bile veri girişi
yapılabilir.
Uygulamada sadece çevrimiçi veya çevrimdışı ortamlardan birini seçmek
yeterli olmayabilir. Gelişmiş uygulamalarda her iki ortamın avantajlarını
birleştiren bir çözüm tercih edilebilir.
Avantajları:
•
Laptop, Notebook ve Pocket PC gibi araçlarla girilen veriler, istenilen
zamanda veri ortamlarına aktarılabilir.
•
Çevrimdışı ortamlar sayesinde, verilerin depolandığı uygulama
üzerindeki yük hafifletilir. Bu durum performans artışını sağlar.
Dezavantajları:
•
Bağlantısız veri ortamlarında, verilerin güncel kalmasına dikkat
edilmelidir. Bu ortamlarda veri güncelleme işlemleri farklı zamanlarda
ADO.NET
40
gerçekleştirilebilir. Veri üzerinde yapılan bu değişimlerin, diğer
kullanıcılara gösterilebilmesi için çeşitli çözümler geliştirilmelidir.
•
Bağlantısız veri ortamları içerisinde farklı kullanıcılar eşzamanlı
güncelleme işlemleri gerçekleştirebilir. Bu durumda oluşacak veri
çakışmalarının engellenmesi gerekir.
Örneğin bir toptancı firmasında, firma çalışanları farklı konumdaki bayilerinin
tüm siparişlerini bir el bilgisayarına kaydedebilir. Bu veriler el bilgisayarında
geçici bir süre için depolanır. Bu süre çalışanların sahada kaldığı süredir. Süre
sonunda veriler sunucu bilgisayara aktarılır.
ADO.NET
41
Modul 2:
Veri Erişim Yöntemleri
İlk bilgisayardan bugüne veriye erişmek için pek çok yöntem geliştirilmiştir. Bu
yöntemlerin bazılarında amaç yerleşim, bazılarında ise paylaşım olmuştur.
Amacın veriyi saklamak olduğu durumlarda paylaşım konusunda çözüm
aranmış, amacın veriyi birçok kullanıcı arasında paylaşmak olduğu durumda
ise ana verinin nerede saklanacağı konusunda çözüm yolları aranmıştır.
ADO.NET
42
Kullanıcı sayısının ve verinin boyutunun artmasıyla, veri erişimi için bilinen
modeller de oldukça gelişmiştir. Birebir veri paylaşımı yerine, internet üzerinden
çoklu kullanıcı desteğine açık veri erişim modelleri geliştirilmiştir. Günümüzde
gelinen son nokta ise, her an her yerden veriye kolayca erişmemizi sağlayan
XML Web Servis modelidir.
Veri merkezli uygulamalar geliştirmek için veri erişim modelleri kullanılır. Bir veri
erişim modelinde ki mantıksal her birime katman (tier) denir. Veri merkezli bir
uygulamada katman sayısı makine sayısına bağlı değildir. Katman sayısını
veri erişim modelindeki düzeyler belirler.
•
İstemci Katmanı (Client tier): Sunum ya da kullanıcı servis katmanı
olarak da bilinir. . Bu katman kullanıcı ara yüzünü içermektedir.
•
İş Katmanı (Business tier): Bu katman, uygulamanın veri kaynağı ile
etkileşen bölümüdür.
•
Veri Katmanı (Data tier): Veriyi içeren katmandır.
•
Birlikte çalışabilirlik Katmanı (Interoperability tier): Platform ve
dilden bağımsız, her tür veriye etkileşim sağlayan katmandır. Bu
katmana herhangi bir işletim sistemi üzerinde bulundurulabilen XML
Web Servislerini örnek verebiliriz.
ADO.NET
43
Modul 2:
Uygulamalar, katmanlara bölünerek ölçeklenebilirliği artırılır.
NOT: Katman sayısı arttıkça, veri erişim modelinin ölçeklendirebilirliği ve karmaşıklığı da
artar.
ADO.NET
44
Konu 2: ADO.NET’e GİRİŞ
ADO.NET Nedir?
ADO (ActiveX Data Objects), farklı veri kaynaklarına hızlı ve güvenli erişim
için Microsoft tarafından geliştirilen nesne modelidir. ADO.NET ise ADO
teknolojisinin en yeni versiyonudur. ADO ile aynı programlama modelini
ADO.NET
45
Modul 2:
kullanmamakla birlikte, ADO modelinden gelen pek çok çözüm yolunu da
beraberinde getirir.
Uygulama gelişim ihtiyacı arttıkça, yeni uygulamalarda Web uygulama
modeline olan bağlılık gittikçe azalmaktadır. Şimdilerde ise ağ bağlantıları
üzerinden veriyi rahatça aktarabilmek için XML kullanımına olan yönelim
artmaktadır. İşte ADO.NET, XML ve ADO.NET’in .NET Framework içinde en
uygun şekilde programlama ortamı oluşturmamızı sağlar.
ADO.NET modelinin diğer veri erişim modellerine göre üstünlüklerini şöyle
sıralayabiliriz:
•
ADO.NET, veritabanından çekilen verilerin kopyasını XML formatını
kullanarak belleğe aktarır.
•
Uygulamanın kullanıcı sayısı arttıkça kaynak kullanımı da artmaktadır.
N-Katmanlı (N-tier) uygulama yapısı kullanılarak, uygulamaların
katmanlar üzerinden dağıtılması sağlanır. Böylece uygulamaların
ölçeklenirliği artar.
•
ADO.NET ile bağlantısız veri ortamları için uygulama geliştirilebilir.
•
ADO.NET gelişmiş XML desteği verir.
ADO.NET Nesne Modeli:
ADO.NET nesne modeli iki ana bölümden oluşmaktadır.
•
DataSet Sınıfları
•
.NET Veri Sağlayıcı Sınıfları
ADO.NET
46
DataSet sınıfları, çevrimdışı ortamlar için veri depolama ve yönetme işlemlerini
sağlar. DataSet sınıfları veri kaynağından bağımsız her tür uygulama ve
veritabanı için kullanılabilir. Özellikle İlişkisel Veritabanı, XML ve XML Web
Servisleri üzerinden veri çekmek için kullanılır.
.NET veri sağlayıcı sınıfları, farklı türdeki veritabanlarına bağlanmak için
kullanılır. Bu sınıflar sayesinde istenilen türdeki veri kaynağına kolayca bağlantı
kurulabilir, veri çekilebilir ve gerekli güncelleme işlemleri yapılabilir. ADO.NET
nesne modeli, aşağıdaki veri sağlayıcı sınıflarını içerir:
•
SQL Server .NET Veri Sağlayıcısı
•
OLE DB .NET Veri Sağlayıcısı
•
Diğer .NET Veri Sağlayıcıları
DİKKAT:
Hangi veri kaynağı kullanılacaksa, sadece ona uygun veri sağlayıcı sınıfı
kullanılmalıdır.
ADO.NET Veri Sağlayıcıları:
NET veri sağlayıcıları, ADO.NET mimarisinin veritabanı ile uygulama
(Windows, Web) veya XML Web Servis arasında bağlantı kurmak için her tür
alt yapıyı barındıran çekirdek bileşendir. Tüm veri sağlayıcıları, System.Data
isim alanı içinde tanımlanmıştır.
ADO.NET
47
Modul 2:
NET Framework 1.0 sürümü ile birlikte SQL Server .NET ve OLE DB .NET veri
sağlayıcı sınıfları gelmiştir.
SQL Server .NET: SQL Server 7.0 ve SQL Server 2000 veritabanlarına hızlı
bağlantı sağlar. SQL Server bağlantı nesneleri System.Data.SqlClient isim
alanında bulunur.
OLE DB .NET: SQL Server 6.5 ve daha öncesi sürümlerine, Oracle, Sybase,
DB2/400 ve Microsoft Access veri tabanlarına bağlantı kurmayı sağlar. OLE
DB bağlantı nesneleri System.Data.OleDb isim alanında bulunur.
NET Framework 1.1 sürümü ile birlikte SQL Server .NET ve OLE DB .NET veri
sağlayıcılarına Oracle .NET ve ODBC .NET veri sağlayıcıları da eklenmiştir.
ORACLE .NET: Oracle veritabanlarına bağlantı için tasarlanmış veri
sağlayıcısıdır. Oracle bağlantı nesneleri System.Data.OracleClient isim
alanında bulunur.
NOT:
System.Data.OracleClient
isim
alanını
kullanmak
için,
projeye
“System.Data.OracleClient.dll” referansı eklenmelidir.
ODBC .NET: Diğer veritabanlarını destekleyen genel bir veri sağlayıcıdır.
ODBC bağlantı nesneleri System.Data.ODBC isim alanında bulunur.
Öğrenim ve kullanım kolaylığı olması amacıyla ADO.NET veri sağlayıcıların
isimlendirilmesinde genelleştirmeye gidilmiştir. SQL Server .NET veri
sağlayıcılarının sınıf isimleri “Sql” ön eki ile, OLE DB .NET veri sağlayıcılarının
sınıf isimleri ise “OleDb” ön eki ile başlar. Bu genellemeye “SqlConnection” ve
“OleDbConnection” örnekleri verilebilir.
ADO.NET
48
Her bir veri sağlayıcısı içerisinde, birçok bağlantı nesnesi bulunur.
•
Connection
•
Command
•
DataReader
•
DataAdapter
XxxConnection: : Veri kaynağına bağlantı için kullanılan sınıftır.
ADO.NET
49
Modul 2:
XxxCommand: Veri kaynağı üzerinde sorgu çalıştırmak için kullanılır. Veri
kaynağından dönen kayıtlar XxxDataReader veya DataSet kullanılarak veri
bağlantılı kontrollere aktarılır.
XxxDataReader: Çevrimiçi bağlantılarda sadece veri okumak için kullanılan
sınıftır.
XxxDataAdapter: Çevrimdışı bağlantılarda kullanılan veri işleme nesnesidir.
NOT:
Xxx yerine seçilen veri sağlayıcısına göre SQL, OLEDB, Oracle ve ODBC
eklerinden biri kullanılır.
Modül Özeti
1.
2.
3.
4.
Veri depolama yöntemleri nelerdir?
Bağlantılı ve Bağlantısız Veri ortamları nelerdir?
Veri erişim yöntemleri nelerdir?
ADO.NET veri sağlayıcıları nelerdir?
ADO.NET
50
Lab 2: Veri Merkezli Uygulamalar ve
ADO.NET’e Giriş
Uygulama 1
Yeni bağlantı oluşturmak.
Bu uygulamada Server Explorer’ı kullanarak Çağrı Merkezi uygulaması için
yeni bir bağlantı oluşturulur.
Çağrı Merkezi Uygulaması için yeni bağlantı oluşturmak.
ADO.NET
51
Modul 2:
3.
Visual Studio .Net’i kullanarak Çağrı Merkezi uygulamasını açmak.
ƒ File menüsü altından Open alt menüsü içerisinden Project komutunu tıklayın.
ƒ Look in açılan kutusundan “C:\Proje\ CagriMerkezi” klasörünü seçin.
ƒ Açılan Open Project penceresinden “CagriMerkezi.sln” dosyasını seçerek
Open butonunu tıklayın.
4.
Uygulamaya CagriMerkezi veritabanını eklemek.
ƒ Proje isminin üzerinde farenin sağ butonunu tıklayın.
ƒ Açılan menüden Add menüsünden Add Existing Item komutunu verin.
ƒ Açılan pencere üzerindeki Look in açılan kutusundan “CD Sürücüsü\Veritabanı”
klasörünü seçin.
ƒ Açılan Add Existing Item penceresinden “CagriMerkezi.mdb” veritabanını
seçerek Open butonunu tıklayın.
5.
“CagriMerkezi” uygulaması için yeni bağlantı oluşturmak.
ƒ Server Explorer penceresi üzerinde farenin sağ butonunu tıklayın. Açılan
menüden Add Connection komutunu tıklayın.
ƒ Açılan Data Link Properties penceresinin Provider sekmesini tıklayın.
ƒ Provider sekmesinden Microsoft.Jet.OLEDB.4.0 Provider ‘i seçerek Next
butonunu tıklayın.
ƒ
Açılan Connection sekmesinin görüntüsünü resimdeki gibi düzenleyerek OK
butonunu tıklayın.
ADO.NET
Modul 4:
ADO.NET
53
Modul 3
Modül 3: Veri Kaynaklarına Bağlanmak
Veriyi yöneten uygulamalar, bu verilerin bulunduğu kaynağa bağlanma ihtiyacı
duyar. Visual Basic .NET ile veri kaynağına bağlanmak için, kaynağın tipine,
yapısına göre farklı nesneler ve farklı veri sağlayıcıları kullanılır.
Bu modülün sonunda:
ADO.NET
54
•
Farklı veritabanlarına göre veri sağlayıcıları seçebilecek,
•
Bağlantı cümlesi oluşturabilecek,
•
Farklı veritabanları için Connection nesnelerini yönetebileceksiniz.
ADO.NET
55
Modul 3
Konu 1: Veri Sağlayıcı Seçmek
Veri Sağlayıcı Nedir?
ADO.NET mimarisi, uygulama ile veritabanı arasında bağlantı kurmak ve
kurulan bağlantı üzerinden kayıtları almak, değiştirmek ve silmek için veri
sağlayıcılarını kullanır. Farklı veritabanları için farklı veri sağlayıcıları kullanılır.
ADO.NET
56
Uygun veri sağlayıcı seçiminde en önemli kriter “Hangi sağlayıcı en iyi
performansı verir?” sorusunun cevabıdır. Çünkü Sql Server, Oracle, Access
gibi veritabanlarına farklı veri sağlayıcıları ile erişilebilir.
Microsoft .NET Framework, veritabanları ile bağlantı kurmak için farklı veri
sağlayıcılarını destekler.
•
SQL Server .NET
•
OLEDB .NET
•
ODBC .NET
Veri Sağlayıcı Sınıfları
.NET Framework içindeki veri sağlayıcıları, System.Data.dll içerisinde ki
System.Data isim alanında yer alır. Tablo 1.1 de hangi sağlayıcı isim alanı ile
hangi veritabanına bağlanılabileceği gösterilmektedir.
ADO.NET
57
Modul 3
Veri Tabanı
Veri Sağlayıcısı İsim Alanı
Sql Server 7.0 ve sonraki sürümler
System.Data.SqlClient
Sql Server 6.5 ve önceki sürümler
System.Data.OleDb
Microsoft Access veri tabanı
System.Data.OleDb
Oracle Server
System.Data.OracleClient
Diğer veri tabanları(Oracle, Sybase,
DB2/400)
System.Data.OleDb
Tablo 1.1: Veri Tabanları ve Veri Sağlayıcı İsim Alanları
ODBC .NET veri sağlayıcıları, diğer veri sağlayıcılarından farklı olarak, veri
kaynağına bağlanırken hiçbir ara katman kullanmaz. Bunun yerine, bağlantı
için ODBC API’leri kullanır.
.NET Framework veri sağlayıcıları Tablo 1.2 de belirtilen sınıfları
kullanmaktadır. Sınıf isimlerinin önündeki XXX ön eki kullanılan veri sağlayıcı
ismini simgeler. Eğer veritabanına OLEDB veri sağlayıcısı ile bağlanılırsa
OLEDB ön ekini, eğer SQL Server veri sağlayıcısı ile bağlanıyorsa SQL ön
ekini alır.
ADO.NET
58
Sınıf
Açıklama
XXXConnection
Bağlantı açmak ve kapatmak için kullanılan sınıftır.
XXXCommand
Veritabanı üzerinde Stored Procedure (Saklı
Yordamlar) veya SQL Cümleleri çalıştırmak için
kullanılan sınıftır.
XXXDataReader
Veritabanından sadece okunur ve ileri hareketli
kayıtlar çekmek için kullanılan sınıftır.
XXXDataAdapter
Veritabanından çekilen verileri DataSet içerisine veya
DataSet ‘e çevrimdışı eklenmiş verileri veritabanına
aktarmak için kullanılan sınıftır
Tablo 1.2: Veri Sağlayıcı Sınıf İsimleri
System.Data.SqlClient isim alanı içerisinden çevrimiçi bağlantılar
geliştirmek için SqlConnection, SqlCommand, SqlDataReader sınıfları
kullanılır.
ADO.NET
59
Modul 3
SqlConnection; MS SQL Server üzerinde bağlantı açmak ve kapatmak için
kullanılan sınıfdır.
SqlCommand; MS SQL Server üzerinde Stored Procedure (Saklı Yordamlar)
veya SQL Cümleleri çalıştırmak için kullanılan sınıftır.
SqlDataReader; MS SQL Server üzerinde SqlCommand ile çalıştırılan SELECT
sorguların sonuçlarını geri döndürmek için kullanılan sınıftır.
isim alanı içerisinden çevrimdışı bağlantılar
geliştirmek için SqlConnection, SqlDataAdapter, DataSet sınıfları
kullanılır.
System.Data.SqlClient
SqlConnection; MS SQL Server üzerinde bağlantı açmak ve kapatmak için
kullanılan sınıftır.
SqlDataAdapter; MS SQL Server’dan çekilen verileri DataSet içerisine ve
DataSet‘e çevrimdışı eklenmiş verileri MS SQL Server’a aktarmak için
kullanılan sınıftır.
DataSet; SQLDataAdapter nesnesinden gelen kayıtları çevrimdışı depolamak
ve yönetmek için kullanılan sınıftır. DataSet tüm veri sağlayıcı sınıflar için
ortaktır.
NOT: DataSet, System.Data isim alanı içerisinde yer alır.
System.Data.OleDb isim alanı içerisinden çevrimiçi bağlantılar geliştirmek için
OleDbConnection, OleDbCommand, OleDbDataReader sınıfları kullanılır.
OleDbConnection; Access veya diğer veritabanları üzerinde bağlantı açmak
ve kapatmak için kullanılan sınıftır.
OleDbCommand; Access veya diğer veritabanları üzerinde Stored Procedure
(Saklı Yordamlar) veya SQL Cümleleri çalıştırmak için kullanılan sınıftır.
OleDbDataReader; Access veya diğer veritabanları üzerinde OleDbCommand
ile çalıştırılan SELECT sorguların sonuçlarını geri döndürmek için kullanılan
sınıftır.
System.Data.OleDb isim alanı içerisinden çevrimdışı bağlantılar geliştirmek
için OleDbConnection, OleDbDataAdapter sınıfları kullanılır.
OleDbConnection; Access veya diğer veritabanları üzerinde bağlantı açmak
ve kapatmak için kullanılan sınıftır.
OleDbDataAdapter; Access veya diğer veritabanlarından çekilen verileri
DataSet içerisine ve DataSet‘e çevrimdışı eklenmiş verileri ilgili veritabanına
aktarmak için kullanılan sınıftır.
ADO.NET
60
Konu 2: Bağlantı Oluşturmak
Bağlantı Cümlesi (Connection String)
Oluşturmak
ADO.NET
61
Modul 3
Bağlantı cümlesi, veri kaynağına bağlanmak için gerekli bilgileri tutar.. Bu
cümle, veri kaynağına bağlantı kurmak için gerekli bağlantı parametrelerin
birleşiminden oluşur. Bu parametrelerin listesi Tablo 2.1’de gösterilmiştir.
Parametre
Tanımı
Provider
Sadece OleDbConnection nesnelerinde
kullanılır. Bağlantı sağlayıcısının ismini tutar.
Sağlayıcı isimleri Tablo 2.2 de belirtilmiştir.
ConnectionTimeout veya Connect
Timeout
Veritabanı bağlantı için beklenmesi gereken
maksimum saniye sayısıdır. Varsayılan
deger 15 saniye dir.
Initial Catalog
Veri tabanı adı
Data Source
SQL Server adı, veya MS Access veri tabanı
için dosya adı
Password (pwd)
SQL Server login(giriş) parolası
User Id (uid)
SQL Server login(giriş) adı
Integrated Security veya Trusted
Connection
SQL sunucusuna Windows hesabı ile
bağlantı yapılacağını belirtir. True, False
veya SSPI girilebilir. SSPI, True ile eş
anlamlıdır ve bu durumda Windows hesabı
kullanılır.
Persist Security Info
Varsayılan değeri False olur. Bu durumda
güvenlik için hassas bilgileri geri
döndürmez. True olduğunda ise güvenlik
risk taşımaya başlar.
WorkstationID (wid)
Workstation veya client(istemci) adını
belirtir.
Packet Size
Client(istemci)-server(sunucu) arası veri
transferinde kullanılan paketlerin boyutunu
belirtir.
Mode
Veritabanını Read-only(Sadece okunur) ya
da Write(Yazılabilir) modunu belirtir. SQL
Server bağlantılarında kullanılmaz.
Tablo 2.1: Bağlantı cümlesinin parametreleri
Provider parametresinin Access, SQL Server ve Oracle veri tabanlarına göre
alacağı değerler Tablo 2.2 de gösterilmiştir
Tür
Açıklama
SQLOLEDB
SQL Server için Microsoft OLE DB Provider
MSDAORA
ORACLE için Microsoft OLE DB Provider
Microsoft.Jet.OLEDB.4.0
Microsoft Jet için OLE DB Provider
Tablo 2.2: Bağlantı cümlesinin parametreleri
ADO.NET
62
Bağlantı Cümlesini (Connection String)
Kullanmak
Yeni bağlantı oluşturmak ve yönetmek için OleDbConnection, SqlConnection
gibi XXXConnection sınıfları kullanılır. Veri kaynağına bağlanmak için
oluşturulan Bağlantı Cümlesi, XXXConnection sınıfının ConnectionString
özelliğine atanır.
Örnekte SQL Server veritabanı için bağlantı cümlesi oluşturulmuştur. London
isimli sunucuda bulunan Northwind veritabanına, sa kullanıcı ismi ve 2389
parolası ile bağlanılıyor. Eğer veritabanı sunucusundan 60 saniye içinde cevap
alınamazsa bağlantı iptal ediliyor.
System.Data.SqlClient.SqlConnection cnNorthwind;
cnNorthwind = new System.Data.SqlClient.SqlConnection();
cnNorthwind.ConnectionString ="Data Source=London;Initial
Catalog=Northwind;User ID=sa;Password=2389;Connection
TimeOut=60";
Örnekte Microsoft Access veritabanı için bağlantı cümlesi oluşturulmuştur.
OleDb bağlantısı yapıldığı için Provider özelliğinin Microsoft.Jet.OleDB.4.0
olarak belirtilmesi gerekir. Bağlantının yapılacağı Northwind veritabanının local
makinede C:\Samples dizini altında bulunduğu belirtiliyor.
System.Data.OleDb.OleDbConnection cnNorthwind;
cnNorthwind = new System.Data.OleDb.OleDbConnection();
ADO.NET
63
Modul 3
cnNorthwind.ConnectionString=@"Provider=Microsoft.Jet.OLEDB.
4.0;Data Source=C:\Samples\Northwind.mdb";
Örnekte Sql Server 6.5 veri tabanı için bağlantı cümlesi oluşturulmuştur. SQL
Server 7.0 sürümünden eski bir veritabanı sunucuna bağlantı yapıldığı için
Provider özelliği SQLOLEDB olarak belirtiliyor. ProdServ isimli sunucudaki
Pubs veritabanına, Windows hesabı (SSPI) ile bağlanılıyor.
System.Data.OleDb.OleDbConnection cnNorthwind;
cnNorthwind = new System.Data.OleDb.OleDbConnection();
cnNorthwind.ConnectionString = “Provider=SQLOLEDB;Data
Source=ProdServ;Initial Catalog=Pubs;Integrated
security=SSPI”;
DİKKAT:
Microsoft Access veri kaynağı, tek veri tabanından oluşur. SQL Server veri
kaynağı ise birden fazla veri tabanından oluşur. Bu yüzden SQL Server veritabanı bağlantı
cümlesinde Initial Catalog parametresi kullanılır.
Bağlantı Cümlesi(Connection String) Örnekleri
ADO.NET
64
Ms Access ile OLEDB Bağlantı Cümleleri
Tablo 2.3 de OLEDB ile Access’e bağlanmak için gerekli, örnek Bağlantı
Cümleleri gösterilmektedir.
Access’e Bağlantı
"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=DB_Name.mdb;
"
Access’e Çalışma
Grubu dosyası
üzerinden Bağlantı
"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=Db
_Name.mdb; Jet OLEDB:System Database=Db _Name.mdw"
Access’e Parola
Korumalı Bağlantı
"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=Db
_Name.mdb; Jet OLEDB:Database Password=sifreniz"
Network’teki Access’e
Bağlantı
"Provider=Microsoft.Jet.OLEDB.4.0; Data
Source=\\Server_Name\Share_Name\Share_Path\Db
_Name.mdb"
Remote Server(Uzak
Server) üzerindeki bir
Access’e Bağlantı
"Provider=MS Remote; Remote Server=http://Your-RemoteServer-IP; Remote Provider=Microsoft.Jet.OLEDB.4.0; Data
Source=Db_Name.mdb"
Tablo 2.3: Ms Access ile OLEDB Bağlantı Cümleleri
ADO.NET
65
Modul 3
SQL Server ile ODBC Bağlantı Cümleleri
Tablo 2.4 de ODBC ile SQL Server’a bağlanmak için gerekli, örnek Bağlantı
Cümleleri gösterilmektedir.
SQL Server sunucusuna
SQL Authentication ile
bağlanmak
"Driver={SQL Server};Server=
Server_Name;Database=Db_Name;Uid=Username;Pwd=
sifreniz;"
"Driver={SQL Server}; Server= Server_Name; Database=DB
SQL Server sunucusuna
Windows Authentication ile _Name;Trusted_Connection=yes;"
bağlanmak
Tablo 2.4: SQL Server ile ODBC Bağlantı Cümleleri
ADO.NET
66
SQL Server ile OLEDB Bağlantı Cümleleri
Tablo 2.5 de OLEDB ile SQL Server’a bağlanmak için gerekli, örnek Bağlantı
Cümleleri gösterilmektedir.
SQL Server sunucusuna
SQL Authentication ile
bağlanmak
"Provider=SQLOLEDB;Data Source= Server_Name;Initial
Catalog=Db_Name;User Id= Username;Password=sifreniz;"
"Provider=SQLOLEDB;Data Source= Server_Name;Initial
SQL Server sunucusuna
Windows Authentication ile Catalog=DB_Name;Integrated Security=SSPI;"
bağlanmak
Tablo 2.5: SQL Server ile OLEDB Bağlatı Cümleleri
ADO.NET
67
Modul 3
SQL Server ile Sql Server Bağlantı Cümleleri
Tablo 2.6 de SQLClient ile SQL Server’a bağlanmak için gerekli, örnek
Bağlantı Cümleleri gösterilmektedir.
SQL Server sunucusuna
SQL Authentication ile
bağlanmak
"Data Source=_Server_Name;Initial Catalog=Db _Name;User
Id= Username;Password=sifreniz;"
SQL Server sunucusuna
SQL Authentication ile
bağlanmak
"Server= Server_Name;Database=Db_Name;User ID=
Username;Password=sifreniz;Trusted_Connection=False”
SQL Server sunucusuna
Windows Authentication
ile bağlanmak
"Data Source= Server_Name;Initial
Catalog=Db_Name;Integrated Security=SSPI;”
SQL Server sunucusuna
SQL Authentication ile
bağlanmak
"Server=Server_Name;Database=Db_Name;Trusted_Connecti
on=True;"
Tablo 2.6: SQL Server ile SQL Server Bağlantı Cümleleri
UYARI :
Bağlantı cümle paramerelerinin benzer eşdeğerleri vardır. Bu eşdeğerler hem
OLEDB hemde SQLClient veri sağlayıcalarda kullanılabilir. Tablo 2.7. de bu eşdeğerler
gösterilmektedir.
ADO.NET
68
OLEDB ve SqlServer Parametreleri
Eşdeğerleri
Data Source
Server
User ID
UID
Password
PWD
Initial Catalog
Database
Tablo 2.7: OleDb ve Sql Server Parametre Eşdeğerleri
ADO.NET
69
Modul 3
Konu 3: Bağlantı Yönetimi
Bağlantıyı Açmak ve Kapatmak
Bağlantı cümlesini oluşturduktan sonra, bağlantıyı açmak ve kapamak için
Connection sınıfının iki önemli metodu kullanılır.
•
Open
ADO.NET
70
•
Close
Open metodu, bağlantı cümlesinde belirtilen veri kaynağını açmak için kullanılır.
Close metodu, açılan bağlantıyı kapatmak için kullanılır. Close metodu ile
kullanılmayan bağlantıları kapatmak, kaynak tüketimini azaltır.
Open metodu; uygulama ile veri kaynağı arasındaki bağlantıyı, bağlantı
cümlesinin Timeout parametresinde belirtilen süre içerisinde kurmaya çalışır.
Eğer belirtilen süre içerisinde bağlantı gerçekleşmiyorsa, uygulama hata üretir.
Bu süre için herhangi bir değer belirtilmemişse, varsayılan değer 15 saniyedir.
Daha önceden açılmış bir bağlantı; kapatılmadan tekrar açılmaya çalışılırsa,
uygulama yine hata üretecektir. Kapatılan bağlantının yeniden kapatılması
hataya yol açmaz.
Open metodu ile açılan bağlantının kapatılmaması durumunda, “Garbage
Collector” adı verilen çöp toplayıcı devreye girerek bağlantının kapatılmasını
sağlar. Bu durum bağlantı değişkeninin geçici bir süre bellekte yer tutmasına
neden olur.
NOT: Bağlantı nesnesinin Dispose metodu da bağlantıyı kapatmak için kullanılabilir.
Örnekte Northwind.mdb isimli Access veritabanı üzerinde, Open ve Close
metotlarının kullanımı gösterilmektedir.
cnNorthwind.ConnectionString = @"Provider=Microsoft.Jet.
OLEDB.4.0;Data Source=C:\Samples\Northwind.mdb";
//Bağlantıyı açmak
cnNorthwind.Open();
//Veritabanı işlemleri bu arada gerçekleştirillir.
//Bağlantıyı kapatmak
cnNorthwind.Close();
Open metodu ile veri kaynağı açılırken, çeşitli çalışma zamanı hatalarından
dolayı bağlantı açılmayabilir ve uygulama hata üretebilir. Bu çalışma zamanı
hataları
•
Sunucunun bulunamamasından,
•
Veritabanının bulunamamasından,
•
Hatalı kullanıcı adı veya parola girilmesinden,
•
Donanım veya yazılımdan kaynaklanabilir.
Try, Catch, Finally deyimlerini kullanarak bir bloğu oluşabilecek potansiyel
hatalardan korunur.
Try bloğu içinde, hata üretebilecek kodlar yazılır. Örneğin tüm veritabanı
işlemleri bu blok içersine yazılmalıdır.
ADO.NET
71
Modul 3
Catch blokları, uygulamanın ürettiği hataları, tiplerine göre sıralı bir şekilde
işler. Bu blok içersine, yakalanan hataya göre yapılacak işlemler yazılmalıdır.
Örneğin bağlantının açılmadığı bir durumda veritabanı işlemleri
gerçekleştirilmeye çalışıldığı zaman, kullanıcıya bağlantının açılmasını bildiren
mesaj kutusu çıkarılabilir.
Finally bloğunda, Try ve Catch bloklarından herhangi biri işlendikten sonra
çalışır. Bu blokta, hatanın üretildiği veya üretilmediği iki durumda da yapılması
gereken işlemler yazılır. Örneğin, bağlantının kapatılması her iki durumda da
yapılması gereken bir işlemdir.
System.Data.OleDb.OleDbConnection cnNorthwind;
try
{
cnNorthwind = new System.Data.OleDb.OleDbConnection();
cnNorthwind.ConnectionString = @"Provider=Microsoft.Jet.
OLEDB.4.0;Data Source=C:\Samples\Northwind.mdb";
cnNorthwind.Open();
// Veritabanı işlemleri gerçekleştirilir.
}
catch (InvalidOperationException XcpInvOp)
{
// İlk önce bu tipte hata yakalanır.
MessageBox.Show("Önce veri tabanı bağlantısını kapatın");
//Hata Mesajının içeriğini görmek için kullanılır.
MessageBox.Show(XcpInvOp.ToString());
}
catch (Exception Xcp)
{
//Diğer hatadan farklı bir tipte hata burda yakalanır.
MessageBox.Show(Xcp.ToString());
}
finally
{
cnNorthwind.Close();
//ya da
cnNorthwind.Dispose();
}
ADO.NET
72
Bağlantı Durumlarını Kontrol Etmek
Bağlantı sınıfının durumu hakkında bilgi almak için, bağlantı sınıfının State
özelliği kullanılır.
State özelliğinin alabileceği değerler tablo 3.1.1’de belirtilmiştir.
İsim
Açıklama
Değeri
Broken
Yalnızca, açık bir bağlantının kopup tekrar bağlanıldığı
durum
16
Closed
Bağlantı kapalı
0
Connecting
Veri kaynağına bağlanma aşamasında
2
Executing
Bağlantı üzerinden bir komutu çalıştırılıyor
4
Fetching
Bağlantı üzerinden veri çekiliyor
8
Open
Bağlantı açık
1
Tablo 3.1.1: Connection nesnesinin State Property değerleri
private void ConnectionAc(OleDb.OleDbConnection con)
{
//Connection, sadece kapalı ise açılacak
If (con.State == ConnectionState.Closed)
{
con.Open();
}
}
Bağlantı nesnelerinin durumu değiştiği zaman StateChange olayı tetiklenir. Bu
olay ile bağlantının hangi durumlarda açılıp kapandığı öğrenilebilir.
ADO.NET
73
Modul 3
Bağlantının eski ve yeni durumları StateChangeEventArgs parametresi ile
öğrenilir. Tablo 3.1.2’de bu parametrenin CurrentState ve OriginalState
özellikleri görülür.
Property
Açıklama
CurrentState
Bağlantının yeni durumu hakkında bilgi
verir.
OriginalState
Bağlantının değişmeden önceki durumu
hakkında bilgi verir.
Tablo 3.1.2: StateChangeEventArgs parametresinin özellikleri
public void ConnectionOlustur()
{
System.Data.OleDb.OleDbConnection conn;
conn = new System.Data.OleDb.OleDbConnection();
// Bağlantı ayarları yapılır.
// ...
// Bağlantının StateChange olayı gerçekleştiği zaman
// DurumRapor yordamının çağırılması ayarlanır
conn.StateChange += new
StateChangeEventHandler(DurumRapor);
}
public void DurumRapor(Object sender,StateChangeEventArgs e)
{
MessageBox.Show("Bağlantı " +e.OriginalState.ToString() +
" durumundan " + e.CurrentState.ToString() + " durumu olarak
değişti.");
}
ADO.NET
74
Modül Özeti:
1. Veri sağlayıcılar ne işe yarar? SQL Server 6.5 veri tabanına
bağlanmak için hangi veri sağlayıcının kullanılması gerekir.
2. Connection nesnelerinin kullanılması için gereken temel özellik
hangisidir?
3. Bağlantı açıkken tekrar açılmaya çalışıldığında ne olur? Bu durum
nasıl engellenir?
4. Try Catch bloğu ne için kullanılır? Finally bloğunda hangi kodlar
yazılır?
5. Bağlantı durumu Connection nesnesinin hangi özelliği ile anlaşılır?
Durum değiştiği zaman hangi olay tetiklenir?
ADO.NET
75
Modul 3
Lab 1: Bağlantı Oluşturmak
Bu labda, kullanıcını girdiği değerlere göre Connection String oluşturulur. Bu
bağlantı cümlesi ile yeni bir Connection nesnesi oluşturarak, bağlantının
durumu incelenir.
Bu lab tamamlandıktan sonra:
•
Farklı veritabanlarına göre bağlantı cümlesi oluşturabilecek,
•
Veritabanına bağlantı açıp kapayabilecek,
•
Bağlantıların State özelliği ile durumunu gözlemleyebileceksiniz.
Kontrollerin eklenmesi
VeriTabaniBaglantisi isminde yeni bir Windows projesi açın.
Form üzerine, tablodaki kontrolleri ekleyin belirtilen özelliklerini ayarlayın.
Kontrol – Kontrol İsmi
Özellik
TextBox – txtVeriTabani
Text
TextBox – txtSunucu
Text
TextBox – txtKullaniciAdi
Text
TextBox – txtParola
Text
TextBox – txtTimeOut
Text
Label – lblConnectionString
Text
Label – lblConnectionState
Text
ADO.NET
Değer
Closed
76
GroupBox
Text
Bağlantı İşlemleri:
ComboBox – ComboBox1
DropDownStyle
DropDownList
Button – Button1
Text
Connection
Oluştur
Button – Button2
Text
Connection Oluştur
Button – Button3
Text
Connection Aç
Button – Button4
Text
Connection Kapat
String
Kodların yazılması
Veritabanı bağlantısı oluşturmak için öncelikle bağlantı cümlesi oluşturulması
gerekir. Bu bağlantı cümlesi, kullanıcının gireceği bilgilere göre oluşturulur.
1. Bağlantı cümlesi için gerekli bilgileri tutan değişkenleri tanımlayın.
private
private
private
private
private
private
private
string
string
string
string
string
string
String
ConnectionString;
Provider;
Database;
Server;
KullaniciAdi;
Parola;
TimeOut;
// Sql veritabanına bağlanmak için
private System.Data.SqlClient.SqlConnection sqlCon;
// Access veritabanına bağlanmak için
private System.Data.OleDb.OleDbConnection oleDbCon;
2. Formun Load anında, ComboBox kontrolüne veritabanı seçeneklerini
ekleyin.
private void Form1_Load(System.Object sender,
System.EventArgs e)
{
comboBox1.Items.Add("Microsoft Access");
ADO.NET
77
Modul 3
comboBox1.Items.Add("Microsoft SQL Server 2000");
comboBox1.Items.Add("Microsoft SQL Server 6.5");
// Varsayilan olarak Sql Server 2000 seçili olur
comboBox1.SelectedIndex = 1;
}
3. ComboBox kontrolünden veritabanı seçildiği zaman, Provider ismini
değiştirin. Seçilen veritabanı Access ise, kullanıcı adı, parola, sunucu
ve timeout TextBox kontrollerini pasif duruma getirin.
private void comboBox1_SelectedIndexChanged(System.Object
sender, System.EventArgs e)
{
// Farkli Veritabani seçildigi zaman tetiklenir.
switch (comboBox1.SelectedIndex)
{
case 0:
Provider = "Microsoft.Jet.OleDB.4.0";
EnableTextBoxes(false);
break;
case 1:
Provider = "";
EnableTextBoxes(true);
break;
case 2:
Provider = "SQLOLEDB";
EnableTextBoxes(true);
break;
}
}
private void EnableTextBoxes(bool SQLVeriTabaniSecili)
{
txtKullaniciAdi.Enabled = SQLVeriTabaniSecili;
txtParola.Enabled = SQLVeriTabaniSecili;
txtTimeOut.Enabled = SQLVeriTabaniSecili;
txtSunucu.Enabled = SQLVeriTabaniSecili;
// Access veritabani seçili ise
if (! SQLVeriTabaniSecili)
{
txtKullaniciAdi.Text = "";
txtParola.Text = "";
txtTimeOut.Text = "";
txtSunucu.Text = "";
}
}
4. Connection String oluşturma düğmesine basıldığı zaman, girilen
değerleri alın ve bağlantı cümlesi oluşturun.
private void Button1_Click(System.Object
sender,System.EventArgs e)
{
ConnectionString = "";
// Access Veritabani seçili ise
if (comboBox1.SelectedIndex == 0)
{
Database = txtVeritabani.Text;
ADO.NET
78
ConnectionString = "Provider= " + Provider +
";Data Source= " + Database ;
}
else
{
KullaniciAdi = txtKullaniciAdi.Text;
Parola = txtParola.Text;
TimeOut = txtTimeOut.Text;
Server = txtSunucu.Text;
Database = txtVeritabani.Text;
if (Provider != "")
{
ConnectionString = "Provider=" + Provider + ";";
}
ConnectionString
ConnectionString
ConnectionString
ConnectionString
ConnectionString
+=
+=
+=
+=
+=
"Data Source=" + Server;
";Initial Catalog=" + Database;
";User ID=" + KullaniciAdi;
";Password=" + Parola;
";Connection TimeOut=" + TimeOut;
}
lblConnectionString.Text = ConnectionString;
}
5. Bağlantı cümlesi oluşturulduktan sonra, bu cümleyi kullanarak
Connection nesnesi oluşturun. Burada dikkat edilmesi gereken
nokta, kullanıcının seçtiği veritabanı tipine göre farklı bağlantı nesnesi
oluşturulmasıdır.
private void Button2_Click(System.Object sender,
System.EventArgs e)
{
// Access veritabani seçili ise
if (comboBox1.SelectedIndex == 0)
{
oleDbCon = new
System.Data.OleDb.OleDbConnection(ConnectionString);
oleDbCon.StateChange+= new
StateChangeEventHandler(DurumDegisti);
}
else
{
sqlCon = new
System.Data.SqlClient.SqlConnection(ConnectionString);
sqlCon.StateChange += new
StateChangeEventHandler(DurumDegisti);
}
}
// Bağlantı durumu değiştiği zaman, DurumDegisti
// yordamındaki kodlar çalışır.
private void DurumDegisti(Object sender,
System.Data.StateChangeEventArgs e)
{
// Bağlantının durumu kullanıcıya bildirilir.
lblConnectionState.Text = e.CurrentState.ToString();
}
ADO.NET
79
Modul 3
6. Bağlantı nesnesi oluşturulduktan sonra, Connection Aç düğmesine
basılınca bağlantı Open metodu ile açın. Ancak kullanıcının bazı
değerleri yanlış girmesi durumu göz önüne alınarak Try Catch
blokları kullanılmalıdır.
private void Button3_Click(System.Object sender,
System.EventArgs e)
{
if (oleDbCon != null)
{
// OleDB baglantisi olusturulduysa
try
{
oleDbCon.Open();
}
catch (InvalidOperationException ex)
{
MessageBox.Show(ex.Message.ToString());
}
catch (System.Data.OleDb.OleDbException ex)
{
MessageBox.Show(ex.Message.ToString());
}
}
else
{
// Sql baglantisi olusturulduysa
try
{
sqlCon.Open();
}
catch (InvalidOperationException ex)
{
MessageBox.Show(ex.Message.ToString());
}
catch (System.Data.SqlClient.SqlException ex)
{
MessageBox.Show(ex.Message.ToString());
}
}
}
}
7. Connection Kapat düğmesine basılınca oluşturulan bağlantıyı bularak
kapatın.
private void Button4_Click(System.Object sender,
System.EventArgs e)
{
if (oleDbCon != null)
{
// OleDB baglantisi olusturulduysa
oleDbCon.Close();
}
else
{
// Sql baglantisi olusturulduysa
sqlCon.Close();
}
}
ADO.NET
Modul 5:
Modül 4: Bağlantılı (Connected) Veritabanı
İşlemleri
Bu modülde ADO.NET ile bağlantılı veritabanı işlemlerin nasıl yapıldığını
öğreneceksiniz.
81
Konu: 4
Bu modülün sonunda:
•
Bağlantılı veri ortamlarıyla çalışmayı öğrenecek,
•
Command oluşturabilecek,
•
Command ile geriye tek değer veya kayıt kümesi döndürebilecek,
•
Command ile
çalıştırabilecek,
INSERT,
UPDATE
ve
DELETE
sorgularını
82
Modül 4: Connected Veritabanı İşlemleri
Konu 1: Bağlantılı Veri Ortamlarıyla
Çalışmak
Bağlantılı Uygulamalar İçin Veritabanı Mimarisi
83
Konu: 4
Bağlantılı veri ortamları, uygulamaların veri kaynağına sürekli bağlı kaldığı
ortamlardır. Bu ortamlarda veri alma ve değiştirme işlemleri uygulama ile veri
kaynağı arasında bağlantı kurulduktan sonra gerçekleştirilir.
Bağlantılı veri ortamları ile veritabanı üzerinde, gerekli tüm veritabanı işlemleri
yapılabilir.
•
Veritabanından tek değer çekme
•
Sadece okunabilir kayıt kümeleri döndürme
•
Kayıt ekleme
•
Kayıt silme
•
Kayıt güncelleme
Bağlantılı veri ortamları içerisinde kullanılan sınıflar Tablo 4.1 de belirtilmiştir.
Sınıf
Açıklama
XXXConnection
Bağlantı açmak ve kapatmak için kullanılan nesnedir.
XXXCommand
Veritabanı üzerinde Stored Procedure (Saklı Yordam)
veya SQL Cümleleri çalıştırmak için kullanılan
nesnedir.
XXXDataReader
Veritabanından sadece okunur ve ileri hareketli
kayıtlar çekmek için kullanılan nesnedir. Kayıtlar
XXXCommand nesnesinin ExecuteReader metodu
ile XXXDataReader içerisine aktarılır.
Tablo 4.1. Bağlantılı Veri Ortamı Sınıfları
84
Modül 4: Connected Veritabanı İşlemleri
Konu 2: Command ile Çalışmak
Commmand Nedir?
Command, veritabanı üzerinde Stored Procedure (Saklı Yordam) ve Sorgu
85
Konu: 4
çalıştırmak için kullanılır. Command Nesneleri ile veritabanı tablolarında; sorgu,
ekleme, silme ve güncelleme işlemleri yapılabilir.
Tablo 4.2 de hangi veri sağlayıcı için hangi Command Nesnesinin kullanıldığı
gösterilmektedir.
Tablo 4.2.
Command
Nesnelerı
Nesne
Veri Sağlayıcıları
System.Data.SqlClient.SqlCommand
SQL Server .NET Veri Sağlayıcısı
System.Data.OleDb.OleDbCommand
OLE DB .NET Veri Sağlayıcısı
System.Data.OleDb.ODBCCommand
ODBC .NET Veri Sağlayıcısı
Veritabanı
üzerinde
Stored Procedure ve Sorgu çalıştırmak için Command Nesnelerinin belirli
özelliklerini kullanmak gerekir. Command Nesnelerinin bu özellikleri aşağıda
belirtilmiştir.
•
Name: Command nesnesinin kod içerisindeki ismidir. Bu isim
Command nesnesine başvurmak için kullanılır.
•
Connection: Command nesnesinin hangi Connection üzerinde
çalışacağını belirler.
•
CommandType: Çalıştırılacak komutun türünü belirtir. Text, Stored
Procedure ve TableDirect olmak üzere üç değeri vardır.
TableDirect SQL Server tarafından desteklenmez.
•
CommandText: Stored Procedure adını veya Sorgu cümlesini tutar.
86
Modül 4: Connected Veritabanı İşlemleri
•
Parameters: Command içerisinde çalıştırılacak Stored Procedure
veya Sorgu cümlesine, dışardan değer almak ve dışarıya değer
göndermek için kullanılır. Her bir Command Nesnesi için bir veya
birden çok parametre tanımlanabilir.
Command özelliklerine değer girildikten sonra, Command’ı çalıştırmak için
Tablo 4.3 deki metotlardan uygun olan seçilir.
Command Metodu
Açıklama
ExecuteScalar
Çalıştırılan Command nesnesinden geriye tek
değer döndürmek için kullanılır.
ExecuteReader
Çalıştırılan Command nesnesinden geriye
kayıt kümesi döndürmek için kullanılır.
ExecuteNonQuery
Command Nesnesi üzerinde veri güncelleme,
değiştirme ve silme işlemleri yapmak için
kullanılır. Bu işlemin sonucunda etkilenen
kayıt sayısı geriye döndürür.
ExecuteXmlReader
Çalıştırılan Command Nesnesinden geriye
XML döndürmek için kullanılır. Sadece SQL
Server 7.0 ve sonraki versiyonları için
kullanılır.
Tablo 4.3: Command Metotları
87
Konu: 4
Command Oluşturmak
Command, kod içerisinden veya ToolBox üzerinden oluşturulabilir. Bu
yöntemler ile kullanılan veritabanına göre, OleDbCommand veya SqlCommand
nesneleri oluşturulur.
Örnekte Access veritabanına bağlanmak için, OleDbCommand sınıfı
tanımlanmış ve bu Command sınıfının gerekli özelliklerine değer atanmıştır.
//Access Veritabanına bağlanmak için Command tanımlanır.
System.Data.OleDb.OleDbCommand cmd = new
System.Data.OleDb.OleDbCommand();
//Command Sınıfının CommandText özelliğine universiteler
cmd.CommandText="select * from universiteler";
//Command Sınıfının Connection özelliğine aktif connection
//aktarılır
cmd.Connection=conn;
//Command Sınıfına, sorgu cümlesi yazılacağını belirler.
cmd.CommandType=CommandType.Text;
ToolBox üzerinden Command nesnesi oluşturmak için belirtilen adımları takip
edin.
1- Veri kaynağına bağlantı kurmak için Connection tanımlanır.
2- ToolBox içinden Data paneli seçilir.
3- Data panelindeki OleDbCommand veya SqlCommand nesnesi form üzerine
sürüklenir.
88
Modül 4: Connected Veritabanı İşlemleri
4- Eklenen Command nesnesinin özellikleri Tablo 4.4’e göre ayarlanır.
Özellik
Açıklama
Name
Command nesnesinin kod içerisinde
kullanılan ismidir.
Connection
Command nesnesinin hangi Connection
üzerinde çalışacağını belirler. Bu özellik ile
yeni Connection oluşturabilir veya var olan
Connection nesnesine bağlanılabilir.
CommandType
Command nesnesinin tipini belirler.
Çalıştırılacak Command’a göre Text,
StoredProcedure ve TableDirect
seçilir.
Text: SQL Cümlesi
StoredProcedure: Kayıtlı Yordam
TableDirect: Tablo kayıtları
TableDirect sadece OleDbCommand
nesnesi tarafından kullanılır.
CommandText
Command nesnesinin çalıştırılacak
komutudur. Seçilen CommandType’a göre
CommandText belirlenir.
Text: Çalıştırılacak SQL Cümlesi.
StoredProcedure: Çalıştırılacak Stored
Procedure adı.
TableDirect: Veritabanındaki Tablo adı
Parameters
Tablo 4.4: Command Özellikleri
Command nesnesinin CommandText
komutuna dışardan değer almak veya
komuttan geriye değer döndürmek için
kullanılır. Parameters özelliği Collection
olduğu için bir veya birden çok değer alabilir
veya gönderebilir.
89
Konu: 4
Parametre Kullanmak
Stored Procedure ve SQL Cümleleri parametre alabilir veya gönderebilir.
Ayrıca Stored Procedure geriye tek değer bile döndürebilir.
Stored Procedure ve SQL Cümlelerinin parametre değerlerini saklamak için,
XXXCommand nesnesinin Parameters özelliği kullanılır. Aynı zamanda bu
özellik XXXParameters nesnesinin koleksiyonudur.
Command nesnesi çalıştırılmadan önce, komuttaki her giriş parametresi için bir
değer girilmelidir. Ayrıca Command nesnesi çalıştırıldıktan sonra, sonuç
parametrelerinin değerleri geriye döndürülebilir.
Command nesnesine parametre eklemek için aşağıdaki yöntemler kullanılır.
•
•
XxxParameter nesneleri oluşturulur ve Command nesnesinin
Parameters koleksiyonuna bu nesneler eklenir.
Properties penceresi kullanılarak Command nesnesinin
Parameters özelliğine tasarım aşamasında parametreler eklenir.
XXXParameter nesnesini kullanarak,
adımlar takip edilir.
parametre eklemek için aşağıdaki
1- Yeni bir OleDbParameter veya SqlParameter nesnesi oluşturulur.
2- Eklenen Parameter nesnesinin özellikleri Tablo 4.5 göre ayarlanır.
90
Modül 4: Connected Veritabanı İşlemleri
Property
Açıklama
ParameterName
Parametrenin ismi, @Ad gibi
DbType ,SqlDbType, OleDbType Parametrenin veri türü. Kullanılan veri tabanına
göre SqlDbType veya OleDbType
enumeratorlerinden seçilir.
Size
Parametredeki verinin byte olarak maksimum
boyutu.
Direction
Parametrenin türü. ParameterDirection
değerlerinden biri ile belirtilir. Bu özelliğin
alabileceği değerler:
ParameterDirection.Input (varsayılan
değer)
ParameterDirection.InputOutput
ParameterDirection.Output
ParameterDirection.ReturnValue
Tablo 4.5: XxxParameter Özellikleri
3- XxxParameter nesnelerini Command nesnesine eklemek için,
Command nesnesinin Parameters koleksiyonunu içerisindeki Add
metodu kullanılır. Eğer bu komut sonuç döndürecek bir stored procedure
çağırıyorsa, herhangi bir parametre eklemeden önce
ParameterDirection.ReturnValue parametresini eklenmelidir.
Parametrelerin eklenme sırası önemli değildir.
Tablo 4.6 da Direction özelliğinin değerleri listelenmiştir.
91
Konu: 4
Enumeratör
Özellik
Input
Girdi parametresidir. Varsayılan
değerdir.
Output
Çıktı parametresidir.
InputOutput
Girdi ve çıktı parametresi olarak
kullanılır.
ReturnValue
Bir fonksiyon sonucunu geri
döndürmek için kullanılır.
Tablo 4.6 Direction Özelliğinin Enumeratörleri
Örnekte EmployeeLogin isminde bir stored procedure için, paramUser, ve
paramPass isminde iki OleDbParameter tanımlanmış ve bu parametreler
Command nesnesinin Parameters koleksiyonuna eklenmiştir.
System.Data.OleDb.OleDbParameter paramUser = new
System.Data.OleDb.OleDbParameter("@userName",
System.Data.OleDb.OleDbType.Char, 50);
paramUser.Direction = ParameterDirection.Input;
System.Data.OleDb.OleDbParameter paramPass = new
System.Data.OleDb.OleDbParameter("@userPass",
System.Data.OleDb.OleDbType.Char, 20);
paramPass= ParameterDirection.Input;
cmd.Parameters.Add(paramUser);
cmd.Parameters.Add(paramPass);
ToolBox kontrollerini kullanarak parametre eklemek için, aşağıdaki adımlar
takip edilir.
1- Toolbox üzerinden OleDbCommand veya SqlCommand nesnesi seçilir ve
forma eklenir.
2- Properties penceresinden, bu Command nesnesinin Connection,
CommandType ve CommandText özelliklerine değerler atanır.
3- CommandText özelliğine değer girildikten sonra, ekrana çıkan “Bu komut
nesnesi için parametre eklemek ister misiniz?” ileti kutusuna Evet denir.
4- Visual Studio .NET ortamı Command nesnesi için parametre oluşturacak
kodları otomatik olarak ekler.
92
Modül 4: Connected Veritabanı İşlemleri
Konu 3: Command ile Geriye Değer
Döndürmek
Çalıştırılan stored procedure ya da SQL cümlesinden geriye tek değer
döndürülebilir. Bu tür durumlar için DataSet yerine Command nesnesi
kullanılmalıdır.
Command ile geriye tek değer döndüren senaryolara, aşağıdaki örnekler
verilebilir.
•
Stok tablosundaki toplam stok miktarını geriye döndürmek için
•
Ürün tablosundaki toplam kayıt sayısını geriye döndürmek için
•
Ürün kategorisine göre toplam ürün sayısını geriye döndürmek için
OleDbCommand veya SqlCommand nesnesi ile geriye değer döndürmek için,
ExecuteScalar metodu kullanılır.
Örnekte OleDbCommand nesnesinin ExecuteScalar metodu ile Universiteler
tablosundaki toplam kayıt sayısı geri döndürülmektedir.
System.Data.OleDb.OleDbConnection conn = new
System.Data.OleDb.OleDbConnection(@"provider =
Microsoft.JET.OLEDB.4.0; Data source=..\universiteler.mdb");
System.Data.OleDb.OleDbCommand cmd = new
System.Data.OleDb.OleDbCommand("select count(*) from"+
"universiteler", conn);
conn.Open();
MessageBox.Show(cmd.ExecuteScalar.ToString());
ExecuteScalar metodu ile geriye değer döndürmek için, sadece Sum veya
Count gibi fonksiyonlar kullanılmaz. Aynı zamanda Select cümlesi veya Stored
93
Konu: 4
Procedure ile geriye tek değer döndürülebilir. Örnekte Ürün Tablosundaki Stok
Miktarı SqlCommand nesnesi ile geriye döndürülmektedir.
string sql ="SELECT StokMiktari FROM Urun WHERE UrunID=" +
"@UrunID";
System.Data.SqlClient.SqlCommand cmUrun = new
System.Data.SqlClient.SqlCommand(sql,cnAlisveris);
System.Data.SqlClient.SqlParameter prmID = new
System.Data.SqlClient.SqlParameter("@UrunID",System.Data.Sql
DbType.Int, 4);
cmUrun.Parameters["@UrunID"].Value = 42;
cnAlisveris.Open();
int adet = Convert.ToInt32(cmUrun.ExecuteScalar());
cnAlisveris.Close();
MessageBox.Show("Quantity in stock: " + adet.ToString());
Konu 4: Command ile Geriye Kayıt
Döndürmek
Çalıştırılan stored procedure ya da SQL cümlesi, geriye birden çok değer veya
kayıt kümesi döndürülebilir. Bu tür durumlar için DataAdapter veya
DataReader nesneleri kullanılır. Bu nesnelerin genel farkı, DataReader
bağlantılı, DataAdapter Bağlantısız veri ortamları için kullanılır.
DataReader nesnesinin kullanıldığı senaryolara, aşağıdaki örnekler verilebilir.
94
Modül 4: Connected Veritabanı İşlemleri
•
Tablodan tek kayıt döndürmek.(Müsteri tablosundan MüsteriID ye
göre kayıt döndürmek)
•
Sadece okunur sonuçlar döndürmek. (Web Form üzerinde aranan
ürünlerin, sonuçlarını döndürmek )
OleDbCommand veya SqlCommand nesnesi ile geriye kayıt döndürmek için,
ExecuteReader
metodu kullanılır. ExecuteReader ile dönen kayıtlar
DataReader nesnesine aktarılır.
DataReader Özellik ve Metotları
DataReader dönen kayıtlar üzerinde işlem yapmayı sağlayan metot ve
özelliklere sahiptir. DataReader nesnesinin bu özellik ve metotları aşağıda
işlemleri yapar.
•
•
•
•
Kayıt kümesi içindeki kayıtları tek tek okur.
Kaydın belirli bir kolonunu veya tüm kolonlarını okur.
Kolonların içerisinde değer olup olmadığını kontrol eder.
Kolonların şema bilgilerini okur. (ColumnName, ColumnOrdinal,
ColumnSize, NumericPrecision, NumericScale,
Datatype,ProviderType, Islong,AllowDBNull)
NOT: DataReader, verilere tek yönlü(forward-only) ve okunabilir (read-only) erişdiği için
oldukça hızlıdır.
DataReader nesnesinin metotları Tablo 4.7 de gösterilmiştir.
95
Konu: 4
Metot
Close
Açıklama
DataReader nesnesini kapatılır ve hafızadan
kaldırır.
GetBoolean
Belirli bir kolonun değerini boolean olarak geri
döndürür.
GetByte
Belirli bir kolonun değerini byte olarak geri
döndürür.
GetBytes
Belirli bir kolonun değerini byte dizisi olarak geri
döndürür.
GetChar
Belirli bir kolonun değerini char olarak geri
döndürür.
GetChars
Belirli bir kolonun değerini karakter dizisi olarak
geri döndürür.
GetDataTypeName
Belirli bir kolonun veri türünü verir.
GetDateTime
Belirli bir kolonun değerini DateTime olarak geri
döndürür.
GetDecimal
Belirli bir kolonun değerini Decimal olarak geri
döndürür.
GetDouble
Belirli bir kolonun değerini Double olarak geri
döndürür.
GetFieldType
Belirli bir kolonun veri türünü geri döndürür.
GetFloat
Belirli bir kolonun değerini Float olarak geri
döndürür.
GetGuid
Belirli bir kolonun değerini Globally-unique
identifier(GUID) olarak geri döndürür.
GetInt16
Belirli bir kolonun değerini 16-bit tamsayı(Short)
olarak geri döndürür.
GetInt32
Belirli bir kolonun değerini 32-bit
tamsayı(Integer) olarak geri döndürür.
GetInt64
Belirli bir kolonun değerini 64-bit tamsayı(Long)
olarak geri döndürür.
GetName
Belirli bir kolonun ismini geri döndürür.
GetOrdinal
Belirli bir kolonun sıra numarasını geri döndürür.
GetSchemaTable
DataReader nesnesinin şema bilgilerini gösterir.
Tablo hakkındaki detay bilgilerini gösterir.
GetString
Belirli bir kolonun değerini string olarak geri
döndürür.
GetTimeSpan
Belirli bir kolonun değerini TimeSpan nesnesi
olarak geri döndürür.
GetValue
Belirli bir kolonun değerini geri döndürür.
GetValues
Belirli bir kaydın tüm kolon değerlerini geri
döndürür.
NextResult
Komut metninde birden fazla SELECT ifade varsa,
sonuçlar bu metot kullanılarak farklı veri kümeleri
96
Modül 4: Connected Veritabanı İşlemleri
gibi alınabilir.
Read
DataReader nesnesinde okunacak kayıt olduğu
sürece okuma yapar. Kayıt varsa True, yoksa
False değeri geri döndürür.
Tablo 4.7 DataReader Metodları
DataReader, Bağlantılı veri ortamlarında kullanıldığı için veri kaynağına sürekli
bağlıdır. Bundan dolayı veri alış işlemi bittikten sonra Connection ya da
DataReader nesnesi kapatılarak, belleğin daha etkin kullanılması sağlanır.
DataReader nesnesinin özellikleri Tablo 4.8 de gösterilmiştir.
Özellik
Açıklama
FieldCount
DataReader içinde tutulan sütun sayısını belirtir.
IsClosed
DataReader bağlantısının durumunu belirtir.
Bağlant açık ise FALSE , kapalı ise TRUE döndürür.
Item
DataReader ile gelen verilere erişim sağlar.
RecordAffected
DataReader ile gelen kayıt sayısını verir.
Tablo 4.8 DataReader Özellikleri
97
Konu: 4
DataReader kullanarak kayıt çekmek için aşağıdaki adımları takip edin.
1- Bağlanılacak veritabanına göre Connection nesnesi eklenir
2- Bağlanılacak veritabanına göre OleDbCommand veya SqlCommand
nesnesi eklenir ve gerekli özellikleri ayarlanır.
3- Veritabanı bağlantısı açılır.
4- DataReader tanımlanır. Command nesnesinin ExecuteReader metodu
ile çağrılan kayıtlar DataReader nesnesine atanır.
5- DataReader nesnesinin Read metodu False oluncaya kadar, kayıtlar
döngü ile okunur ve Form kontrollerine aktarılır.
6- DataReader kapatılır.
Örnekte Ürün Tablosundaki tüm ürünler, OleDbDataReader ile form üzerindeki
ListBox kontrolüne eklenir.
System.Data.OleDb.OleDbCommand cmUrun = new
System.Data.OleDb.OleDbCommand("SELECT UrunAdi, StokMiktari"
+"FROM Urun", cnAlisveris);
cnAlisveris.Open();
System.Data.OleDb.OleDbDataReader rdrUrun;
rdrUrun =
cmUrun.ExecuteReader(CommandBehavior.CloseConnection);
while (rdrUrun.Read())
{
listBox1.Items.Add(rdrUrun.GetString(0)+" - "+
rdrUrun.GetInt16(1));
}
rdrUrun.Close();
98
Modül 4: Connected Veritabanı İşlemleri
Konu 5: Command ile Kayıt Döndürmeyen
Sorgular Çalıştırmak
Command ile veritabanı yapısında değişiklik yapılabilir (Tablo, View ve Stored
Procedure oluşturmak, değiştirmek ve silmek), güvenlik seçenekleri
ayarlanabilir (Tablo ve View izinleri) ve veritabanı içerisindeki veri değiştirilebilir
(Kayıt ekleme, silme ve güncelleme). OleDbCommand veya SqlCommand
nesnesi ile bu tür işlemlerin yapılabilmesi için, ExecuteNonQuery metodu
kullanılır.
ExecuteNonQuery Metodu ile Select hariç SQL (Structured Query Language)
ve T-SQL (Transact- Structured Query Language) komutları kullanılır.
SQL "Structured Query Language" (Yapılandırılmış Sorgulama Dili) veritabanı
sorgu dilidir. SQL ile veritabanına kayıt ekleme, silme, var olan kaydı
düzenleme ve kayıt sorgulama işlemleri yapılabilir. SQL standart bir veritabanı
sorgu dilidir ve Oracle, db2, Sybase, Informix, Microsoft SQL Server, MS
Access gibi veritabanı yönetim sistemlerinin temelini oluşturur. En sık kullanılan
SQL komutları SELECT, INSERT, UPDATE ve DELETE komutlarıdır.
SQL Server’ın sorgulama ve programlama diline T-SQL denir. Transact-SQL
ile ilişkisel veritabanı sistemi yönetilebilir. Transact–SQL komutları kullanım
amaçlarına göre üç genel kategoriye ayrılır.
Bunlar:
•
SQL Veri İşleme Dili (Data Manipulation Language-DML)
99
Konu: 4
SQL Veri İşleme Dili; veri girmek, değiştirmek, silmek ve verileri almak için
kullanılır. En sık kullanılan DML komutları ve kullanım amaçları Tablo 4.9
gösterilmiştir.
DML Komutu
Açıklama
SELECT
Veri seçmek
DELETE
Veri silmek
UPDATE
Veri güncellemek
INSERT
Veri girmek
Tablo 4.9 DML Komutları
• SQL Veri Tanımlama Dili (Data Definition Language-DDL)
SQL Veri Tanımlama Dili; Veritabanı nesnelerini yaratmak, silmek ve bazı
temel özelliklerinin düzenlemek için kullanılır. En sık kullanılan DDL komutları
ve kullanım amaçları Tablo 4.10’da gösterilmiştir.
DDL Komutu
Açıklama
CREATE
Yeni bir veritabanı nesnesi yaratmak. Örnek
CREATE TABLE, CREATE TRIGGER
ALTER
Veritabanı nesnelerinde değişiklik yapmak.
Örnek ALTER TABLE, ALTER TRIGGER
DROP
Veritabanı nesnelerini silmek. Örnek DELETE
TABLE, DELETE TRIGGER
Tablo 4.10 DDL Komutları
• SQL Veri Kontrol Dili (Data Control Language-DCL)
SQL Veri Kontrol Dili; bir veritabanı kullanıcısı veya rolü ile ilgili izinlerin
düzenlenmesini sağlar. Aşağıdaki tablo DCL komutlarını ve fonksiyonlarını
göstermektedir.
DCL Komutu
Açıklama
GRANT
Kullanıcıya yetki vermek
DENY
Kullanıcı, grup veya rolü herhangi bir eylem
için engeller.
REVOKE
Daha atanmış olan yetki veya engeli kaldırır.
Tablo 4.11 DCL Komutları
ExecuteNonQuery metodu ile DDL ve DCL komutları çalıştırmak için aşağıdaki
adımları takip edin
1- Bağlanılacak veritabanına göre Connection nesnesi eklenir
2- Bağlanılacak veritabanına göre OleDbCommand veya SqlCommand
nesnesi eklenir ve gerekli özellikleri ayarlanır.
3- Veritabanı bağlantısı açılır.
4- Command nesnesinin ExecuteNonQuery metodu kullanılır.
5- Veritabanı bağlantısı kapatılır.
100
Modül 4: Connected Veritabanı İşlemleri
Örnekte SqlCommand nesnesinin ExecuteNonQuery metodu çalıştırılarak, Ürün
isminde tablo oluşturulmaktadır.
System.Data.SqlClient.SqlCommand cmUrunTabloOlustur = new
System.Data.SqlClient.SqlCommand("CREATE TABLE Urun (UrunID"
+ "int, UrunAdi varchar(50), StokMiktari int) ",
connAlisveris);
cmUrunTabloOlustur.CommandType = CommandType.Text;
try
{
connAlisveris.Open();
int kayitSayisi;
kayitSayisi=cmUrunTabloOlustur.ExecuteNonQuery();
connAlisveris.Close();
MessageBox.Show(kayitSayisi+" "+"kayıt eklendi.");
}
catch(Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
ExecuteNonQuery metodu ile INSERT, UPDATE ve DELETE sorguları
çalıştırılabilir.
Örnekte ExecuteNonQuery metodu çalıştırılarak, Ürün tablosuna yeni kayıt
eklenmiştir.
System.Data.SqlClient.SqlCommand cmd = new
System.Data.SqlClient.SqlCommand("INSERT INTO Urun"+
"(UrunID,UrunAdi,StokMiktari) VALUES" +
"(@UrunID,@UrunAdi,@StokMiktari)", connAlisveris);
cmd.Parameters.Add("@UrunID", 1);
cmd.Parameters.Add("@UrunAdi", "DVD");
cmd.Parameters.Add("@StokMiktari", 15);
try
{
connAlisveris.Open();
int kayitSayisi = cmd.ExecuteNonQuery();
connAlisveris.Close();
MessageBox.Show(kayitSayisi+" "+"kayıt eklendi.");
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
Örnekte ExecuteNonQuery metodu çalıştırılarak, Ürün tablosunda kayıt
güncellenmiştir.
System.Data.SqlClient.SqlCommand cmd = new
System.Data.SqlClient.SqlCommand("Update Urun Set" +
"StokMiktari = @StokMiktari Where UrunID = @UrunID",
connAlisveris);
cmd.Parameters.Add("@UrunID", 1);
cmd.Parameters.Add("@StokMiktari", 30);
try
{
connAlisveris.Open();
int kayitSayisi = cmd.ExecuteNonQuery();
connAlisveris.Close();
MessageBox.Show(kayitSayisi+" kayıt değiştirildi.");
101
Konu: 4
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
Örnekte ExecuteNonQuery metodu çalıştırılarak, Ürün tablosundan kayıt
silinmiştir.
System.Data.SqlClient.SqlCommand cmd = new
System.Data.SqlClient.SqlCommand("Delete Urun Where"+
"UrunID= @UrunID", connAlisveris);
cmd.Parameters.Add("@UrunID", 1);
try
{
connAlisveris.Open();
int kayitSayisi=cmd.ExecuteNonQuery();
connAlisveris.Close();
MessageBox.Show(kayitSayisi+" kayıt silindi.");
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
Modül Özeti
1.
2.
3.
4.
5.
Bağlantılı veri ortamı hangi .NET nesneleri ile gerçekleştirilir?
Command nesnesinin kaç farklı çalıştırılma biçimi vardır? Açıklayın.
Command nesnesinin Parameters özelliği ne için kullanılır?
DataReader nesnesinin çalışma modelini bir örnekle açıklayın.
Kaç farklı SQL sorgu türü vardır?
102
Modül 4: Connected Veritabanı İşlemleri
Lab 1: Veritabanı İşlemleri
Bu uygulamada, veritabanındaki Personel tablosu üzerinde kayıt işlemleri
gerçekleştirilir. Personel kayıtlarının okunup TextBox kontrollerine
doldurulması, yeni personel kaydının eklenmesi, bir personelin bilgilerinin
güncellenmesi veya silinmesi işlemleri yapılır.
Bu lab tamamlandıktan sonra:
•
Access veritabanına bağlantı oluşturabilecek,
•
Command nesnesinin ExecuteNonQuery metodu ile INSERT,
DELETE sorgusu çalıştırabilecek,
•
Sorgulara parametre ekleyebilecek,
•
Command nesnesinin ExecuteReader metodu ile DataReader
oluşturabilecek,
•
DataReader nesnesi ile kayıt okuyabileceksiniz.
Veritabanının oluşturulması
Bu uygulamada kullanılacak Personel tablosu için bir veritabanı oluşturulması
gerekir.
1. Microsoft Access ile “kisi” isminde bir veritabanı oluşturun.
2. Veritabanına Personel isminde bir tablo ekleyin ve tabloda belirtilen
kolonları ekleyin.
103
Konu: 4
Alan Adı
Veri Türü
Numara
AutoNumber
Ad
Text
Soyad
Text
DogumTarihi
Date/Time
Adres
Text
Sehir
Text
Kontrollerin eklenmesi
Personel isminde yeni bir Windows projesi açın.
Form üzerine, tablodaki kontrolleri ekleyin belirtilen özelliklerini ayarlayın.
Kontrol – Kontrol İsmi
Özellik
Değer
TextBox – txtAd
BorderStyle
FixedSingle
TextBox – txtSoyad
BorderStyle
FixedSingle
TextBox – txtDTarihi
BorderStyle
FixedSingle
TextBox – txtSehir
BorderStyle
FixedSingle
TextBox – txtAdres
BorderStyle
FixedSingle
Multiline
True
ComboBox – cbNo
ScrollBars
DropDownStyle
Vertical
DropDownList
Button – btnYeni
Text
Yeni
Button – btnIptal
Text
İptal
Button – btnKaydet
Text
Kaydet
Button – btnSil
Text
Sil
104
Modül 4: Connected Veritabanı İşlemleri
Kodların yazılması
Personel tablosu üzerinde işlem yapılması için veritabanına bağlantı açılması
gerekir. Bu bağlantı için gereken Connection String ifadesinin merkezi bir
yerden alınması, değişiklik durumunda kolaylık sağlayacaktır.
1. Projeye bir modül ekleyin ve bağlantı dizisini tanımlayın.
public string connStr=@"Provider=Microsoft.Jet.OLEDB.4.0;
Data Source=C:\Samples\kisi.mdb";
DİKKAT: Bu aşamadan sonra kodlar, Formun kod tarafına yazılacaktır.
ExecuteNonQuery metodu
2. Veritabanına yeni bir Personel kaydı eklemek için gereken kodları bir
yordam altında yazın.
public void Kaydet()
{
System.Data.OleDb.OleDbConnection conn = new
System.Data.OleDb.OleDbConnection();
conn.ConnectionString = Module1.connStr;
System.Data.OleDb.OleDbCommand comm = new
System.Data.OleDb.OleDbCommand();
comm.Connection = conn
comm.CommandType = CommandType.Text;
comm.CommandText = "INSERT INTO"+
"Personel(Ad,Soyad,DogumTarihi,Adres,Sehir)"+
"values(@ad,@soyad,@tarih,@adres,@sehir)";
comm.Parameters.Add("@ad", txtAd.Text);
comm.Parameters.Add("@soyad", txtSoyad.Text);
comm.Parameters.Add("@tarih", txtDTarihi.Text);
comm.Parameters.Add("@adres", txtAdres.Text);
comm.Parameters.Add("@sehir", txtSehir.Text);
try
{
conn.Open();
comm.ExecuteNonQuery();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
105
Konu: 4
finally
{
conn.Close();
}
}
3. Verilen bir Personel numarasına göre tablodan kayıt silme işlemini
gerçekleştiren kodları yazın.
public void Sil(int ID)
{
System.Data.OleDb.OleDbConnection conn = new
System.Data.OleDb.OleDbConnection();
conn.ConnectionString = Module1.connStr;
System.Data.OleDb.OleDbCommand comm = new
System.Data.OleDb.OleDbCommand();
comm.Connection = conn;
comm.CommandType = CommandType.Text;
comm.CommandText = "Delete from Personel Where"+
"Numara=@No";
comm.Parameters.Add("@No", ID);
try
{
conn.Open();
comm.ExecuteNonQuery();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
conn.Close();
}
}
ExecuteReader ve DataReader
4. ComboBox kontrolüne personel numaralarını dolduran kodları yazın. Bu
ComboBox, personel kayıtlarını numaraya göre seçmek için kullanılacaktır.
public void IDDoldur()
{
cbNo.Items.Clear();
System.Data.OleDb.OleDbConnection conn = new
System.Data.OleDb.OleDbConnection();
conn.ConnectionString = Module1.connStr;
System.Data.OleDb.OleDbCommand comm = new
System.Data.OleDb.OleDbCommand();
comm.Connection = conn;
comm.CommandType = CommandType.Text;
comm.CommandText = "Select Numara from Personel";
System.Data.OleDb.OleDbDataReader dr;
try
{
conn.Open();
dr = comm.ExecuteReader();
106
Modül 4: Connected Veritabanı İşlemleri
while(dr.Read())
{
cbNo.Items.Add(dr.GetInt32(0));
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
dr.Close();
conn.Close();
}
}
5. ComboBox kontrolünden seçilen personel numarasına göre formdaki
kontrollerin doldurulmasını sağlayan kodları yazın.
public void IDyeGoreFormDoldur(int ID)
{
System.Data.OleDb.OleDbConnection conn = new
System.Data.OleDb.OleDbConnection();
conn.ConnectionString = Module1.connStr;
System.Data.OleDb.OleDbCommand comm = new
System.Data.OleDb.OleDbCommand();
comm.Connection = conn;
comm.CommandType = CommandType.Text;
comm.CommandText = "Select Ad,Soyad,Adres, Sehir, "+
"DogumTarihi from Personel Where Numara=@No";
comm.Parameters.Add("@No", ID);
System.Data.OleDb.OleDbDataReader dr;
try
{
conn.Open();
dr = comm.ExecuteReader();
if(dr.Read())
{
txtAd.Text = dr.GetString(0);
txtSoyad.Text = dr.GetString(1);
txtAdres.Text = dr.GetString(2);
txtSehir.Text = dr.GetString(3);
txtDTarihi.Text = dr.GetString(4);
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
dr.Close();
conn.Close();
}
}
Form Kontrolleri işlemleri
6. Formdaki TextBox kontrollerinin değerlerini sıfırlayan kodları yazın.
public void Temizle()
{
107
Konu: 4
Control kontrol = new Control();
foreach(TextBox kontrol in this.Controls)
{
kontrol.Text="";
}
txtAd.Focus();
}
7. Kayıt eklenmeden önce, tüm değerlerin doğru girilmesini kontrol eden
kodları yazın.
public bool Kontrol()
{
if(txtAd.Text == "")
{
MessageBox.Show("Adı Giriniz");
txtAd.Focus();
return false;
}
else if(txtSoyad.Text == "")
{
MessageBox.Show("Soyadı Giriniz");
txtSoyad.Focus();
return false;
}
else if(txtDTarihi.Text = "")
{
MessageBox.Show("Doğum Tarihini Giriniz");
txtDTarihi.Focus();
return false;
}
else if(txtAdres.Text = "")
{
MessageBox.Show("Adresi Giriniz");
txtAdres.Focus();
return false;
}
else if(txtSehir.Text = "")
{
MessageBox.Show("Şehiri Giriniz");
txtSehir.Focus();
return false;
}
else
{
return true;
}
}
Yordamların Formda kullanılması
8. btnKaydet düğmesinin Click olayına Kaydet ve Kontrol yordamlarını
kullanarak kaydetme işlemlerini yazın.
private void btnKaydet_Click(System.Object sender,
System.EventArgs e)
{
if(Kontrol == true)
108
Modül 4: Connected Veritabanı İşlemleri
{
Kaydet();
btnYeni.Enabled = true;
btnKaydet.Enabled = false;
btnIptal.Enabled = false;
IDDoldur();
cbNo.SelectedIndex = cbNo.Items.Count - 1;
}
}
9. btnYeni düğmesinin Click olayında formu, yeni kayıt eklemek için
hazırlayan Temizle yordamını kullanın.
private void btnYeni_Click(System.Object sender,
System.EventArgs e)
{
Temizle();
btnYeni.Enabled = false;
btnKaydet.Enabled = true;
btnIptal.Enabled = true;
cbNo.SelectedIndex = - 1;
}
10. btnIptal düğmesine basıldığı zaman kontrolleri temizleyen ve ilk kayıta
dönen kodları yazın.
private void btnIptal_Click(System.Object sender,
System.EventArgs e)
{
Temizle();
btnYeni.Enabled = true;
btnKaydet.Enabled = false;
btnIptal.Enabled = false;
cbNo.SelectedIndex = 0;
}
11. btnSil düğmesine basıldığı zaman kayıt silme işlemleri gerçekleştiren
yordamı kullanın.
private void btnSil_Click(System.Object sender,
System.EventArgs e)
{
if(MessageBox.Show[cbNo.SelectedItem + " nolu kaydı
silmek istiyor musunuz?", this.Text,
MessageBoxButtons.YesNo, MessageBoxIcon.Question,
MessageBoxDefaultButton.Button2] == DialogResult.Yes)
{
Sil(cbNo.SelectedItem);
IDDoldur();
cbNo.SelectedIndex = cbNo.Items.Count - 1;
}
}
12. Formun Load olayında ComboBox kontrolünü personel numaraları ile
dolduran yordamı kullanın.
private void frmPersonel_Load(System.Object sender,
System.EventArgs e)
{
IDDoldur();
cbNo.SelectedIndex = 0;
}
13. ComboBox kontrolünde bir personel numarası seçildiğinde, bu
personele ait bilgileri forma yükleyen kodları yazın.
Konu: 4
private void cbNo_SelectedIndexChanged(System.Object sender,
System.EventArgs e)
{
IDyeGoreFormDoldur(cbNo.SelectedItem);
}
109
Modul 6:
Modül 5: Bağlantısız (Disconnected) Veritabanı
İşlemleri
Bağlantısız veri ortamları, uygulamaların veritabanından bağımsız çalıştığı
ortamlardır. Veritabanı sunucusunun uzak olması, veri işlemlerinin uzun
111
Konu: 5
sürmesi ve mobil çalışma ihtiyacı, bağlantısız veri ortamlarına olan ihtiyacı
artırmıştır.
Bu modül tamamlandıktan sonra:
•
Bağlantısız veritabanı mimarisini öğrenecek,
•
DataAdapter nesnesinin yapısını tanıyacak
•
DataSet nesne modelini öğrenecek
•
DataTable nesne modelini öğrenecek
•
Veri arama ve sıralama işlemlerini öğreneceksiniz.
Konu 1: Disconnected Uygulamalar İçin
Veritabanı Mimarisi
Bağlantısız veri ortamı, uygulamanın veri kaynağına sürekli bağlı kalmadığı
veri ortamıdır. Bu modelde, veri kaynağının istenen bölümü çekilerek belleğe
alınır. Veri üzerinde gerekli işlemler gerçekleştirildikten sonra, veri kaynağına
aktarılarak güncelleme yapılır.
112
Modül 5: Disconnected Veritabanı İşlemleri
Bağlantısız veri ortamları içerisinde kullanılan sınıflar Tablo 5.1 de belirtilmiştir.
Sınıf
Açıklama
XXXDataAdapter
Connection, Command ve DataReader sınıflarını
kullanarak, verilerin DataSet’e doldurulmasını ve
DataSet de yapılan değişikliklerin veri tabanına
kaydedilmesini sağlar. Örneğin SqlDataAdapter sınıfı
SQL Server ile DataSet arasındaki etkileşimi sağlar.
XXXConnection
Bağlantı açmak ve kapatmak için kullanılan nesnedir.
Örneğin SqlConnection SQL Server a bağlantı sağlar.
XXXCommand
Veritabanı üzerinde Stored Procedure (Saklı Yordam)
veya SQL Cümleleri çalıştırmak için kullanılan
nesnedir. Örneğin SqlCommand SQL Server üzerinde
Stored Procedure veya SQL Cümleleri çalıştırmayı
sağlar.
XXXDataReader
Veritabanından sadece okunur ve ileri hareketli
kayıtlar çekmek için kullanılır. Örneğin SqlDataReader
ile SQL Server üzerinden kayıtlar okunur. Kayıtlar
SqlCommand nesnesinin ExecuteReader metodu ile
DataReader’a aktarılır.
Tablo 5.1. Bağlantısız Veri Ortamı Sınıfları
113
Konu: 5
Konu 2: DataSet ve DataTable
Oluşturmak
Veri kaynağından DataAdapter ile çekilen verilerin, çekirdek belleğe atılan
kopyası DataSet içerisinde saklanır. DataSet ile bu veriler üzerinde gerekli
düzenlemeler yapıldıktan sonra, veriler aynı DataAdapter ile veritabanına
aktarılır.
DataSet’in temel özellikleri aşağıda listelenmiştir:
•
•
•
•
Veri sağlayıcı türünden bağımsız çalışır: DataSet tüm verisağlayıcıları
ile kullanılabilir. Tamamen türden bağımsız çalışır.
Sürekli çevrimdışıdır: DataAdapter nesnesi ile veriler DataSet içerisine
aktarılır ve bağlantı kapatılır. Bağlantı kesildikten sonra yapılan tüm
değişiklikler DataSet içerisine kaydedilir. Bu durum uygulamanın
çevrimdışı çalışmasını sağlar.
Değişikliklerin kaydını tutar: DataSet içerisinde yapılan tüm
değişiklikler, DataAdapter nesnesi ile veri kaynağına aktarılır.
Birden fazla tablo bulundurabilir: İlişkisel veri tabanlarında olduğu gibi,
birden fazla tablo ve ilişkileri hafızada tutmanın tek yolu DataSet
kullanmaktır.
114
Modül 5: Disconnected Veritabanı İşlemleri
DataSet Nesne Modeli
DataSet, Sanal bir veritabanı yapısını temsil eder. DataTable nesnelerinden
oluşur. Bu tablolar arasında ilişkiler tanımlanabilir. DataSet’i oluşturan nesneler:
DataTable, DataColumn, DataRow, DataRelation nesneleridir.
•
DataTable
115
Konu: 5
Veritabanı tablolarını temsil eder. DataColumn, DataRow nesnelerinden
oluşur. Primary Key alanı tanımlanabilir.
•
DataColumn
DataTable nesnelerini oluşturmak için gereken kolonları temsil eder.
•
DataRow
DataTable nesneleri için veri satırlarını temsil eder.
• DataRelationship
Tablolar arasındaki ilişkileri temsil eder.
•
DataView
DataTable nesneleri üzerinde filtreleme, veri güncellemeleri işlemleri
yapmak için kullanılır.
Örnekte ds isminde yeni bir DataSet, New anahtar sözcüğü tanımlanmaktadır.
Tanımlamada DataSet’e parametre olarak girilen “YeniDataSet” değeri,
DataSet nesnesinin DataSetName argümanıdır. Eğer hiçbir isim verilmezse
varsayılan olarak “NewDataSet” ismi verilir.
DataSet ds = new DataSet(“Yeni DataSet”);
DataSet, diğer bir DataSet nesnesinden kopyalanarak oluşturulabilir. DataSet
kopyalamak için iki yöntem kullanılır. Birinci yöntem Copy metodu ile diğer bir
DataSet nesnesinin, veri ve ilişkileri (şeme bilgileri) kopyalanarak yeni bir
DataSet oluşturmak. İkinci yöntem Clone metodu ile diğer bir DataSet
nesnesinin şema bilgilerini kopyalanarak, yeni bir DataSet oluşturmak. Bu
yöntem şablon kopyalamak için kullanılır.
116
Modül 5: Disconnected Veritabanı İşlemleri
Örnekte ds ismindeki DataSet nesnesinin tüm tablo, ilişki ve verileri dsCopy
ismindeki DatasSet nesnesinin içerisine aktarılmıştır
DataSet dsCopy;
dsCopy = ds.Copy();
Örnekte ds ismindeki DataSet nesnesinin tüm tablo ve ilişkileri, dsClone
ismindeki DataSet nesnesinin içerisine aktarılmıştır.
DataSet dsClone;
dsClone = cd.Clone();
Örnekte Stok veritabanını içerisindeki tüm kitaplar, DataAdapter nesnesi ile
DataSet’e aktarılmıştır.
OleDbConnection conn = new OleDbConnection ("provider=“ +
“microsoft.jet.oledb.4.0; data source=../stok.mdb");
OleDBDataAdapter da = new OleDbDataAdapter("select * from “
+ “kitaplar", conn);
DataSet ds = new DataSet(“Set”);
Da.Fill(ds,”Kitaplar”)
DataGrig1.DataSource = ds.Tables[“Kitaplar”];
DataSet sınıfının Tables koleksiyonu ile DataSet içerisine bir veya birden çok
DataTable eklenebilir. DataSet sınıfının Relations koleksiyonu ile DataSet
içerisine bir veya birden çok DataRelation eklenebilir.
Örnekte dtKitaplar isminde yeni bir DataTable oluşturulmaktadır.
DataTable dtKitaplar = new DataTable(“Kitaplar”);
Oluşturulan tabloyu DataSet içerisine eklemek için DataSet nesnesinin Tables
koleksiyonu kullanılır.
Ds.Tables.Add(dtKitaplar);
DataTable nesnesinin içerisine kolon eklenebilir. Örnekte dtKitaplar ismindeki
DataTable nesnesinin içerisine, yeniId isminde yeni bir kolon eklenmektedir.
Yeni kolon eklemek için, DataTable nesnesinin Columns koleksiyonu kullanılır.
DataColumn colKitapId = dtKitaplar.Columns.Add("yeniId");
117
Konu: 5
Örnekte DataTable nesnesi için Ucret, KDV ve Tutar isminde 3 adet kolon
oluşturulmuştur. Örnekteki KDV kolonu, Ucret kolonun %17 değeri üzerinden
hesaplanır. Tutar kolonu ise Ucret ve KDV değerinin toplamı ile hesaplanır.
DataColumn colUcret
DataColumn colKdv =
colKdv.Expression =
DataColumn colTutar
colTutar.Expression
= new DataColumn("Ucret");
new DataColumn("KDV");
"Ucret * 0.17";
= new DataColumn("Tutar");
= "Ucret + KDV";
Konu 3 : DataAdapter ile kayıtları
Dataset’e doldurmak
DataAdapter sınıfı, DataSet ile veri kaynağı arasında köprü oluşturur. Veri
kaynağına yapılan bağlantı ile verilerin DataSet nesnesine aktarılmasını sağlar.
DataAdapter ayrıca DataSet üzerinde yapılan değişikliklerin veri kaynağına
aktarılmasını sağlar.
Örnekte OleDbDataAdapter ile çekilen veriler, ds ismindeki DataSet nesnesine
aktarılır. DataSet içerisindeki veriler, DataGrid ile ekranda gösterilir.
OleDbConnection conn = new OleDbConnection ("provider = "
+ "microsoft.jet.oledb.4.0; data source=C:\Stok.mdb");
OleDbDataAdapter da = new OleDbDataAdapter("select * from
kitaplar", conn);
DataSet ds = new DataSet();
da.Fill(ds,”Kitaplar”);
118
Modül 5: Disconnected Veritabanı İşlemleri
DataGrid1.DataSource= ds.Tables[“Kitaplar”];
DataAdapter ile veri çekmek için DataAdapter nesnesinin başlangıç
fonksiyonuna, SELECT sorgu ve bağlantı nesnesi parametre olarak gönderilir.
OleDbDataAdapter da = new OleDbDataAdapter("select * from
" + "kitaplar", conn);
DataAdapter ile veri çekmenin diğer bir yöntemi SELECT sorgu ile Command
nesnesi oluşturmaktır. Oluşturulan Command, DataAdapter nesnesinin
SelectCommand özelliğine atanır. Örnekte Command ile DataAdapter
nesnesinin beraber kullanımı gösterilmektedir.
OleDbConnection conn As = new OleDbConnection ("provider = "
+ "microsoft.jet.oledb.4.0; data source=C:\Stok.mdb");
OleDbCommand cmd = new OleDbCommand("select * from
kitaplar");
cmd.CommandType = CommandType.Text;
cmd.Connection = conn;
OleDbDataAdapter da = new OleDbDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds, "kitaplar");
DataGrid1.DataSource = ds.Tables["kitaplar"];
DataAdapter nesnesinin Fill metodu veri kaynağındaki veriyi DataSet veya
DataTable nesnesini doldurmak için kullanılır. Örnekte da isimli DataAdapter ile
çekilen veriler, Kitaplar tablosuna doldurulmaktadır.
da.Fill(ds, "kitaplar");
Bir DataSet içinde birden fazla tablo bulunabilir. Bu durumda DataAdapter
nesnesinin Fill metodunu birden çok kez çağrılır.
Fill metodu ile belirli kayıt aralığı DataSet içerisine aktarılabilir. Örnekte da isimli
DataAdapter ile çekilen ilk altı kayıt, Kitaplar tablosuna aktarılır.
da.Fill(ds, 0, 5, "kitaplar");
DataSet üzerinde yapılan değişiklikleri veri kaynağına aktarmak için,
DataAdapter sınıfının Update metodu kullanılır. DataAdapter nesnesinin
DeleteCommand, UpdateCommand ve InsertCommand nesneleri içinde
tutulan sorgular ile güncelleme işlemi gerçekleştirilir. Örnekte Sipariş
tablosundaki tüm değişiklikler veri kaynağına aktarılmaktadır.
da.Update(ds, "siparisler");
119
Konu: 5
Konu4: DataSet nesnesini Kontrollere
bağlamak
DataSet nesnesi ile veritabanının bir kopyası çekirdek belleğe atıldıktan sonra,
bu veriler çeşitli Windows Kontroller ile gösterilebilir veya değiştirilebilir. Bu
kontrollerin en önemlisi DataGrid bileşenidir.
120
Modül 5: Disconnected Veritabanı İşlemleri
DataSet İçerisideki Veriyi Windows
Kontrollerine Bağlamak
DataSet nesnesin içerdiği veri, Windows Form içerisindeki herhangi bir
kontrolun herhangi bir özelliğine bağlanabilir. Örneğin DataSet içerisindeki bir
tablonun ilk satır ve sütunundaki veri, TextBox kontrolunun Text özelliğine
bağlanabilir.
DataSet içerisindeki veriyi Windows kontrollere bağlamanın iki yöntemi vardır.
Bu yöntemler basit (simple data binding) ve karmaşık (complex data binding)
veri bağlama olarak adlandırılır.
Basit veri bağlama; DataSet içerisindeki bir veri elemanını (DataTable
kolonunu) Windows kontrolere bağlama işlemidir. TextBox, Label, RadioButton
gibi kontroller bu gruba girer. Örneğin DataSet tablosundaki herhangi bir
kolonu TextBox, Label gibi Windows kontrollere bağlamak.
Karmaşık veri bağlama; DataSet içersindeki birden fazla veri elamanını
Windows kontrollere bağlama işlemidir. DataGrid, ListBox, ErrorProvider gibi
kontroller bu gruba girer.
Örnekte Dataset içerisindeki kitap_baslik kolonun değeri, TextBox ve Label
kontrollerin Text özelliğine aktarılır.
121
Konu: 5
TextBox1.Text =
ds.Tables["kitaplar"].Rows[2].Item["kitap_baslik"];
Label1.Text =
ds.Tables["kitaplar"].Rows[2].Item["kitap_baslik"];
ComboBox ve ListBox gibi kontrollere veri bağlamak için DataSource ve
DataMember özelliği kullanılır. DataSouce özelliği DataSet içerisindeki tablo
ismini DisplayMember ise Tablo kolonunu belirtir.
Örnekte ComboBox ve ListBox kontrolunun DataSource ve DisplayMember
özellikleri kullanılmaktadır.
ComboBox1.DataSource = ds.Tables["kitaplar"];
ComboBox1.DisplayMember =
ds.Tables["kitaplar"].Columns["kitap_baslik"].ToString();
ListBox1.DataSource = ds.Tables["kitaplar"];
ListBox1.DisplayMember =
ds.Tables["kitaplar"].Columns["kitap_baslik"].ToString();
TreeView kontrolüne veri bağlamak için, TreeNode nesnesinin Text özelliği
kullanılır.
TreeView1.Nodes[0].Text =
ds.Tables["kitaplar"].Rows[1].Item["kitap_baslik"];
Örnekte DataSet nesnesinden gelen veriler ListView ve CheckedListBox
kontrollerine aktarılmıştır.
int count ;
Count = ds.Tables["kitaplar"].Columns.Count();
for (int i=0;i< count;i++)
{
ListView1.Items.Add(ds.Tables["kitaplar"].Rows[i][0].
ToString());
}
for (int i=0;i<count;i++)
{
CheckedListBox1.Items.Add(ds.Tables["kitaplar"].Rows[i][0].
ToString());
}
122
Modül 5: Disconnected Veritabanı İşlemleri
DataSet İçerisindeki Veriyi DataGrid’e
Bağlamak
DataGrid, veriyi satırlar ve sütunlar halinde görüntüler. DataGrid ile ilişkisiz
DataSet Tabloları kolay bir şekilde görüntülenebilir. Bu görüntü excel
tablolarına benzemektedir.
DataGrid ilişkili DataSet tablolarıda gösterebilir. Bu durumda istenilen tabloya
DataGrid üzerindeki gezinti köprülerinden erişilebilir.
DataSet tablolarını DataGrid kontrolune bağlamak için iki yöntem kullanılır. Bu
yöntemler grafiksel ve programlama yöntemleridir.
Grafiksel yöntem ile bağlantı sağlamak için aşağıdaki adımlar takip edin.
•
•
•
Araç kutusu üzerindeki DataGrid kontrolu form üzerine sürükleyin.
DataGrid kontrolünün DataSource özelliğini, önceden oluşturulmuş
DataSet nesnesine bağlayın.
DataGrid kontrolünün DataMember özelliğini , DataSet tablolarının
herhangi biri ile bağlayın.
Programlama yöntemi ile bağlantı sağlamak için DataGrid nesnesinin
DataSource özelliği kullanılır. Örnekte, DataSet içerisindeki Kitaplar tablosu
DataGrid kontrolune bağlanır.
DataGrid1.DataSource = ds.Tables["Kitaplar"];
123
Konu: 5
Konu : 5 DataTable Üzerindeki Veriyi
Düzenlemek
DataTable, veritabanı tablolarını temsil eder. DataColumn, DataRow
nesnelerinden oluşur. DataSet içerisinde yeni bir DataTable oluşturduktan
sonra, veritabanı üzerinde işlem yapıyormuş gibi veri üzerinde düzenlemeler
yapılabilir. DataTable, bu çevrimdışı düzenlemeleri kabul veya iptal etme
olanağı sunar.
DataTable nesnesine, yeni bir satır eklemek için DataRow nesnesi kullanılır.
DataTable nesnesinin NewRow metodu ile oluşturulan yeni satır, DataRow
nesnesinin değişkenine atanır. Örnekte dtKitaplar tablosuna drNew isminde
yeni bir kolon eklenmiştir.
DataRow drNew = dtKitaplar.NewRow();
DataRow nesnesi tanımlandıktan sonra, index veya kolon isimleri üzerinden
kolonlara değer girilir. Örnekte birinci kolona kitabın ISBN numarası, ikinci
kolona ise yazar adi bilgileri girilmiştir.
drNew[0] = “975-8725-14-9”;
drNew[1] = “Tamer Şahiner”;
veya
drNew[“kitap_ISBN”] = “975-8725-14-9”;
124
Modül 5: Disconnected Veritabanı İşlemleri
drNew[“kitap_yazar”] = “Tamer Şahiner”;
Kolanlara bilgi girildikten sonra, tanımlanan DataRow nesnesi DataTable
nesnesinin Rows koleksiyonuna eklenir. Örnekte drNew nesnesi, dtKitaplar
nesnesinin Rows koleksiyonuna eklenir.
dtKitaplar.Rows.Add(drNew);
DataTable nesnesine DataRow kullanmadan kayıt eklenebilir. Örnekte
dtKitaplar ismindeki DataTable nesnesine bu yöntem ile kayıt eklenmiştir.
dtKitaplar.Rows.Add(New Object[] {“975-8725-14-9”, “Tamer
Şahiner”});
DataRow ile DataTable içerisindeki kayıtlar değiştirilebilir. DataRow nesnesi ile
satır düzenleme işlemleri için aşağıdaki metodlar kullanılır.
•
BeginEdit
•
EndEdit
•
CancelEdit
BeginEdit, veriyi düzenlerken oluşabilecek olayları askıya alır. Veriyi
düzenlemek için Items koleksiyonu kullanılır. EndEdit metodu ile, askıya
alınan olaylar yeniden aktif edilir. CancelEdit metodu ile değişikliklerden ve
askıya alınan olaylardan vazgeçilir. Örnekte DataTable içerisindeki dördüncü
kayıt için güncelleme işlemi yapılmıştır.
125
Konu: 5
DataRow drNew = dtKitaplar.Rows[3];
drNew.BeginEdit();
drNew["kitap_baslik"] = "yeni hayat";
drNew["kitap_yazar"] = "can dündar";
drNew.EndEdit();
DataRow ile DataTable içerisindeki belirli bir satır silinebilir. Örnekte DataTable
içerisindeki dördüncü kayıt silinmiştir.
DataRow drSil = dtKitaplar.Rows[3];
dtKitaplar.Rows.Remove(drSil);
DataRow nesnesinin Delete metodu kullanılarak aktif kayıt silinebilir.
DrSil.Delete();
Windows Form ile Kayıt Üzerinde Hareket
Sağlamak
Verileri düzenlemeden önce, hangi veri üzerinde düzenleme yapılacağının
tespit edilmesi gerekir. Windows Form uygulamaları, veri içinde hareket
sağlanan nesneler ile verilerin bağlı olduğu katmanı yönetebilir. DataSet,
DataTable veya DataView ile kayıtlar üzerinde hareket sağlayan nesneye
CurrencyManager denir.
DataSet içinde çoklu veri kaynağı
CurrencyManager nesnesi içerebilir.
tutulabildiği
için,
birden
fazla
126
Modül 5: Disconnected Veritabanı İşlemleri
Belirli bir satıra gidebilmek için, CurrencyManager nesnesinin Position özelliği
kullanılır.
Örnekte dtKitaplar tablosunun kayıtları arasınad ilk, son, önceki ve sonraki
satıra hareket sağlanmıştır.
CurrencyManager cmKitaplar = new CurrencyManager();
private void Form1_Load()
{
txtKitapAdi.DataBindings.Add("Text", dtKitaplar, _
"kitap_baslik");
cmKitaplar = (CurrencyManager)BindingContext[dtKitaplar];
cmKitaplar.Position = 0;
}
private void btnMoveNext()
{
If (cmKitaplar.Position != cmKitaplar.Count)
{
cmKitaplar.Position += 1;
}
}
private void btnMoveFirst()
{
cmKitaplar.Position = 0;
}
private void btnMovePrevious()
{
If (cmKitaplar.Position != 0)
{
cmKitaplar.Position -= 1;
}
}
private void btnMoveLast()
{
cmKitaplar.Position = cmKitaplar.Count-1;
}
127
Konu: 5
Lab 1: Bağlantısız Veritabanı İşlemleri
Bu uygulamada, veritabanındaki Personel tablosu üzerinde kayıt işlemleri
gerçekleştirilir. Personel kayıtlarının okunup DataGrid kontrolune
doldurulması, kayıtlar arasında gezinti, yeni personel kaydının eklenmesi, bir
personelin bilgilerinin güncellenmesi veya silinmesi işlemleri yapılır.
Bu lab tamamlandıktan sonra:
•
Access veritabanına bağlantı oluşturabilecek,
•
DataGrid kontrolüne kayıt doldurabilecek,
•
DataGrid kontrolünü biçimlendirebilecek,
•
Kayıtlar arasında dolaşabilecek,
•
Kayıt ekleme, güncelleme ve silme işlemlerini DataSet içerisinde
gerçekleştirebilecek.
•
DataSet içerisindeki değişiklikleri veritabanına kaydedebileceksiniz.
Veritabanının oluşturulması
Bu uygulamada kullanılacak Personel tablosu için bir veritabanı oluşturulması
gerekir.
3. Microsoft Access ile “kisi” isminde bir veritabanı oluşturun.
4. Veritabanına Personel isminde bir tablo ekleyin ve tabloda belirtilen
kolonları ekleyin.
128
Modül 5: Disconnected Veritabanı İşlemleri
Alan Adı
Veri Türü
Numara
AutoNumber
Ad
Text
Soyad
Text
DogumTarihi
Date/Time
Adres
Text
Sehir
Text
Kontrollerin eklenmesi
Baglantısız_Personel isminde yeni bir Windows projesi açın.
Form üzerine, tablodaki kontrolleri ekleyin belirtilen özelliklerini ayarlayın.
Kontrol – Kontrol İsmi
Özellik
Değer
DataGrid – dgPersonel
ReadOnly
True
TextBox – txtAd
BorderStyle
FixedSingle
TextBox – txtSoyad
BorderStyle
FixedSingle
TextBox – txtDogumTarihi
BorderStyle
FixedSingle
TextBox – txtSehir
BorderStyle
FixedSingle
TextBox – txtAdres
BorderStyle
FixedSingle
Multiline
True
Vertical
Button – btnYeni
ScrollBars
Text
Yeni
Button – btnIptal
Text
İptal
Button – btnKaydet
Text
Kaydet
Button – btnSil
Text
Sil
Button – btnVDoldur
Text
Veritabanindan Getir
Button – btnVKaydet
Text
Veritabanina Kaydet
Button – btnCikis
Text
Çıkıs
Konu: 5
Bağlantı Cümlesinin oluşturulması
Personel tablosu üzerinde işlem yapılması için veritabanı bağlantısının kurulması
gerekir. Bu bağlantı için gereken Connection String cümlesini Server Explorer’ı
kullanarak oluşturun.
Baglantısız_Personel uygulaması için yeni bağlantı oluşturmak.
1. Server Explorer penceresi üzerinde farenin sağ butonunu tıklayın. Açılan
menüden Add Connection komutunu tıklayın.
2. Açılan Data Link Properties penceresinin Provider sekmesini tıklayın.
3. Provider sekmesinden Microsoft.Jet.OLEDB.4.0 Provider ‘i seçerek
Next butonunu tıklayın.
129
130
Modül 5: Disconnected Veritabanı İşlemleri
4. Açılan Connection sekmesinin görüntüsünü resimdeki gibi düzenleyerek OK
butonunu tıklayın.
Bağlantının Oluşturulması
Kisi veritabanına bağlantı sağlamak için OleDbConnection oluşturun.
1. Araç kutusu üzerindeki OleDbConnection kontrolu form üzerine sürükleyin.
2. OleDbConnection kontrolunun ConnectionString özelliği için
oluşturduğunuz bağlantı cümlesini seçin.
DataAdapter nesnesinin Oluşturulması
Personel tablosunu DataSet içerisine aktarmak için OleDbDataAdapter oluşturun.
1. Araç kutusu üzerindeki OleDbDataAdapter kontrolu form üzerine sürükleyin.
2. Karşınıza çıkan “Data Adapter Configuration Wizard” penceresi
üzerinde Next butonunu tıklayarak, bir sonraki adıma geçin.
3. Choose Your Data Connection penceresi üzerinde, oluşturduğunuz
bağlantı cümlesini seçin ve Next butonunu tıklayarak, bir sonraki adıma
geçin.
4. Choose a Query Type penceresinden Use Sql statements seçeneğini
seçin ve Next butonunu tıklayarak, bir sonraki adıma geçin.
5. Generate the Sql statements penceresindeki metin kutusuna SELECT
Numara, Ad, Soyad, DogumTarihi, Adres, Sehir FROM Personel
yazın ve Next butonunu tıklayarak, bir sonraki adıma geçin.
6. Finish butonunu tıklayarak “Data Adapter Configuration Wizard”
sihirbazını sonlandırın.
131
Konu: 5
DataSet nesnesinin Oluşturulması
Personel kayıtları ile çevrimdışı çalışmak için DataSet oluşturun.
1. da üzerinde farenin sağ butonunu tıklayın.
2. Açılan kısayol menüsünden Generate DataSet menüsünü tıklayın.
3. Choose a Dataset menüsünden New seçeneğini seçin ve metin kutusuna
ds yazın.
4. Ok butonunu tıklayın
Dataset içerisindeki verinin DataGrid
kontrolune bağlanması
Personel tablosunu DataGrid kontrolune bağlayın.
1. DgPersonel isimli DataGrid nesnesinin DataSource özelliğine ds1 isimli
DataSet nesnesini seçin
2. DgPersonel isimli DataGrid nesnesinin DataMember özelliğine Personel
tablosunu seçin.
Dataset içerisindeki verinin TextBox
kontrollerine bağlanması
Personel tablo içerisindeki Ad, Soyad, DTarihi, Adres ve Sehir kolonları sırayla txtAd,
txtSoyad, txtDogumTarihi, txtAdres ve txtSehir metin kutularını bağlayın.
1. txtAd metin kutusunun DataBindings koleksiyonun Text özelliğine Ad
kolonunu seçin.
2. txtSoyad, txtDogumTarihi, txtAdres ve txtSehir metin kutularını sırayla Soyad,
DTarihi, Adres ve Sehir kolonlarına bağlayın.
Kodların Yazılması
14. btnDDoldur kontrolunun Click olayına kayıtları DataGrid kontrolüne
dolduran kodları yazın.
try
{
conn.Open();
da.Fill(Ds1, "Personel");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
finally
{
conn.Close();
}
15. btnDKaydet kontrolunun Click olayına. DataSet kontrolundeki tüm
değişiklikleri veritabanına kaydeden kodu yazın
132
Modül 5: Disconnected Veritabanı İşlemleri
try
{
conn.Open();
da.Update(Ds1, "Personel");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
finally
{
conn.Close();
}
16. btnYeni kontrolunun Click olayına. DataSet tablosu için yeni satır
oluşturan kodu yazın.
BindingContext(Ds1, "Personel").EndCurrentEdit();
BindingContext(Ds1, "Personel").AddNew();
17. btnIptal kontrolunun Click olayına. DataSet tablosu içinde eklenen yeni
satırı iptal eden kodu yazın.
BindingContext(Ds1, "Personel").CancelCurrentEdit();
18. btnKaydet kontrolunun Click olayına. DataSet tablosuna yeni kayıt
ekleyen kodu yazın.
BindingContext(Ds1, "Personel").EndCurrentEdit();
19. btnSil kontrolunun Click olayına. DataSet tablosundan aktif kaydı silen
kodu yazın.
BindingContext(Ds1, "Personel").RemoveAt(BindingContext(Ds1,
"Personel").Position);
20. btnIlk kontrolunun Click olayına. ilk kayda giden kodu yazın.
BindingContext(Ds1, "Personel").Position = 0;
21. btnOnceki kontrolunun Click olayına. önceki kayda giden kodu yazın.
BindingContext(Ds1, "Personel").Position -= 1;
22. btnSonraki kontrolunun Click olayına. sonraki kayda giden kodu yazın.
BindingContext(Ds1, "Personel").Position += 1;
23. btnSon kontrolunun Click olayına. son kayda giden kodu yazın.
BindingContext(Ds1, "Personel").Position =
BindingContext(Ds1, "Personel").Count-1;
133
Konu: 5
Konu 6: Veri Arama ve Sıralama
DataSet içerisinde veri arama ve sıralama işlemleri yapmak için, DataTable ve
DataView sınıfının arama ve sıralama metotları kullanılır.
DataTable sınıfının Find metodu, birincil anahtar değerine göre arama
yapılmasını sağlar. Select metodu ise, belirli bir arama kriterine göre arama
yapılmasını sağlar. Select metodu ile geriye satır koleksiyonları döndürülür.
Örnekte DataTable sınıfının Find metodu ile kitap barkod numarasına göre
arama yapılmaktadır. Bu aramanın sonucunda yazar adı geriye döndürülür.
OleDbConnection conn = new OleDbConnection("provider =" +
“microsoft.jet.oledb.4.0;data source=c:\Proje\stok.mdb");
OleDbDataAdapter da = new OleDbDataAdapter("select * from" +
"kitaplar", conn);
DataTable tbl = new DataTable;
da.Fill(tbl);
tbl.PrimaryKey = new DataColumn()
{
tbl.Columns("kitap_ISBN");
}
DataRow row = tbl.Rows.Find("975-12-53-3");
if (row==null)
{
MessageBox.Show("Kayıt Bulunamadı!");
}
else
134
Modül 5: Disconnected Veritabanı İşlemleri
{
MessageBox.Show(row["kitap_yazar"].ToString());
}
Örnekte Tbl ismindeki DataTable nesnesine, DataAdapter nesnesinden gelen
kayıtlar doldurulur. Tbl tablosunun Kitap_ISBN kolonu birincil anahtar olarak
atanır. Row isminde yeni bir DataRow tanımlanır. DataTable nesnesinin Find
metoduna kitabın barkod numarası girilir ve sonuç Row değişkenine aktarılır.
Son olarak Row değişkeni içerisindeki sonuç ekrana yazılır.
Arama işlemlerinde özel karakter kullanılabilir. Örneğin yazar ismi ‘E’ harfi ile
başlayan kayıtları sorgulamak için aşağıdaki komut kullanılır.
Select * from kitaplar Where kitap_yazar Like 'E%'
DataTable sınıfının Select metodu ile DataRow nesnelerinden oluşan bir
koleksiyon geri döndürür. Select metodu aslında orjinal DataSet içindeki
satırları işaret eden işaretçiler kümesi olarak da algılanabilir. Veri kopyalama
yapmaz ancak değişimleri görüntüler.
Örnekte DataTable sınıfının Select metodu kullanılarak, kitap fiyatı sekizden
farklı kayıtlar gösterilmektedir. Bu kayıtlar Kitap isimlerine göre sıralanmıştır.
DataRow selRows = tbl.Select("kitap_fiyat != 8",
"kitap_baslik ASC", DataViewRowState.CurrentRows);
foreach (DataRow row In selRows)
{
MessageBox.Show("kitap: " + row["kitap_baslik",
DataRowVersion.Original].ToString());
}
Select metodunun dört farklı kullanımı vardır. Bu kullanımlar aşağıda
listelenmiştir.
public DataRow() Select()
public DataRow() Select(string filterExpression)
public DataRow() Select(string filterExpression,
string sort)
public DataRow() Select(string filterExpression,
string sort,recordStates as DataViewRowState)
Select metodunun filterExpression, Sort ve recordStates isminde
üç parametresi bulunur.
filterExpression, filtreleme yapılacak ifadeyi içerir.
135
Konu: 5
"Country = ‘Turkey' AND City <> 'Ankara'"
Sort, sonuçların hangi sırada görüntüleneceğini belirtir.
“City DESC”
Veriler artan ve azalan olmak üzere iki şekilde sıralanabilir. Sıralanacak
kolonun sonuna; azalan sıralama için DESC, artan sıralama için ASC anahtar
sözcüğü yazılır.
recordStates ise, kayıtların durumuna göre, (Deleted, Modified gibi) seçim
yapar.
DataView Özellik ve Metodları
ADO.NET ile veri kaynağından alınan bilgileri, sıralamak ve filtrelemek için
DataView nesnesi kullanılır. DataView nesnesi ile DataTable nesneleri
üzerinde arama veya sıralama işlemleri yapılabilir. DataView, diğer kontrollere
bağlanabilen bir nesnedir.
DataView nesnesi oluşturmak için iki yöntem kullanılır. Bu yöntemler grafiksel
ve programlama yöntemleridir.
Grafiksel yöntem ile bağlantı sağlamak için aşağıdaki adımlar takip edin.
•
Araç kutusu üzerindeki DataView kontrolu form üzerine sürükleyin.
136
Modül 5: Disconnected Veritabanı İşlemleri
•
•
•
DataView kontrolunun Table özelliği ile kullanılacak DataTable seçin.
DataView kontrolünün Sort özelliğine, sıralanacak kolon bilgilerini girin.
DataView kontrolünün RowFilter özelliğine arama sorgusunu girin.
Programlama yöntemi ile DataView kullanımı aşağıda gösterilmektedir.
Örnekte fiyatı 8 YTL den büyük kayıtlar gösterilmektedir. Bu kayıtlar yazar
adına göre sıralanarak gösterilir.
DataView dvProducts = new DataView(ds.Tables["kitaplar"]);
dvProducts.Sort = "kitap_yazar";
dvProducts.RowFilter = "kitap_fiyat > 8";
DataGrid1.DataSource = dvProducts;
DataView sınıfının Sort özelliğine, sıralanacak kolonun adı girilir. RowFilter
özelliğine ise arama veya filtreleme sorgusu girilir.
Örnekte Sipariş Numarası 10300 den büyük kayıtlar sorgulanmaktadır
dv.RowFilter = ("SiparisID >10300") ;
Örnekte Sipariş
sorgulanmaktadır.
Tarihi
08/25/1996
tarihinden
büyük
dv.RowFilter = ("SiparisTarihi >#08/25/1996#");
Örnekte müşteri adı “V” ile başlayan kayıtlar sorgulanmaktadır.
olan
kayıtlar
137
Konu: 5
dv.RowFilter = ("MusteriAdi like 'V*'");
Örnekte müşteri adı “V” ile başlayan veya Sipariş Numarası 10300 den büyük
kayıtlar sorgulanmaktadır.
dv.RowFilter = ("MusteriADi like 'V*' Or SiparisID >10300");
Modül Özeti
6.
7.
8.
9.
10.
Bağlantısız veri ortamı hangi .NET nesneleri ile gerçekleştirilir?
DataSet nedir? DataSet hangi nesnelerden oluşur?
DataTable nedir? Hangi durumlarda kullanılır ?
DataColumn nedir? Hangi durumlarda kullanılır ?
DataView Nedir ? Hangi durumlarda kullanılır ?
138
Modül 5: Disconnected Veritabanı İşlemleri
Lab 2: Çoklu Tablolarla Çalışmak
Bu uygulamada aynı form üzerinde üç farklı DataTable ile çalışılacaktır. Bu
uygulama ile Bolum tablosundaki kayıtların açılan kutuya doldurulması, seçilen
bölüme göre öğrencilerin DataGrid doldurulması ve seçilen öğrenciye göre
ders bilgilerinin DataGrid kontrolune doldurulması gerçekleştirilir. Form
üzerindeki filtreleme işlemleri DataView kontrolu ile sağlanır.
Personel kayıtlarının okunup DataGrid kontrolune doldurulması, kayıtlar
arasında gezinti, yeni personel kaydının eklenmesi, bir personelin bilgilerinin
güncellenmesi veya silinmesi işlemleri yapılır
Bu lab tamamlandıktan sonra:
•
Access veritabanına bağlantı oluşturabilecek,
•
DataSet üzerinde birden fazla DataTable ile çalışabilecek,
•
DataView ile filtreleme işlemleri yapabilecek,
•
DataGrid kontrolüne kayıt doldurabileceksiniz.
Veritabanının projeye eklenmesi
Bu uygulamada kullanılacak Course veritabanı oluşturun.
1. Microsoft Access ile “Dershane” isminde bir veritabanı oluşturun.
2. Veritabanın tablolarını aşağıdaki diyagrama göre oluşturun.
139
Konu: 5
Kontrollerin eklenmesi
Dershane isminde yeni bir Windows projesi açın.
Form üzerine, tablodaki kontrolleri ekleyin belirtilen özelliklerini ayarlayın.
Kontrol – Kontrol İsmi
Özellik
Değer
DataGrid – dgOgrenci
ReadOnly
True
DataGrid – dgKurs
ReadOnly
True
ComboBox – cbBolum
DropDownStyle
DropDownList
Button – btnListele
Text
Listele
Label – Label1
Text
Bolüm
Bağlantı Cümlesinin oluşturulması
Dershane veritabanı üzerinde işlem yapılması için bağlantı kurulması gerekir. Bu
bağlantı için gerekli Connection String ifadesini Server Explorer’ı kullanarak oluşturun.
140
Modül 5: Disconnected Veritabanı İşlemleri
Dershane uygulaması için yeni bağlantı oluşturmak.
1. Server Explorer penceresi üzerinde farenin sağ butonunu tıklayın. Açılan
menüden Add Connection komutunu tıklayın.
2. Açılan Data Link Properties penceresinin Provider sekmesini tıklayın.
3. Provider sekmesinden Microsoft.Jet.OLEDB.4.0 Provider ‘i seçerek
Next butonunu tıklayın.
4. Açılan Connection sekmesinin görüntüsünü resimdeki gibi düzenleyerek OK
butonunu tıklayın.
Bağlantının Oluşturulması
Dershane veritabanına bağlantı sağlamak için OleDbConnection oluşturun.
3. Araç kutusu üzerindeki OleDbConnection kontrolu form üzerine sürükleyin.
4. OleDbConnection kontrolunun ConnectionString özelliği için
oluşturduğunuz bağlantı cümlesini seçin.
DataAdapter nesnesinin Oluşturulması
Bolum tablosunu DataSet içerisine aktarmak için OleDbDataAdapter oluşturun.
1. Araç kutusu üzerindeki OleDbDataAdapter kontrolu form üzerine sürükleyin.
2. Karşınıza çıkan “Data Adapter Configuration Wizard” penceresi
üzerinde Next butonunu tıklayarak, bir sonraki adıma geçin.
3. Choose Your Data Connection penceresi üzerinde, oluşturduğunuz
bağlantı cümlesini seçin ve Next butonunu tıklayarak, bir sonraki adıma
geçin.
4. Choose a Query Type penceresinden Use Sql statements seçeneğini
seçin ve Next butonunu tıklayarak, bir sonraki adıma geçin.
5. Generate the Sql statements penceresindeki metin kutusuna SELECT
Bolum, BolumID FROM Bolum yazın ve Next butonunu tıklayarak, bir
sonraki adıma geçin.
141
Konu: 5
6. Finish butonunu tıklayarak “Data Adapter Configuration Wizard”
sihirbazını sonlandırın.
7. Eklediğiniz OleDbDataAdapter kontrolunun ismini daBolum olarak değiştirin.
Ogrenci tablosunu DataSet içerisine aktarmak için OleDbDataAdapter oluşturun.
1. Araç kutusu üzerindeki OleDbDataAdapter kontrolu form üzerine sürükleyin.
2. Karşınıza çıkan “Data Adapter Configuration Wizard” penceresi
üzerinde Next butonunu tıklayarak, bir sonraki adıma geçin.
3. Choose Your Data Connection penceresi üzerinde, oluşturduğunuz
bağlantı cümlesini seçin ve Next butonunu tıklayarak, bir sonraki adıma
geçin.
4. Choose a Query Type penceresinden Use Sql statements seçeneğini
seçin ve Next butonunu tıklayarak, bir sonraki adıma geçin.
5. Generate the Sql statements penceresindeki metin kutusuna
6.
SELECT OgrenciID, Ad, Soyad, Adres, BolumID, Sehir FROM
Ogrenci yazın ve Next butonunu tıklayarak, bir sonraki adıma geçin.
Finish butonunu tıklayarak “Data Adapter Configuration Wizard”
sihirbazını sonlandırın.
7. Eklediğiniz OleDbDataAdapter kontrolunun ismini daOgrenci olarak
değiştirin.
Kurs ve OgrenciDersKayit tablolarını DataSet içerisine aktarmak için
OleDbDataAdapter oluşturun.
1. Araç kutusu üzerindeki OleDbDataAdapter kontrolu form üzerine sürükleyin.
2. Karşınıza çıkan “Data Adapter Configuration Wizard” penceresi
üzerinde Next butonunu tıklayarak, bir sonraki adıma geçin.
3. Choose Your Data Connection penceresi üzerinde, oluşturduğunuz
bağlantı cümlesini seçin ve Next butonunu tıklayarak, bir sonraki adıma
geçin.
4. Choose a Query Type penceresinden Use Sql statements seçeneğini
seçin ve Next butonunu tıklayarak, bir sonraki adıma geçin.
5. Generate the Sql statements penceresindeki metin kutusuna
SELECT OgrenciDersKayit.OgrenciID, Kurs.KursAdi,
OgrenciDersKayit.KursBasTarihi, Kurs.Kredi, Kurs.KursNo
FROM (Kurs INNER JOIN OgrenciDersKayit ON Kurs.KursNo =
OgrenciDersKayit.KursNo)yazın ve Next butonunu tıklayarak, bir
sonraki adıma geçin.
6. Finish butonunu tıklayarak “Data Adapter Configuration Wizard”
sihirbazını sonlandırın.
7. Eklediğiniz OleDbDataAdapter kontrolunun ismini daKurs olarak değiştirin.
DataSet nesnesinin Oluşturulması
Bolum, Öğrenci ve Kurs tabloları ile çevrimdışı çalışmak için DataSet oluşturun.
1. daBolum üzerinde farenin sağ butonunu tıklayın.
2. Açılan kısayol menüsünden Generate DataSet menüsünü tıklayın.
3. Choose a Dataset menüsünden New seçeneğini seçin ve metin kutusuna
ds yazın.
4. Ok butonunu tıklayın
5. daOgrenci üzerinde farenin sağ butonunu tıklayın.
6. Açılan kısayol menüsünden Generate DataSet menüsünü tıklayın
7. Choose a Dataset menüsünden Existing seçeneğini seçin ve açılan
kutudan Dershane.ds seçeneğini seçin.
142
Modül 5: Disconnected Veritabanı İşlemleri
8.
9.
10.
11.
Ok butonunu tıklayın.
daKurs üzerinde farenin sağ butonunu tıklayın.
Açılan kısayol menüsünden Generate DataSet menüsünü tıklayın
Choose a Dataset menüsünden Existing seçeneğini seçin ve açılan
kutudan Dershane.ds seçeneğini seçin.
12. Ok butonunu tıklayın.
DataView nesnesinin Oluşturulması
DataTable nesneleri üzerinde filtreleme işlemleri yapmak için DataView
oluşturun.
Ogrenci tablosunu filtrelemek için aşağıdaki adımlar takip edin.
1. Araç kutusu üzerindeki DataView kontrolu form üzerine sürükleyin.
2. Eklediğiniz DataView kontrolunun ismini dvOgrenci olarak değiştirin.
3. DataView kontrolunun Table özelliği için Ogrenci tablosunu seçin.
Kurs tablosunu filtrelemek için aşağıdaki adımlar takip edin.
1. Araç kutusu üzerindeki DataView kontrolu form üzerine sürükleyin.
2. Eklediğiniz DataView kontrolunun ismini dvKurs olarak değiştirin.
3. DataView kontrolunun Table özelliği için Kurs tablosunu seçin
Dataset içerisindeki verinin ComboBox
kontrolüne bağlanması
Bolum tablosunu cbBolum isimli açılan kutuya bağlayın.
4. CbBolum isimli açılan kutunun DataSource özelliğine Bolum tablosunu seçin.
5. CbBolum isimli açılan kutunun DisplayMember özelliğine Bolum kolonunu
seçin.
6. CbBolum isimli açılan kutunun ValueMember özelliğine BolumID kolonunu
seçin.
Kodların Yazılması
1. Form kontrolunun Load olayına kayıtları DataSet tablolarına dolduran
kodları yazın.
try
{
Conn.Open();
daBolum.Fill(Ds1, "Bolum");
daOgrenci.Fill(Ds1, "Ogrenci");
daKurs.Fill(Ds1, "Kurs");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
finally
{
Conn.Close();
}
143
Konu: 5
2. btnListele kontrolunun Click olayına dvOgrenci kontrolunu DataGrid
kontrolune bağlayan kodu yazın.
dvOgrenci.RowFilter = "BolumID='" +
cbBolum.SelectedValue + "'";
dgOgrenci.DataSource = dvOgrenci;
3. dgOgrenci kontrolunun CurrentCellChanged olayına dvKurs kontrolunu
DataGrid kontrolune bağlayan kodu yazın.
dvKurs.RowFilter = "OgrenciID='" +
dgOgrenci.Item(dgOgrenci.CurrentRowIndex, 0) + "' ";
dgKurs.DataSource = dvKurs;
Modul 6:
Modül 6: ASP.NET GİRİŞ
ASP.NET, .Web sunucusu üzerinde çalışan ve .NET altyapısını kullanan
geliştirme platformudur. ASP.NET Web Form nesneleri, dinamik Web
uygulamaları geliştirmeyi kolaylaştırır.
Bu modülü tamamladıktan sonra:
145
Konu: 1
•
ASP.NET çalışma modelini öğrenecek,
•
ASP.NET teknolojisinin .NET Framework çatısındaki yerini öğrenecek,
•
IIS Web sunucusunun yapısını öğrenecek ve yönetebileceksiniz.
Konu 1: ASP.NET Nedir?
ASP.NET teknolojisinden önce, web üzerinde dinamik sayfalarla çalışabilmek
için ASP teknolojisi kullanılırdı. ASP teknolojisi, .NET çatısı ile yeni özelliklere
eklendi.
ASP.NET ile web uygulaması geliştirmek, Windows Form tabanlı uygulama
geliştirmeye oldukça benzemektedir. Web Server tarafında çalışan, HTML
kodlarını ve ASP kontrollerini içeren, temel ASP .NET bileşenine Web Form
denir. Bir web uygulamasında birden fazla Web Form bulunabilir.
ASP.NET sayfaları ile yazılan kodlar sunucu tarafında çalışır, istemci tarafında
çeşitli işlemleri gerçekleştirebilmek içinse Script adı verilen kodlar kullanılır.
Web uygulamasının güvenliği ise yine sunucu tarafında çalışan .NET
bileşenleri ile sağlanır.
ASP.NET Web Formları sunucu taraflı kodları çalıştırdığı için, kullanıcı
tarafındaki tarayıcıya ve işletim sistemine bağlı değildir. Dolayısıyla ASP.NET
ile yazılan uygulamalar, internet erişimi olan herhangi bir aygıtta çalışabilir.
146
Modül 6: ASP.NET Giriş
Konu 2: Asp Tarihçesi
HTML(Hyper Text Markup Language) web sayfası hazırlamak için kullanılan
temel web programlama dilidir.
HTML, kullanıcı ile sunucu arasında dinamik veri alışverişi sağlamaz. HTML’in
bu açığını kapatmak için ilk olarak CGI arabirimi (Common Gateway Interface)
geliştirilmiştir. CGI arabirimi C dilinde hazırlanan kodlar ile çalıştırılır. CGI
arabiriminin dezavantajı, en ufak bir değişiklikte tüm kaynak kodun yeniden
derlenmesidir. Bu durum zaman ve kaynak kullanımını olumsuz yönde artırır.
CGI arabirimininden sonra, sununu ile haberleşen ilk dil olan PERL(Practical
Extraction and Reporting Language) geliştirilmiştir. Bu dil C ve C++ ile yazılan
scriptler içerir. PERL, CGI’ın yeniden derlenme dezavantajını ortadan
kaldırmıştır. PERL halen aktif olarak kullanılmaktadır.
Microsoft NT teknolojisini ile birlikte Internet Information Server (IIS)
sunucusunu geliştirmiştir. IIS, Windows NT 3.51 ile gelen web sunucusudur. IIS
sunucusunun “Windows NT 3.51” ile gelen ilk sürümü CGI arabirimini
desteklemektedir. Microsoft IIS sunucusunu geliştirdikten sonra, “Internet
Server Application Programming Interface” (ISAPI) arabirimini geliştirmiştir.
Microsoft ilk defa ISAPI ile birlikte ASP teknolojisini duyurmuştur. ASP
teknolojisi, IIS ve ISAPI alt yapısını birleştirir. ASP, statik HTML sayfaları
içerisinde, dinamik veri alışverişi için Microsoft tarafından geliştirilmiştir
147
Konu: 1
Konu 3: ASP.NET Uygulama Mimarisi
ASP.NET, multi-tier (çok katmanlı) veri erişim modelini kullanır. Bu veri erişim
modeli İstemci,İş ve Veri katmanlarından oluşur.
İstemci Katmanı (Presentation Tier):
Bu katman, kullanıcı ile diğer katmanların iletişimini sağlar. Bu katmanda,
kullanıcı arayüzünü oluşturan bileşenler bulunur. Html ve Sunucu kontroller,
Web Formlar ve kullanıcı tanımlı kontroller (User Controls) bu katman
içerisinde yer alır.
İş katmanı (Business Logic Tier) :
Bu katman uygulama ile veritabanı arasında iletişimi sağlar. Bu katmanda iş
servisleri ve kurallarını içeren bileşenler bulunur. XML Web servisleri, COM ve
COM+ nesneleri bu katman içerisinde yer alır
Veri Katmanı (Data Tier) :
Veri katmanıdır. Bu katmanda veriyi saklamak için gerekli araçlar bulunur.
İlişkisel veritabanları, e-mail alanları, mesaj kuyrukları ve dizin servisleri bu
katman içerisinde yer alır. Web uygulamalarda, ASP.NET ile veri kaynağına
erişim için ADO.NET kullanılır.
148
Modül 6: ASP.NET Giriş
Konu 4: Asp.Net Çalışma Modeli
ASP.NET, ASP ve diğer web platformlarına göre daha yüksek performans ile
çalışır. ASP.NET bu performans artışını Visual Studio .NET ile gelen, .NET
Framework ve CLR (Common Language Runtime) ile sağlar.
ASP.NET platformunu en verimli şekilde kullanmayı sağlayan CLR bileşenleri
aşağıdaki gibidir.
•
Type Management
•
Memory Management
•
JIT Compilation
•
Exception Manager
149
Konu: 1
Tür Yönetimi (Type Management)
Güvenli olmayan bilgilere ve başlatılmamış değişkenlere izin vermez Bu
yönetim, ASP.NET’i ASP’den tamamen ayıran bir özelliktir.
150
Modül 6: ASP.NET Giriş
JIT Derleme (JIT Compilation)
ASP.NET Web sayfaları, kullanılan dilin editöründe derlenerek, MSIL (Microsoft
Intermediate Language) diline çevrilir. MSIL kodu çalışma zamanında, JIT ile
“native code” adı verilen dile çevrilir.
151
Konu: 1
Hafıza Yönetimi (Memory Management)
CLR ile hafıza yönetimi otomatik olarak işlenir. New anahtar sözcüğü ile
oluşturulan nesneler için, CLR hafızada yer ayırır. Nesneler referanslarını
kaybettikten sonra “Garbage Collection” mekanizması ile bellekten silinir.
152
Modül 6: ASP.NET Giriş
Exception Yöneticisi (Exception Manager)
CLR, ASP.NET uygulamaları için yapısal hata yakalama altyapısı sunar.
ASP.NET uygulamalarında Try...Catch...Finally blokları kullanılarak
,hata yakalama altyapısı kolayca devreye sokulur.
ASP.NET uygulamaların konfigürasyon ayarları, XML dosyalar içerisinde
saklanır. Bu dosyalar kolayca okunur ve yazılabilir. Her web uygulamanın
kendisine ait bir konfigürasyon dosyası vardır. ASP.NET uygulamaların
konfigürasyon dosyaları web.config dir.
Sunucuya ait konfigürasyon ayarları ise machine.config içerisinde saklanır. Her
web sunucusunda tek machine.config dosyası bulunur.
Visual Studio .NET, web uygulamalarının performansını arttırmak ve
güvenliğini sağlamak için pek çok servis sunar.
153
Konu: 1
Bir ASP.NET uygulamasını oluşturan bileşenler aşağıdaki gibidir.
•
Web Formlar: Web uygulama için kullanıcı arayüzü sağlar.
•
Code-behind sayfalar: Web Formların sunucu tarafında çalışan kodlarını
içerir.
•
Konfigürasyon dosyaları: Web uygulama ve sunucu ayarlarının tutulduğu
XML dosyalarıdır.
•
Global.asax dosyaları: Web uygulamanın genel olaylarını içerir. Örneğin
Web uygulamanın başlatılması veya durdurulması. Global.asax dosyası
ASP deki global.asa dosyasının gelişmiş versiyonudur.
154
Modül 6: ASP.NET Giriş
•
XML Web Servis bağlantıları: Web uygulamanın, XML web servisi
üzerinden veri alışverişini sağlar.
•
Veritabanı bağlantıları, Web uygulama ile veri kaynağı arasında veri
alışverişini sağlar.
•
Caching (Ön Belleğe Alma): Uygulamanın ilk çalıştığı anda ön belleğe
atılmasını sağlar. Bu durum uygulamanın bellekten çalışmasını
sağlayarak, performansı artırır.
155
Konu: 1
Konu 5: ASP.NET’in .NET Çatısındaki Yeri
Microsoft .NET platformu, geniş çaplı web uygulamaları geliştirebilmek için,
gerekli her türlü araç ve teknolojiye sahiptir. Dilden bağımsız çalışabilme, eski
teknolojiden yeni teknolojilere kolayca geçiş imkanı sağlar. Tamamen nesne
yönelimli programlamayı destekleyen bir platform olan Visual Studio .NET, web
uygulamalarında da nesne yönelimli programlama modelini destekler.
Şekil 5.1’de belirtildiği gibi en üst katman, kullanıcı ve program arayüzlerini
gösterir. Bu arayüzler Windows Form, Web Form, Web Service ve uygulama
servislerinden oluşabilir. Orta katmanda .NET Framework sınıfları, alt
katmanda ise CLR bulunur.
156
Modül 6: ASP.NET Giriş
Konu 6: .Net Framework’un Asp.Net’teki
Avantajları
.Net Framework, ASP.NET ile uygulama geliştirmek için birçok avantaj sağlar.
Bu avantajlar aşağıda listelenmiştir.
•
Visual Studio .NET ortamının en büyük avantajı, birden fazla dili
destekliyor olmasıdır. ASP.NET ile geliştirilen uygulamalarda, farklı
.NET dilleri bir arada kullanılabilir. Örneğin VB.NET ile geliştirilen bir
uygulama içerisine C# ile yazılan kod blokları eklenebilir.
•
Visual Studio .NET, web uygulamaların güvenliğini sağlayan çeşitli
sınıflar içerir Bu sınıflar System.Web.Security isim alanı içerisinde
bulunur.
•
ASP .NET sayfaları içerisinde, HTML ve Kaynak kod birlikte çalıştırılır.
Bu durum tasarım ve programlama kolaylığı sağlar.
•
ASP.NET içerisinde kodlar satır satır derlenmez. Bunun yerine Web
formlar derlenir. Bu durum performansın artışını sağlar
•
Güçlü hata yakalama araçları sunar.
•
Web servisleri ile birlikte çalışabilir.
•
ASP.NET, ADO.NET kullanımını kolaylaştıran web nesneleri içerir.
157
Konu: 1
Konu 7: ASP.NET ile Uygulama
Geliştirmek
ASP.NET ile geliştirilen uygulamaların; Internet, Extranet veya Intranet
üzerinde çalışabilmesi için Web Sunucularına ihtiyaç duyulur. IIS (Internet
Information Services) Windows işletim sistemleri için geliştirilmiş web
sunucusudur.
158
Modül 6: ASP.NET Giriş
IIS Nedir?
IIS(Internet Information Services), Windows sistemler için web tabanlı
uygulama geliştirme ve yayınlama amacıyla kullanılan web sunucusudur.
159
Konu: 1
IIS Kurulumu ve Yönetimi
IIS Kurulumu
Web uygulamaları geliştirmek için IIS 5.0 veya daha üst versiyonu kurulmalıdır.
IIS, Windows 2000 Server işletim sistemi ile varsayılan bileşen olarak gelir.
160
Modül 6: ASP.NET Giriş
Windows 2000 Professional, Windows XP Professional ve sonraki sistemlerde
ise, bu aracın kullanıcı tarafından kurulması gerekir.
IIS kurulumu için aşağıdaki adımlar takip edilir.
1- Denetim Masası (Control Panel) penceresinde “Program Ekle/Kaldır” (Add
or Remove Programs) simgesini seçin.
2- Açılan pencerenin sol panelinden “Windows Bileşeni Ekle/Kaldır”
(Add/Remove Windows Components) bileşenini seçin.
3- “Windows Bileşeni Ekle/Kaldır” penceresinden “Internet Information
Services” (IIS) seçerek yükleme işlemini başlatın.
DİKKAT:
Windows NT 4.0 ve Windows XP Home Edition işletim sistemleri ile ASP.NET
uygulaması geliştirilemez.
.NET Framework kurulmadan önce IIS sunucusunun kurulmuş olmasına dikkat
edilmelidir. Aksi halde ASP.NET dosyaları, ilgili kütüphane dosyaları ile düzgün bir
şekilde kullanılamaz. Eğer IIS kurulmadan .NET Framework kurulmaya çalışılıra,
uyarı mesajı ile karşılaşılır. Bu uyarı mesajı önemsenmeden kuruluma devam
edilebilir. Framework kurulumu tamamlandıktan sonra IIS kurulmalıdır. Ancak IIS
yüklendikten sonra, sistemin ASP.NET sayfaları ile uyum içinde çalışabilmesi için
Visual Studio .NET komut satırında “aspnet_regiis.exe -I “ komutu çalıştırılmalıdır.
Şekil 6.2: IIS Kurulumu
161
Konu: 1
IIS Yönetimi
IIS yönetimi, Internet
gerçekleştirilir.
Information
Services
(IIS)
Manager ile
IIS Manager açmak için aşağıdaki adımlar takip edilir.
•
“Bilgisayarım”(My Computer) ikonuna sağ tıklanır. Açılan kısayol
menüsünden Yönet (Manage) komutu seçilir. Açılan Computer Manager
penceresinin Services and Applications menüsünden Internet
Information Services (IIS) seçilir.
•
Denetim Masası (Control Panel) içerisinden Administrative Tools
simgesi seçilir. Açılan pencereden Internet Information Services
Manager seçilir.
IIS içerisinde aşağıdaki altkklasörler bulunur.
•
Application Pools
•
Web Sites
•
Web Service Extensions
162
Modül 6: ASP.NET Giriş
Web Sites çalışan web uygulamalarını lisleler. Web Sites klasörü altındaki
Default Web Site sekmesi üzerinden web sunucu seçenekleri ayarlanabilir.
Web sunucu özelliklerini değiştirmek için aşağıdaki adımlar takip edilir.
1. Internet Information Services üzerinden Web Sites seçilir.
2. Web Sites üzerinde farenin sağ tuşu tıklanır. Açılan menüden
Properties menüsü seçilir.
Home Directory kategorisinde Local Path alanında “c:\inetpub\wwwroot“
ifadesi, sistemde IIS sunucusunun çalıştıracağı uygulamaların yer bilgisini
tutar.
163
Konu: 1
Resim 6.3: IIS Yönetimi
ASP.NET web uygulamaları wwwroot klasörü altında tutulur. Bu klasör altında
tutulan klasörlerin diğerlerinden farkı Virtual Directory (sanal klasör)
olmalarıdır. .NET ile açılan her yeni web uygulaması için, wwwroot altında yeni
bir Virtual Directory oluşturulur.
Visual Studio .NET kullanmadan yeni bir Virtual Directory oluşturmak için
Default Web Site üzerinde sağ tıklanır. Çıkan menüden New alt menüsüne
işaret edilir ve Virtual Directory seçilir. Virtual Directory Creation
Wizard ile yeni bir Virtual Directory oluşturulur.
164
Modül 6: ASP.NET Giriş
.Net Framework Kurulumu
ASP.NET ile uygulama geliştirmek için .NET Framework’ün kurulu olması
gerekir. Framework’ün,. SDK olarak isimlendirilen 130MB’lık full versiyonu ve
yalnızca temel bileşenleri kapsayan 20MB’lık iki farklı kurulum dosyası
bulunmaktadır.
Framework
versiyon
ve
yamaları
(Service
Pack)
http://
msdn.microsoft.com/netframework/downloads/updates/default.aspx”
adresinden ücretsiz olarak indirilebilir.
Framework’ü kurmak için aşağıdaki adımlar takip edilir.
1. Framework kurulum dosyası çalıştırılır.
2. Açılan penceredeki “Would you like to Install Mictosoft .NET
Framework Package?” sorusuna Yes cevabı verilir.
3. Next butonları tıklanarak kurulum tamamlanır.
İPUCU:
.Net Framework kurabilmek için işletim sisteminin Windows NT tabanlı olması
gerekir. Windows 2000 işletim sisteminde minimum SP2 yapılandırması gereklidir.
165
Konu: 1
Modül Özeti
11.
12.
13.
14.
ASP nedir?
ASP çalışma modelini açıklayın.
ASP .Net uygulamasını oluşturan bileşenler nelerdir?
IIS nedir?
166
Modül 6: ASP.NET Giriş
Lab 1: Web Tabanlı Uygulamaların
Yayınlanması
Bu uygulamada IIS(Internet Information Services) kurulumu öğreneceksiniz.
Aynu zamanda IIS ile web tabanlı uygulamaların yayınlanmasını
öğreneceksiniz.
IIS(Internet Information Services) Kurulması
1. Denetim Masası (Control Panel) penceresinde “Program Ekle/Kaldır” (Add or
Remove Programs) simgesini seçin.
2. Açılan pencerenin sol panelinden “Windows Bileşeni Ekle/Kaldır”
(Add/Remove Windows Components) bileşenini seçin.
3. “Windows Bileşeni Ekle/Kaldır” penceresinden “Internet Information
Services” (IIS) seçin.
4. Next butonunu tıklayarak kurulumu başlatın.
Uygulama Yayınlamak
Default.htm ismindeki HTML sayfayı IIS üzerinden yayınlayın.
3. “C:\Inetpub\wwwroot” klasorüne gidin.
4. wwwroot penceresi içerisinden Dosya menüsünü tıklayın.
5. Dosya menüsü içerisinden Yeni alt menüsünü tıklayın.
167
Konu: 1
6. Yeni alt menüsü içerisinden Metin Belgesi komutunu vererek Yeni
Metin Belgesi oluşturun.
7. Oluşturduğunuz metin belgesi içerisine aşağıdaki HTML(Hyper Text
Markup Language) kodları ekleyin ve dosyayı kaydedin.
<html>
<head>
<title>HTMLPage1</title>
</head>
<body>
<p>Hoş Geldiniz.</p>
</body>
</html>
8. Metin belgesinin ismini Default.htm olarak değiştirin.
9. Intrernet Explorer açın ve aşağıdaki adreslerden herhangi birini adres
çubuğuna yazın.
a. http://localhost
b. http://127.0.0.1
c. http://MakinaAdı
d. http://IpNumarası
Localhost: Lokal makina adı.
127.0.0.1 : Lokal IP numarası.
Makina Adı: Ağ içerisindeki bilgisayar adı.
Ip Numarası: Ağ içerisindeki Ip Numarası.
İpucu :
Web uygulamanın yayını, wwwroot içerisindeki herhangi bir alt klasörden
yapılabilir. Örneğin http://localhost/WebUygulama.
uygulamaların yayını bu yöntem ile yapılır.
“ASP.NET
Web
Application”
Modul 8:
169
Konu: 1
Modül 7: ASP.NET Web Form ve Kontrolleri ile
Çalışmak
ASP.NET ile uygulama geliştirirken kullanılan temel bileşenler Web Formlar ve
Web kontrolleridir. Web Form, IIS tarafından çalıştırılan HTML kod ve
170
Modül 7:
kontrollerin birleşiminden oluşur. Bu formlara eklenen kontroller, sunucu veya
istemci taraflı çalışabilirler.
Bu modül tamamlandıktan sonra:
•
Web Form yapısını ve bileşenlerini öğrenecek,
•
Sunucu ve istemci taraflı kontrollerin farklarını öğrenecek,
•
Web kontrollerini tanıyacak,
•
ViewState ve PostBack kavramlarını öğreneceksiniz.
Konu 1: Web Form Bileşenleri
Web Form, ASP.NET uygulamalarının yapı taşıdır. Visual Studio .NET ortamı
aracılığı ile eklenen kontrollerin ve Visual Basic .NET kodlarının birleşimi Web
Formu oluşturur.
Web formlar, .aspx uzantılı arayüz dosyası ve. aspx.cs uzantılı kod
dosyalarından oluşur. Örneğin default.aspx isimli ASP.NET sayfasının, sunucu
taraflı Visual Basic .NET kodları default.aspx.cs isimli dosyada tutulur.
Kullanıcı arayüz sayfası ve kod sayfasının ayrı tutulmasının yararı, web
programcısına ve web tasarımcısına ayrı kaynaklar sunarak bağımsız çalışma
ortamı sağlamaktır.
171
Konu: 1
Web Formları Visual Studio ile iki farklı şekilde tasarlanabilir. Design sekmesi,
web kontrollerinin görsel olarak düzenlenmesini sağlar. HTML sekmesi ise,
kontrollerin HTML kodlar ile eklenmesini sağlar.
Görsel kısımda Web Form kontrolleri ve bu kontrollere ait HTML kodları, kod
sayfasında da bu kontrollerin davranışlarını belirleyen Visual Basic .NET
kodları bulunur.
Web Formların genel özellikleri aşağıdaki gibidir.
•
@Page Özelliği
•
Body Özelliği
•
Form Özelliği
172
Modül 7:
Page Özelliği
Tüm sayfa içinde tanımlanacak fonksiyonların değerlerini içerir. <@Page>
etiketi ile gösterilir ve her .aspx uzantılı dosyada bulunması gerekir.
<@Page> etiketinde, sayfanın yapısı ile ilgili özellikler bulunur.
Language
Sayfa içinde kullanılacak dil seçeneğini bildirilir. ASP.NET uygulamalarında
genellikle VB ve C# dilleri tercih edilir.
<”@Page Language=”c#”
<”@Page Language=”vb”
…”>
…”>
CodeBehind
Web formların, Visual Basic .NET veya C# uzantılı kod dosyasını belirtir.
<@Page CodeBehind=”WebForm1.aspx.vb” …>
<@Page CodeBehind=”WebForm1.aspx.cs” …>
SmartNavigation
SmartNavigation özelliğine True değeri ayarlanırsa, sayfa yeniden yüklendiği
zaman, kaydırma çubuklarının sayfa içerisindeki yeri korunur. Böylece sayfa ilk
konumunda kalır. Bu özellik Internet Explorer 5.5 ve üstü tarayıcılar tarafından
desteklenir.
173
Konu: 1
<@Page Language=”c#” CodeBehind=”WebForm1.aspx.cs” _
SmartNavigation=”True” >
ViewState
ASP.NET teknolojisi ile gelen yeniliklerden biridir. EnableViewState özelliği ile
objenin içerisine girilen bilgi ne olursa olsun, sunucu bunu bir değişkende tutup
tekrar kullanıcıya geri döndürür. Bu durum sunucuya gönderilen veriler
üzerinde hata oluşması durumunda, billgilerin kaybolmamasını sağlar. Bu
özelliğin tüm kontrolleri içermesi için, Page yönerge satırında tanımlanması
gerekir. Bu özellik True veya False değeri alabilir.
<@Page EnableViewState=”True” …>
Ayrıca kontrol düzeyinde EnableViewState özelliği kullanılabilir. Bu durumda,
Page yönerge satırında belirtilen değer geçersiz olur.
<asp:Button … EnableViewState=”false“ …>
Body Özelliği
Web sayfasının ana bölümüdür.
<body> etiketi ile web formun gövdesi oluşturulur. Kullanılan her kontrol
<body> ... </body> etiketleri arasında bulunmalıdır.
body etiketi içerisinde PageLayout(ms_positioning) özelliği tanımlanabilir.
174
Modül 7:
PageLayout(ms_positioning)
Web form içinde kullanılan nesnelerin, görüntülenme biçimini ayarlar. Bu özellik
iki değer alabilir:
•
FlowLayout: Sayfaya eklenen kontroller eklenme sırasına göre
sıralanır. Kontrollerin yerleri sürükleme ile değiştirilemez.
Nesneler için style tanımlamaz.
<body ms_positioning=”FlowLayout”>
…
</body>
•
GridLayout: Kontroller form üzerindeki herhangi bir yere
eklenebilir. Kontrollerin yerleri sürükleme ile değiştirilebilir. Bu
görünümde nesneler için style tanımlanır. Bu görünüm
Windows Uygulamalardaki Form görünümüne benzemektedir.
<body ms_positioning=”GridLayout”>
…
</body>
Form Özelliği
Web kontrolleri gruplandırmak için kullanılır. Her web form için tek Form etiketi
tanımlanır. Tüm kontroller <form> … </form> etiketleri arasına eklenir.
Form etiketi içinde tanımlanabilecek birçok özellik vardır.
175
Konu: 1
Method
Web kontrol özelliklerinin, sunucuya gönderilme şeklini belirler. İki değer
alabilir:
•
Post: İsim ve değer bilgilerini, HTML bilgisinin üst bilgisine
yazarak gönderir.
<form method=”Post” …>
•
Get İsim ve değer bilgilerini, sayfa adının sonuna ekleyerek
gönderir.
<form method=”Get” …>
Id
Formun isim bilgisini verir. CodeBehind sayfası içerisinde, forma işlem
yaptırmak için kullanılır.
<form id=”deneme” …>
Runat
Web formlarda kullanılan kontrollerin sunucu ile haberleşerek çalışabilmesi için
runat=”server” bildirimi kullanılır. Bu özellik sadece server değerini alabilir.
<form
runat=”server” …>
176
Modül 7:
Konu 2: Server(Sunucu) Kontroller
Web sunucu üzerinde çalışan kontrollerdir. İki tür server .kontrolu vardır.
Bunlar:
•
HTML Server Kontrolleri
•
Web Server Kontrolleri (ASP.NET Kontrolleri)
ASP.NET server kontrolleri System.Web.UI.Control sınıfından türetilir. Her
ASP.NET server kontrolü <asp:KontrolIsmi> etiketi ile bildirilir. HTML kontrolleri
ise System.Web.UI.HtmlControls isim alanında bulunur.
Button, TextBox, DropDownList gibi server kontrollerinin çalışma modeli,
istemci taraflı HTML kontrollerinin çalışma modelinden oldukça farklıdır.
ASP.NET server kontrolleri, tamamen sunucu üzerinde çalışır ve geri plandaki
tüm işleyişleri ara yüzle gizlenerek gerçekleştirilir.
Bir kontrolün sunucu tarafında çalıştığı runat=”server” özelliği ile belirlenir.
<asp:Button id=”Buton1” runat=”server” Text=”Tıklayınız” />
Örnekte istemci tarafında çalışan HTML Button kontrolü gösterilmektedir.
<INPUT type=”button” value=”Bu Bir Html Button” >
177
Konu: 1
Bu kontrolün sunucu tarafında çalışması için, kontrole runat özelliği
eklenmelidir. Böylece kontrol HTML server kontrolü haline getirilir.
<INPUT type=”button” id=”button1”
value=”Bu Bir Html Button” >
runat=”server” _
Konu 3: Kontrollerin Sınıflandırılması
ASP.NET Web kontrolleri dört grupta listelenir. Bunlar;
1- Standart Kontroller (ListBox, Button, CheckBox, Table vs.)
2- Doğrulama Kontrolleri (RequiredFieldValidator, RangeValidator, CompareValidator, RegularExpressionValidator, CustomValidator, ValidationSummary)
3- Zengin Kontroller (Calendar, Adrotator)
4- İlişkisel Liste Tabanlı Kontroller (DataGrid, DataList, Repeater)
Standart Kontroller
Bu kontroller, HTML kontrollere alternatif olarak tasarlanmıştır. Eski tip HTML
kontrolleri ile yeni ASP.NET kontrolleri arasındaki en belirgin fark, her Web
kontrolünden önce asp: ön ekinin kullanılıyor olmasıdır.
<asp:TextBox runat=”server” id=”giris” Text=”Hoş Geldiniz”>
</asp:TextBox>
Bu kontrollerin avantajları aşağıdaki gibidir.
178
Modül 7:
•
Benzer kontrollere düzenli biçimde isimler verilir.
•
Tüm kontroller aynı genel özelliklere sahiptir.
•
Tarayıcı için özel kodlar kendiliğinden üretilir.
Bu grupta bulunan kontrollerin tümü id, text, backcolor, runat özelliklerine
sahiptir. Ancak CheckBox kontrolünün Checked ve ListBox kontrolünün
SelectedItem özellikleri vardır.
Tablo 8.1’de Html ve Standart sunucu kontroller gösterilmektedir.
Web kontrol
Html Kontrol
<asp:Button>
<input type=submit>
<asp:CheckBox>
<input type=checkbox>
<asp:HyperLink>
<a href=”...”> </a>
<asp:image>
<img src=”..”>
<asp:imageButton>
<input type=image>
<asp:LinkButton>
Yok
<asp:Label>
<span> </span>
<asp:ListBox>
<select size=”5”>
</select>
<asp:Panel>
<div> </div>
<asp:TextBox>
<input type=text>
<asp:RadioButton>
<input
type=radiobutton>
<asp:DropDownList>
<select> </select>
<asp:Table>
<table> </table>
Tablo 7.1 Standart Kontroller
Doğrulama Kontrolleri
Kullanıcının girdiği değerleri kontrol etmek için kullanılır. Kontrolün yapılacağı
alana ve veriye göre, farklı doğrulama kontrolleri kullanılır. ASP.NET, belirli bir
aralıkta veri girişi sağlayan, karşılaştırma yapan ve belirli değerlerin boş
geçilmemesini
sağlayan
çeşitli
doğrulama
kontrolleri
sunar.
RequiredFieldValidator,
RangeValidator,
CompareValidator,
RegularExpressionValidator, CustomValidator, ValidationSummary
kontrolleri, bu grupta yer alır.
Zengin Kontroller
AdRotator ve Calendar zengin kontroller grubunda yer alır. AdRotator, Web
sayfaları üzerinde reklam yayını yapmak için kullanılır. Calendar ise Web
sayları üzerinde Takvim göstermek için kullanılır.
179
Konu: 1
İlişkisel Liste Tabanlı Kontroller
Bu kontroller, veritabanından çekilen kayıtların gösterilmesini sağlar. DataList,
DataGrid ve Repeater kontrolleri, bu grupta yer alırlar.
Konu 4: Standart Kontroller
Label
Label,kullanıcıya bilgi vermek için kullanılır.
<asp:Label runat="server" Text="Label Control" FontItalic="true" />
Bu kontrol, Internet Explorer tarayıcısında şu şekilde gösterilir.
<span style="font-style:italic;">Label Control</span>
TextBox
TextBox, kullanıcının bilgi girişini sağlar. En sık kullanılan giriş .kontroludür.
<asp:TextBox id="userName" type="text" runat="server">
Bu kontrol, Internet Explorer tarayıcısında şu şekilde gösterilir.
<input name="userName" id="userName" type="text" />
180
Modül 7:
Web kontroller, WebControl sınıfından türemişlerdir. Bu yüzden Web kontroller
BackColor, BorderColor, Enabled, Font, Height, Width özelliklerine sahiptir.
Button
Button, form üzerindeki olayları sunucuya yollamak için kullanılır. En sık
kullanılan onay kontroludür.
Örnekte Dugme1 isimli button tıklandığında, Label kontrolune mesaj yazılır.
<asp:Button id="Dugme1" runat="server" Text="Tıklayınız"
OnClick="Dugme1_Click" runat="server"/>
<span id="Message" runat="server" />
private void Dugme1(object sender, System.EventArgs e)
{
Message.InnerHtml="Beni Tıkladın." ;
}
CheckBox
CheckBox, kullanıcıya seçenekler arasından
seçim yapma imkânı sunar.
Onay kutusu işaretlenmiş ise True, işaretlenmemiş ise False değerini alır.
Onay kutusunun durumu CheckedChanged metodu ile takip edilebilir.
Örnekte CheckBox kontrolünün onay kutusu tıklandığı anda “Seçili”, seçim
işlemi geri alındığı anda “Seçili değil” mesajı yazılır. Seçim yapıldığı anda
mesajın yazdırılmasını sağlayan AutoPostBack özelliğinin, True değeridir.
void Check_Clicked(Object Sender, EventArgs e)
{
If (checkbox1.Checked )
{
Message.InnerHtml="Seçili" ;
}
else
{
Message.InnerHtml="Seçili Değil" ;
}
}
<asp:CheckBox id="checkbox1" runat="server"
AutoPostBack="True"
Text="Üye Olmak İster misiniz?"
TextAlign="Right"
OnCheckedChanged="Check_Clicked"/>
<br>
<span id="Message" runat="server" />
181
Konu: 1
RadioButton
RadioButton, CheckBox kontrolüne benzerlik gösterir. Ancak RadioButton
kontrolunun GroupName özelliği ile, birden fazla RadioButton arasında grup
oluşturulur. Aynı grup içerisinden sadece bir RadioButton seçilebilir. Birden
fazla seçeneğin işaretlenmesine izin verilmez. Onay kutusunun durumu
Checked metodu ile takip edilebilir.
Örnekte, RadioButton kontrolleri arasında muzik isminde bir grup
oluşturulmuştur. Bu grup içerisindeki Pop, Jazz ve Classic RadioButton
kontrollerinden sadece bir tanesi seçilebilir. BtnOnay isimli button tıklandığında,
seçilen RadioButton kontrolunun değeri Message isimli Label kontrolune
yazılır.
void BtnOnay_Clicked(Object Sender,EventArgs e)
{
if (Radio1.Checked)
{
Message.InnerHtml = "Seçiminiz" + Radio1.Text;
}
else if (Radio2.Checked)
{
Message.InnerHtml = " Seçiminiz " + Radio2.Text;
}
else if (Radio3.Checked)
{
Message.InnerHtml = " Seçiminiz " + Radio3.Text;
}
}
<h4>Beğendiğiniz müzik türünü seçiniz:</h4>
182
Modül 7:
<asp:RadioButton id=Radio1 Text="Pop" Checked="True'
GroupName="muzik" runat="server"/>
<br>
<asp:RadioButton id=Radio2 Text="Jazz"
GroupName="muzik" runat="server"/>
<br>
<asp:RadioButton id=Radio3 Text="Classic"
GroupName="muzik" runat="server"/>
<br>
<asp:button text="Seçiniz" id=”BtnOnay”
OnClick="BtnOnay_Clicked" runat=server/>
<br><br>
<span id="Message" runat="server" />
HyperLink
Hyperlink, sayfalar arası dolaşımı sağlar. Hyperlink kontrolunun görünümü
metin veya resim olabilir. ImageUrl özelliği ile görüntülenecek resim dosyası
belirlenir. NavigateUrl özelliği ile gidilecek sayfa belirlenir.
Örnekte Hyperlink kullanımı gösterilmektedir.
<asp:HyperLink id="hyperlink1" runat="server"
ImageUrl="image1.gif"
NavigateUrl="http://www.bilgeadam.com"
Text="Bilge Adam BTA"
Target="_blank"/>
Target özelliği, açılacak sayfanın aynı sayfa üzerinde veya yeni bir sayfada
gösterilmesini sağlar. Tablo 8.2’de Target özelliğinin değerleri gösterilmektedir.
Target Özelliği
Açıklama
_blank
Yeni sayfa
_self
Aynı sayfa içinde
_search
Arama sayfası
görünümünde
Tablo 7.2: Target Özelliğinin Değerleri
Image
Image, sayfa içinde resim görüntülemek için kullanılır. ImageUrl özelliği ile
görüntülenecek resim dosyası belirlenir. ImageAlign özelliği resmin
hizalanması için kullanılır. AlternateText resime alternatif metin göstermek
için kullanılır.
Örnekte Image kullanımı gösterilmektedir.
<asp:Image id="Image1" runat="server"
AlternateText="Logomuz"
183
Konu: 1
ImageAlign="left"
ImageUrl="logo.gif"/>
ImageButton
ImageButton resimli button kontroludur.
Örnekte ImageButton kullanımı gösterilmektedir.
void ImageButton_Click(object Source,ImageClickEventArgs e)
{
Message.InnerHtml="Resimli Düğme kontrolünü Tıkladınız" +
"Koordinatlar: (" & e.X.ToString() + ", " +
e.Y.ToString() & ")" ;
}
<asp:ImageButton id="imagebutton1" runat="server"
AlternateText="Resimli Düğme Kontrolü"
ImageAlign="right"
ImageUrl="image1.gif"
OnClick="ImageButton_Click"/>
<br><br>
<span id="Message" runat="server"/>
kontrolünün ImageClickEventArgs argüman
kullanarak, kontrolün bulunduğu yerin koordinat değerleri alınabilir.
ImageButton
nesnesi
LinkButton
görünümlü Button kontrolüdür. LinkButton
kontrolünün HyperLink kontrolünden farkı ise olaylarının olmasıdır.
LinkButton, HyperLink
Örnekte LinkButton kullanımı gösterilmektedir.
void LinkButton1_Click(Object sender,EventArgs e)
{
Label1.Text="Link Button’a tıkladınız" ;
}
<asp:LinkButton Text="Mesajı Görmek İçin Tıklayınız."
Font-Name="Verdana" Font-Size="14pt"
onclick="LinkButton1_Click" runat="server"/>
<br>
<asp:Label id=Label1 runat=server />
184
Modül 7:
DropDownList
DropDownList, açılan kutuda veri görüntülemek için kullanılır. DropDownList
öğeleri Items koleksiyonunda tutulur. Items koleksiyonunun Count özelliği ile
toplam öğe sayısı bulunur. DropDownList kontrolune tasarım veya çalışma
zamanında öğe eklenebilir.
Örnekte DropDownList kontrolune tasarım zamanında öğe eklenmektedir.
void Button_Click(object sender, EventArgs e)
{
Label1.Text = "Konuştuğunuz Dil " +
dropdownlist1.SelectedItem.Text + "." ;
}
<asp:DropDownList id="dropdownlist1" runat="server">
<asp:ListItem>Türkçe</asp:ListItem>
<asp:ListItem>İngilizce</asp:ListItem>
<asp:ListItem>Almanca</asp:ListItem>
<asp:ListItem>İtalyanca</asp:ListItem>
</asp:DropDownList>
<asp:Button id="Button1" Text="Submit"
OnClick="Button_Click" runat="server"/>
<asp:label id="Label1" runat="server"/>
ListItem etiketi içindeki değerler, DropDownList öğelerini temsil eder.
Örnekte DropDownList kontrolune çalışma zamanında öğe eklenmektedir.
<asp:DropDownList id="DropDownList1" style="Z-INDEX: 101;
185
Konu: 1
LEFT: 128px; POSITION: absolute; TOP: 160px"
runat="server" Width="152px"/>
void Page_Load(System.Object sender, System.EventArgs e)
{
for (int i=0;i<=5;i++)
{
DropDownList1.Items.Add(i.ToString);
}
}
Çalışma zamanında eleman eklemek için, Items koleksiyonunun Add metodu
kullanılır.
ListBox
ListBox, DropDownList kontrolüne benzer. Elemanlar liste halinde gösterilir
ve SelectionMode özelliğine Multiple değeri atanarak, çoklu seçim yapma
imkânı sağlanır.
Örnekte ListBox kontrolunün çoklu seçim özelliği kullanılmaktadır. ListBox
kontrolu içerisinde seçilen tüm elemanlar Label kontrolune yazıdırılır.
public void SubmitBtn_Click(object sender, EventArgs e)
{
ListItem item;
Message.Text = "";
foreach(ListItem item in ListBox1.Items)
{
if(item.Selected == true)
{
Message.Text += item.Text + " ";
}
}
}
<asp:ListBox id=ListBox1 Rows=4
SelectionMode="Multiple" Width="100px" runat="server">
<asp:ListItem>Türkçe</asp:ListItem>
<asp:ListItem>İngilizce</asp:ListItem>
<asp:ListItem>Almanca</asp:ListItem>
<asp:ListItem>İtalyanca</asp:ListItem>
</asp:ListBox>
<br>
<asp:button Text="Submit" OnClick="SubmitBtn_Click"
runat="server" />
<br>
<asp:Label id="Message" runat="server"/>
Panel
Panel, diğer kontrolleri gruplandırmak için kullanılır.
Örnekte panel kullanımı gösterilmektedir.
public void Button1_Click(object sender, EventArgs e)
{
186
Modül 7:
// Label kontrolü oluşturalım
Label label;
label = new Label();
label.Text = "Etiket";
label.ID = "Label1";
Panel1.Controls.Add(label);
Panel1.Visible = true;
}
<asp:Panel id="Panel1" runat="server"
BackColor="blue"
Height="150px"
Width="200px"
Visible=false>
Panel1
<p>
</asp:Panel>
<asp:Button id="Button1" onClick="Button1_Click"
Text="Panel’i Göster" runat="server"/>
Panel1 isimli panel kontrolü başlangıçta gösterilmemektedir Button1 düğmesi
tıklanınca, panel kontrolunun içerisine label kontrolu eklenir ve görünür hale.
getirilir. BackImageUrl özelliği ile panele arka plan resmi verilir.
Table
Table, satırlarına ve sütunlarına programlama yoluyla müdahale edilebilen
tablo kontroldür. Table kontrolü içinde TableRow ve TableCell nesneleri
kullanılır. TableCell, tabloda bir hücreyi temsil eder. TableRow ise tabloda bir
satırı temsil eder.
Örnekte Tabel kullanımı gösterilmektedir.
private void Page_Load(object sender, System.EventArgs e)
{
//Satır ve Sütun Oluşumu
int nrows = 3;
int ncells = 2;
int i;
int j;
for(j=0;j<=nrows - 1;j++)
{
TableRow r;
r = new TableRow();
for(i=1;i<=ncells;i++)
{
TableCell c;
c = new TableCell();
c.Controls.Add(new LiteralControl("Satır " +
j.ToString() + ", hücre " + i.ToString()));
r.Cells.Add(c);
}
Table1.Rows.Add(r);
}
187
Konu: 1
<asp:Table id="Table1" GridLines="Both"
HorizontalAlign="Center" Font-Name="Verdana"
Font-Size="8pt" CellPadding=15 CellSpacing=0
Runat="server"/>
Konu 5: Doğrulama(Validation) Kontroller
Web forma girilecek verinin doğruluğunu kontrol etmek için sıklıkla JavaScript
fonksiyonları veya uzun ASP kodları kullanılırdı. Bu durum uygulama geliştirme
sürecinin artmasına neden olurdu.
ASP.NET ile birlikte verinin doğruluğunu kontrol etmek için doğrulama
kontrolleri geliştirildi. ASP.NET, belirlsi bir aralıkta veri girişi sağlayan,
karşılaştırma yapan ve belirli değerlerin boş geçilmemesini sağlayan çeşitli
doğrulama kontrolleri sunar. Tablo 7.1 de doğrulama kontrolleri listelenmiştir.
Validation Kontroller
Görevi
RequiredFieldValidator
Bir kontrol içerisine değer girilip
girilmediğini kontrol eder. Veri
girilmesi zorunlu alanlarda kullanılır.
CompareValidator
Kontrol içerisine girilen değeri, sabit
değerle veya başka bir kontrole
girilen değerle karşılaştırır.
RangeValidator
Kontrol içerisine girilen değerin, İki
sabit değer arasında olmasını sağlar.
188
Modül 7:
RegularExpressionValidator
Bir kontrol içerisine girilen değerin,
istenilen formatta girilmesini sağlar.
CustomValidator
Özel doğrulama kontrolu yazmayı
sağlar.
ValidationSummary
Sayfada kullanılan tüm validation
kontrollerin, doğrulama hatalarını
özet olarak görüntüler.
Tablo 7.3: Doğrulama Kontrolleri
Doğrulama kontrollerinin ortak özellikleri aşağıdaki gibidir.
•
ControlToValidate: Hangi kontrolün doğrulanacağını belirtir.
•
ErrorMessage: Geçerli giriş yapılmamışsa görüntülenecek hata
mesajını verir.
•
Text: ErrorMessage ve Text özelliği birlikte kullanılabilir. Bu
durumunda Text özelliğindeki mesaj görüntülenir. Doğrulama
kontrollerin ErrorMessage özelliğine girilen tüm mesajlar
ValidationSummary içerisinde listelenir.
•
Display: Validation kontrolün nasıl görüntüleneceği bilgisini
tutar. Static, Dynamic ve None değerleri alır.
RequiredFieldValidator
RequiredFieldValidator, belirtilen kontrolün boş geçilmemesini sağlar.
Doğrulama yapılacak web kontrolünün ismi ControlToValidate özelliğine
girilir Geçerli giriş yapılmadığında ortaya çıkacak hata mesajı ErrorMessage
özelliği ile belirtilir.
Örnekte RequiredFieldValidator kullanımı gösterilmektedir..
<asp:RequiredFieldValidator id="RequiredFieldValidator1"
style="Z-INDEX: 103; LEFT: 224px; POSITION: absolute;
TOP: 48px" runat="server"
ErrorMessage="Adınızı Girmelisiniz!!!"
ControlToValidate="txtad">
</asp:RequiredFieldValidator>
CompareValidator
Kontrol içerisine girilen değeri, sabit değerle veya başka bir kontrol ile
karşılaştırmak için kullanılır. Doğrulama yapılacak web kontrolünün ismi
ControlToValidate özelliğine girilir. Karşılastırma yapılacak sabit değer
ValueToCompare özelliğine girilir. Type özelliğine girilen değerin veri türü,
Operator özelliğine ise mantıksal operatör girilir.
Örnekte txtYas kontrolune yirmi veya yirmiden büyük tamsayı girişi sağlayan
doğrulama işlemi yapılmaktadır.
189
Konu: 1
<asp:CompareValidator id="CompareValidator1"
style="Z-INDEX: 109; LEFT: 232px; POSITION: absolute;
TOP: 88px" runat="server"
ErrorMessage="Yaşınız 20 ye eşit veya büyük olmalıdır."
ValueToCompare="20"
ControlToValidate="txtYas"
Type="Integer"
Operator="GreaterThanEqual"
Width="128px">
</asp:CompareValidator>
Doğrulama yapılacak web kontrolu, başka bir
karşılaştırılacaksa ControlToCompare özelliği kullanılır.
web
kontrolü
ile
Örnekte txtYas kontrolünün değeri txtKontrol değerinden büyük olmalıdır.
<asp:CompareValidator id="CompareValidator1"
style="Z-INDEX: 109; LEFT: 240px; POSITION: absolute;
TOP: 128px" runat="server"
ErrorMessage="yaşınız kontrol alanında yazılan
değerden büyük olmalıdır."
ControlToValidate="txtYas"
Type="Integer"
Operator="GreaterThan"
Width="144px"
ControlToCompare="txtKontrol">
</asp:CompareValidator>
RangeValidator
Kontrol içerisine girilen değerin, belirli bir değer aralığında olmasını sağlar.
Doğrulama kontrollerinin ortak özelliklerine ek olarak MinimumValue,
MaximumValue ve Type özellikleri vardır.
Örnekte txtYas kontrolune girilen değerin, otuzbeş ile elli arasında olamasını
sağlayan doğrulama işlemi yapılmaktadır. Bu özel karakterler Tablo 7.4
<asp:RangeValidator id="RangeValidator1"
style="Z-INDEX: 109; LEFT: 240px; POSITION:
absolute; TOP: 128px" runat="server"
ErrorMessage="Yaşınız 35 ile 50 arasında olmalıdır."
ControlToValidate="txtYas"
Type="Integer"
MaximumValue="50"
MinimumValue="35">
</asp:RangeValidator>
190
Modül 7:
RegularExpressionValidator
Kontrol içerisine girilen değerin, istenilen formatta girilmesini sağlar.
ValidationExpression özelliğine girilen özel karakterler ile veri giriş formatı
sağlanır. Bu özel karakterler Tablo 7.4 de gösterilmektedir.
Örnekte RegularExpressionValidator kontrolu ile txtMail metin kutusu için
geçerli e-mail girişi sağlanmaktadır.
<asp:regularexpressionvalidator
id="RegularExpressionValidator1" style="Z-INDEX: 111;
LEFT: 256px; POSITION: absolute; TOP: 168px"
runat="server"
ErrorMessage="Mail giriş hatası"
ControlToValidate="txtMail"
ValidationExpression=
"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*">
</asp:regularexpressionvalidator>
Karakter
Tanımı
a
Bir harf kullanımını zorunlu kılar.
1
1 sayısı kullanılmak zorunda.
?
0 veya 1 öğe olmak zorunda
*
0’dan n’e kadar bir değer
+
1’den n’e kadar bir değer
191
Konu: 1
[0-n]
0’dan n’e kadar sayı değer dizisi
{n}
N ile belirtilen değer uzunluğunda olmalı
|
Farklı geçerli dizinler.
\
Bir komut karakterini devam ettiren karakter
\w
Bir karakter olmak zorunda.
\d
Bir rakam olmak zorunda.
\.
Bir nokta olmak zorunda.
Tablo 7.4: Kontrol Karakterleri
Örnekte ValidationExpression özelliğine girilen özel karakterler ile e-mail
formatı oluşturulmaktadır.
ValidationExpression=
"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*">
\w+ : En az bir karakter içeren metin anlamına gelir.
([-+.]) : -, +, . karakterlerinden herhangi biri anlamına gelir.
* : 0’dan n’e kadar bir değer girilmesi gerektiği anlamına gelir.
@ : @ işaretinin kullanılması gerektiğini belirtir.
Örnekte ValidationExpression özelliğine girilen özel karakterler ile e-mail
formatı oluşturulmaktadır.
ValidationExpression =“\w+@\w+\.\w+”
CustomValidator
Aynı anda birden fazla nesnenin değerini kontrol etmek veya kullanıcı tanımlı
kontrol yazmak için CustomValidator kontrolü kullanılır.
192
Modül 7:
Özellik
Açıklama
ClientValidationFunction
İstemci fonksiyon ismini belirtir.
ControlToValidate
Doğrulama yapılacak kontrolü belirler.
Display
Text özelliğine girilen hata mesajının nasıl
görüntüleneceği belirtir.
EnableClientScript
İstemci skriptleri aktif hale getirir.
Varsayılan değer True dur.
Enabled
Sunucu ve istemci taraflı skriptleri aktif hale
getirir. Varsayılan değer True dur.
ErrorMessage
Kontrol hata mesajını gösterir.
IsValid
Kontrol işlemi başarı ile sonuçlanmışsa
True, değilse False değerini döndürür.
Text
Kontrol hata mesajını gösterir.
ErrorMessage ve Text özelliği birlikte
kullanılabilir. Bu durumunda Text
özelliğindeki mesaj görüntülenir.
Tablo 7.3: CustomValidator Kontrolünün Özellikleri
ServerValidate olayı ve OnServerValidate metodu ile sunucu taraflı
kontroller tetiklenir.
Örnekte sunucu taraflı metod oluşturulmaktadır.
public void CustomValidator_SunucuKontrol(object s,
ServerValidateEventArgs e)
{
}
ServerValidateEventArgs parametresinin iki özelliği vardır:
IsValid: Bu özellik True ise kontrol içerisine girilen değerin doğruluğu
sağlanmıştır.
Value: Doğrulama kontrolünün değerini verir.
CustomValidator, kredi kart numaralarının doğruluğu kontrol etmek için
kullanılabilir.
Örnekte metin kutusuna girilen değerin çift olması kontrol edilmektedir.
CustomValidator kontrolunun HTML kodları aşağıdaki gibidir.
<form id="Form1" method="post" runat="server">
<asp:Button id="Button1" style="Z-INDEX: 101; LEFT:
200px; POSITION: absolute; TOP: 96px" runat="server"
Text="gonder" onClick=”gonder_OnClick”>
</asp:Button>
<asp:CustomValidator id="CustomValidator1"
193
Konu: 1
style="Z-INDEX: 102; LEFT: 312px; POSITION: absolute;
TOP: 64px" runat="server"
ErrorMessage="çift rakam giriniz."
ControlToValidate="txtcustom" Display="Static"
OnServerValidate="ServerKontrol">
</asp:CustomValidator>
<asp:TextBox id="txtmessage" style="Z-INDEX: 103;
LEFT: 200px; POSITION: absolute; TOP: 152px"
runat="server">
</asp:TextBox>
<asp:TextBox id="txtcustom" style="Z-INDEX: 104;
LEFT: 144px; POSITION: absolute; TOP: 64px"
runat="server">
</asp:TextBox>
</form>
CustomValidator kontrolunun C# kodları aşağıdaki gibidir.
public void ServerKontrol(object source,
ServerValidateEventArgs args)
{
try
{
int num = int.Parse(args.Value);
args.IsValid = ((num%2) == 0);
}
catch(Exception ex)
{
args.IsValid = false;
}
}
public void gonder_OnClick(object sender, EventArgs e)
{
if(Page.IsValid)
{
txtmessage.Text = "Sayfada Hata Yok.";
}
else
{
txtmessage.Text = "Sayfa Hatalı!";
}
}
ValidationSummary
ValidationSummary, doğrulama kontrollerin ErrorMessage özelliğine girilen
tüm mesajları listeler.
Örnekte ValidationSummary kullanımı gösterilmektedir.
<asp:ValidationSummary id="ValidationSummary1"
style="Z-INDEX: 114; LEFT: 72px; POSITION: absolute;
TOP: 336px"
runat="server"
HeaderText="Hatalar">
</asp:ValidationSummary>
194
Modül 7:
DisplayMode özelliği ile ValidationSummary kontrolunun görüntüsü
değiştirilebilir. DisplayMode, BulletList, List ve SingleParagraph
değerlerini alır. ShowMessageBox, hata listesinin mesaj kutusu içinde
görüntülenmesini sağlar.
Konu 8: Zengin Kontroller
AdRotator
AdRotator, Web sayfaları üzerinde reklam yayını yapmak için kullanılır.
Reklam için kullanılan banner nesneleri XML dosya içerisine kaydedilir.
Örnekte AdRotator
gösterilmektedir.
kullanımı
için
gerekli
XML
dosya
(Ads.Xml)
<Advertisements>
<Ad>
<ImageUrl>image1.gif</ImageUrl>
<NavigateUrl>http://www.bilgeadam.com</NavigateUrl>
<AlternateText>BilgeAdam BTA</AlternateText>
<Impressions>80</Impressions>
<Keyword>Yazılım</Keyword>
</Ad>
<Ad>
<ImageUrl>image2.gif</ImageUrl>
<NavigateUrl>http://www.microsoft.com</NavigateUrl>
<AlternateText>Microsoft Site</AlternateText>
<Impressions>80</Impressions>
195
Konu: 1
<Keyword>microsoft</Keyword>
</Ad>
</Advertisements>
Ad: Her bir banner nesnesini temsil eder.
ImageUrl:
Banner içerisinde görüntülenecek resim dosyasını belirtir.
NavigateUrl: Gidilecek sayfanın adres bilgisini belirtir.
AlternateText: Resime alternatif metin göstermek için kullanılır.
Impression: -Banner resimlerinin uygulama süresini belirtir.
Keyword:.Banner nesneleri arasında filtreleme oluşturacak kategori adını
belirler.
AdRotator kontrolünün
AdvertisementFile özelliği, reklâm bilgilerinin
bulunduğu XML dosyayı içerir. KeywordFilter özelliği ise reklâmların
filtrelenerek görüntülenmesini sağlar.
Calendar
Calendar, web sayları üzerinde Takvim göstermek için kullanılır..
Örnekte Calender kullanımı gösterilmektedir.
<asp:Calendar
id=”takvim” runat=”server”/>
Calendar kontrolüne ait özellikler tablo 7.4’de listelenmiştir.
Özellik
Açıklama
CellPadding
Hücreler ve kenarlıkları arasındaki
boşluk değerini tutar.
CellSpacing
Hücreler arasındaki boşluk değerini
tutar.
DayNameFormat
Gün isimlerinin görüntülenme
biçimini tutar. FirstLetter,
FirstTwoLetters, Full ve
Short değerleri vardır. Varsayılan
Short değeridir.
FirstDayOfWeek
Haftanın ilk gününü belirtir.
NextPrevFormat
Next ve Previous linklerinin
biçimini ayarlar. CustomText,
FullMonth, ShortMonth değerleri
alır. Varsayılan CustomText
değeridir.
SelectedDate
Seçilen gün bilgisini tutar. Varsayılan
değer günün tarihidir.
SelectionMode
Calendar nesnesinin seçim modunu
belirler. Day, DayWeek,
DayWeekMonth ve None değerleri
196
Modül 7:
alır. Varsayılan seçenek Day
değeridir.
ShowDayHeader
Gün isimlerini kolonların üzerinde
görüntüler.
ShowGridLines
Günleri hücreler içinde görüntüler.
ShowNextPrevMonth
Önceki ve sonraki ay linklerinin
görüntülenmesini sağlar.
ShowTitle
Takvim başlığını görüntüler.
TitleFormat
Başlık yazısının biçimini belirtir.
Tablo 7.4: Calendar Kontrolünün Özellikleri
Örnekte Calender kullanımı gösterilmektedir.
<asp:Calendar id="Calendar1" style="Z-INDEX: 105; LEFT:
160px; POSITION: absolute; TOP: 248px"
runat="server" CellSpacing="2" Width="240px"
Height="152px" BorderStyle="Groove" DayNameFormat="Full"
NextPrevFormat="FullMonth">
<DayStyle Font-Bold="True" HorizontalAlign="Center"
BorderStyle="None" BorderColor="Transparent"
VerticalAlign="Top" BackColor="LightCyan">
</DayStyle>
<DayHeaderStyle Font-Underline="True" Font-Italic="True"
HorizontalAlign="Right" BorderWidth="3px"
ForeColor="DarkBlue" BorderStyle="Groove"
BorderColor="#C0FFFF" VerticalAlign="Top"
BackColor="#FFC0FF">
</DayHeaderStyle>
<WeekendDayStyle BackColor="Salmon"></WeekendDayStyle>
</asp:Calendar>
197
Konu: 1
Konu 9: AutoPostBack Özelliği
AutoPostBack özelliği, herhangi bir sunucu kontrolünün web sunucuya
otomatik olarak bilgi göndermesini sağlar. Web formu doldurduktan sonra
sunucuya göndermek için genellikle button kontrolu kullanılır.
AutoPostBack özelliği, DropDownList, ListBox, CheckBox, CheckBoxList,
RadioButton, RadioButtonList, TextBox ve Button kontrolünde bulunur.
Bu özelliğin True olması, seçim yapıldığında veya TextBox kontrolüne yeni bir
değer girildiğinde sayfanın yeniden yüklenmesi anlamına gelir.
Örnekte AutoPostBack kullanımı gösterilmektedir.
<%@ Page Language="C#" Debug="true" %>
<html>
<head></head>
<body>
<form runat="server">
Bilgiğiniz Yabancı Dili Seçiniz:<br/><br/>
<asp:listbox id="lstDiller" runat="server" rows="3"
AutoPostBack="true"
onSelectedIndexChanged="secimGoster"/>
<br><br>
<asp:Label id=lblMesaj runat="server" /> <br/><br/>
</form>
</body>
</html>
<script language=c# runat="server">
198
Modül 7:
private void Page_Load(object sender, System.EventArgs e)
{
if(!Page.IsPostBack)
{
lstFlowers.Items.Add(new ListItem("İngilizce"));
lstFlowers.Items.Add(new ListItem("Almanca"));
lstFlowers.Items.Add(new ListItem("Fransızca"));
lstFlowers.SelectedIndex = 0;
}
}
public void showSelection(object source, EventArgs e)
{
lblMesaj.Text = "Seçtiğiniz Dil " +
lstDiller.SelectedItem.Text;
}
</script>
AutoPostBack özelliğininin gereksiz yere kullanılması performansı olumsuz
yönde etkiler.
Konu 10: ViewState
ViewState, kullanıcı ve sunucu arasında taşınan verilerinn gizli bir alanda
şifrelenerek saklanmasını sağlar. Forma ait tüm kontrollerin değerleri şifrelenir
ve VIEWSTATE değişkende saklanır. Form sunucuya gönderildikten sonra bir
hata oluşması halinde kullanıcıdan tekrar aynı verilerin girilmesi istenmez.
Çünkü kullanıcının girmiş olduğu değerler bu gizli değişkende saklanır ve sayfa
açılınca tekrar kullanıcıya sunulur.
199
Konu: 1
Örnekte ViewState kullanımı gösterilmektedir.
<input type="hidden" name="__VIEWSTATE"
value="dDwtMTY5NzI1NjkxNzs7Po5lYTu9gAdJkhGyy1Rw1gGcc+ia" />
Modül Özeti
15.
16.
17.
18.
19.
20.
Web form bileşenlerini açıklayın?
Stardart kontroller nelerdir ? Açıklayın.
Doğrulama kontrolleri nelerdir ? Açıklayın.
Zengin kontroller nelerdir ? Açıklayın.
AutoPostBack nedir ?
ViewState özelliğini açıklayın?
200
Modül 7:
Lab 1: E-Ticaret Uygulaması Geliştirmek
Bu uygulamada, e-ticaret uygulamasının web formları tasarlanacaktır. E-ticaret
uygulaması içerisinde müsterilerinin kendi kayıtlarını yapabilmesi için UyeKayit
formu tasarlanacaktır. Kayıt olan müşterilerin ürün satın alabilmesi için sisteme
giriş yapmaları gerekmektedir. Kayıtlı müşterilerin sisteme girişi UyeGiris formu
ile sağlancaktır. Her iki form içerisinde standart ve doğrulama kontrolleri
kullanılacaktır. Ayrıca kullanıcıyı yönlendirmek için Giris, Kayıt ve Satış isminde
3 ayrı web form tasarlanacaktır.
Bu lab tamamlandıktan sonra:
•
Access veritabanına bağlantı oluşturabilecek,
•
Web Formları tanıyacak,
•
Standart Kontrolleri kullanabilecek,
•
Doğrulama kontrollerini kullanabileceksiniz.
Veritabanının projeye eklenmesi
Bu uygulamada kullanılacak Course veritabanı oluşturun.
10. Microsoft Access ile “KitapDb” isminde bir veritabanı oluşturun.
11. Veritabanın tablolarını aşağıdaki diyagrama göre oluşturun.
201
Konu: 1
12. Veritabanı içerisinde EnCokSatanlar isminde sorgu oluşturun.
13. Sorgunun içerisine aşağıdaki Select cümlesini ekleyin.
SELECT Kitap.KitapAdi, Kitap.Ucret, Kitap.KitapID
FROM Kitap INNER JOIN Siparis ON
Kitap.KitapID=Siparis.KitapID
GROUP BY Kitap.KitapAdi, Kitap.Ucret, Kitap.KitapID
ORDER BY Count(Siparis.Adet) DESC;
Web Formların eklenmesi
AspEticaret isminde yeni bir ASP.NET Web Application projesi açın.
UyeKayit formunun eklenmesi
ASPEticaret projesine UyeKayıt isminde yeni bir web form ekleyin.
Form üzerine, tablodaki kontrolleri ekleyin belirtilen özelliklerini ayarlayın.
Kontrol – Kontrol İsmi
Özellik
Değer
TextBox – txtSifre
TextMode
Password
TextBox – txtSifreDogrula
TextMode
Password
ControlToValidate
txtAd
ErrorMessage
Adı boş geçemezsiniz
Text
*
ControlToValidate
txtSoyad
ErrorMessage
Soyadı boş
geçemezsiniz
Text
*
TextBox – txtAd
TextBox – txtSoyad
TextBox – txtEmail
RequiredFieldValidator
–
rfvAd
RequiredFieldValidator
–
rfvSoyad
202
Modül 7:
RequiredFieldValidator
–
ControlToValidate
txtEmail
ErrorMessage
E-maili boş
geçemezsiniz
Text
*
ControlToValidate
txtSifre
ErrorMessage
Şifreyi giriniz.
Text
*
ControlToValidate
txtSifreDogrula
ErrorMessage
Doğrulama şifresini
giriniz
Text
*
ControlToValidate
txtEmail
ErrorMessage
Hatalı Email
rfvEmail
RequiredFieldValidator
–
rfvSifre
RequiredFieldValidator
–
rfvSifre2
RegularExpressionValidator
– revEmail
CompareValidator–
Text
*
Validation
Expression
\w+([+.]\w+)*@\w+([.]\w+)*\.\w+([.]\w+)*
ControlToCompare
txtSifre
ControlToValidate
txtSifre2
ErrorMessage
Şifreler uyumsuz
Text
*
Text
Kaydet
cvSifreDogrula
ValidationSummary – vsHata
Button - btnKaydet
UyeKayit Web formun Html kodları aşağıdaki gibi olacaktır.
203
Konu: 1
<%@ Register TagPrefix="uc1" TagName="yan" Src="yan.ascx"
%>
<%@ Page Language="C#" AutoEventWireup="false"
Codebehind="UyeKayit.aspx.cs"
Inherits="AspEticaret.UyeKayit" %>
<%@ Register TagPrefix="uc1" TagName="kategori"
Src="kategori.ascx" %>
<%@ Register TagPrefix="uc1" TagName="Ust" Src="Ust.ascx" %>
<%@ Register TagPrefix="uc1" TagName="Alt" Src="Alt.ascx" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0
Transitional//EN">
<HTML>
<HEAD>
<title>UyeKayit</title>
<meta content="Microsoft Visual Studio .NET 7.1"
name="GENERATOR">
<meta content="C#" name="CODE_LANGUAGE">
<meta content="JavaScript"
name="vs_defaultClientScript">
<meta
content="http://schemas.microsoft.com/intellisense/ie5"
name="vs_targetSchema">
</HEAD>
<body bgColor="#f0fff0">
<form id="Form1" method="post" runat="server">
<TABLE id="Table1" cellSpacing="0" cellPadding="0"
width="700" align="center" border="0">
<TR>
<TD bgColor="#99ccff" colSpan="3"><uc1:ust
id="Ust1" runat="server"></uc1:ust></TD>
</TR>
<TR>
<TD vAlign="top" width="150"><uc1:kategori
id="Kategori1" runat="server"></uc1:kategori></TD>
<TD width="400" height="100%">
<P>
<TABLE id="Table2" cellSpacing="0"
cellPadding="0" width="300" align="center" border="0">
<TR>
<TD style="HEIGHT: 48px"
colSpan="2">
<P align="center"><FONT
face="Tahoma" size="2"><STRONG>Üyelik
Bilgileri</STRONG></FONT></P>
</TD>
</TR>
<TR>
<TD style="WIDTH: 100px"><FONT
face="Tahoma" size="2">Ad*</FONT></TD>
<TD><asp:textbox id="txtAd"
runat="server"
Width="176px"></asp:textbox><asp:requiredfieldvalidator
id="rfvAd" runat="server" ControlToValidate="txtAd"
ErrorMessage="Adı boş
geçemezsiniz">*</asp:requiredfieldvalidator><FONT
face="Tahoma" size="2"></FONT></TD>
</TR>
<TR>
<TD style="WIDTH: 100px"><FONT
face="Tahoma" size="2">Soyad*</FONT></TD>
<TD><asp:textbox id="txtSoyad"
runat="server"
204
Modül 7:
Width="176px"></asp:textbox><asp:requiredfieldvalidator
id="rfvSoyad" runat="server" ControlToValidate="txtSoyad"
ErrorMessage="Soyadı boş
geçemezsiniz.">*</asp:requiredfieldvalidator><FONT
face="Tahoma" size="2"></FONT></TD>
</TR>
<TR>
<TD style="WIDTH: 100px"><FONT
face="Tahoma" size="2">E-Mail*</FONT></TD>
<TD><asp:textbox id="txtEmail"
runat="server"
Width="176px"></asp:textbox><asp:requiredfieldvalidator
id="rfvEmail" runat="server" ControlToValidate="txtEmail"
ErrorMessage="E-maili boş geçemezsiniz. "
Display="Dynamic">*</asp:requiredfieldvalidator><asp:regu
larexpressionvalidator id="revEmail" runat="server"
ControlToValidate="txtEmail" ErrorMessage="Hatalı Email"
Display="Dynamic"
ValidationExpression="\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([.]\w+)*">*</asp:regularexpressionvalidator><FONT
face="Tahoma" size="2"></FONT></TD>
</TR>
<TR>
<TD style="WIDTH: 100px"><FONT
face="Tahoma" size="2">Şifre*</FONT></TD>
<TD><asp:textbox id="txtSifre"
runat="server" Width="176px"
TextMode="Password"></asp:textbox><asp:requiredfieldvalidato
r id="rfvSifre" runat="server" ControlToValidate="txtSifre"
ErrorMessage="Şifreyi
giriniz.">*</asp:requiredfieldvalidator><FONT face="Tahoma"
size="2"></FONT></TD>
</TR>
<TR>
<TD style="WIDTH: 100px"><FONT
face="Tahoma" size="2">Şifre Doğrula*</FONT></TD>
<TD><asp:textbox
id="txtSifreDogrula" runat="server" Width="176px"
TextMode="Password"></asp:textbox><asp:requiredfieldvalidato
r id="rfvSifre2" runat="server"
ControlToValidate="txtSifreDogrula" ErrorMessage="Doğrulama
şifresini giriniz."
Display="Dynamic">*</asp:requiredfieldvalidator><asp:comp
arevalidator id="cvSifreDogrula" runat="server"
ControlToValidate="txtSifreDogrula" ErrorMessage="Şifreler
uyumsuz."
Display="Dynamic"
ControlToCompare="txtSifre">*</asp:comparevalidator></TD>
</TR>
<TR>
<TD style="HEIGHT: 47px"
colSpan="2">
<P align="center"><asp:button
id="btnKaydet" runat="server"
Text="Kaydet"></asp:button></P>
</TD>
</TR>
<TR>
<TD style="WIDTH: 100px"
colSpan="2"><asp:validationsummary id="vsHata"
runat="server" Width="286px"></asp:validationsummary></TD>
</TR>
<TR>
205
Konu: 1
<TD style="WIDTH: 100px; HEIGHT:
15px" colSpan="2"></TD>
</TR>
<TR>
<TD style="WIDTH: 100px"></TD>
<TD></TD>
</TR>
</TABLE>
</P>
</TD>
<TD vAlign="top" width="150"
bgColor="#0099ff"><uc1:yan id="Yan1"
runat="server"></uc1:yan></TD>
</TR>
<TR>
<TD bgColor="#99ccff" colSpan="3">
<uc1:Alt id="Alt1"
runat="server"></uc1:Alt></TD>
</TR>
</TABLE>
</form>
</body>
</HTML>
UyeGiris formunun eklenmesi
ASPEticaret projesine UyeGiris isminde yeni bir web form ekleyin.
Form üzerine, tablodaki kontrolleri ekleyin belirtilen özelliklerini ayarlayın.
Kontrol – Kontrol İsmi
Özellik
Değer
TextBox – txtSifre
TextMode
Password
Text
*
Button – btnGiris
Text
Giriş
Label – lblMesaj
Text
TextBox – txtEmail
206
Modül 7:
UyeGiriş Web formun Html kodları aşağıdaki gibi olacaktır.
<%@ Register TagPrefix="uc1" TagName="kategori"
Src="kategori.ascx" %>
<%@ Register TagPrefix="uc1" TagName="Ust" Src="Ust.ascx" %>
<%@ Register TagPrefix="uc1" TagName="Alt" Src="Alt.ascx" %>
<%@ Register TagPrefix="uc1" TagName="yan" Src="yan.ascx" %>
<%@ Page Language="C#" AutoEventWireup="false"
Codebehind="UyeGiris.aspx.cs"
Inherits="AspEticaret.UyeGiris" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0
Transitional//EN">
<HTML>
<HEAD>
<title>UyeGiris</title>
<meta name="GENERATOR" content="Microsoft Visual
Studio .NET 7.1">
<meta name="CODE_LANGUAGE" content="C#">
<meta name="vs_defaultClientScript"
content="JavaScript">
<meta name="vs_targetSchema"
content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body bgColor="#f0fff0">
<form id="Form1" method="post" runat="server">
<TABLE id="Table1" cellSpacing="0" cellPadding="0"
width="700" align="center" border="0">
<TR>
<TD bgColor="#99ccff" colSpan="3">
<uc1:Ust id="Ust1"
runat="server"></uc1:Ust></TD>
</TR>
<TR>
<TD width="150" vAlign="top">
<uc1:kategori id="Kategori1"
runat="server"></uc1:kategori></TD>
<TD width="400" vAlign="top">
<P>
<TABLE id="Table2" cellSpacing="0"
cellPadding="0" width="200" align="center" border="0">
<TR>
<TD style="HEIGHT: 63px"
colSpan="2">
<P align="center"><STRONG><FONT
face="Verdana" size="2"><BR>
Üye
Giriş</FONT></STRONG></P>
</TD>
</TR>
<TR>
<TD style="WIDTH: 66px">EMail </TD>
<TD>
<asp:TextBox id="txtEmail"
runat="server" Width="128px"></asp:TextBox></TD>
</TR>
<TR>
<TD style="WIDTH: 66px; HEIGHT:
11px">Sifre</TD>
<TD style="HEIGHT: 11px">
<asp:TextBox id="txtSifre"
runat="server" Width="127px"
TextMode="Password"></asp:TextBox></TD>
207
Konu: 1
colSpan="2">
</TR>
<TR>
<TD style="HEIGHT: 54px"
<P align="center">
<asp:Button id="btnGiris"
runat="server" Text="Giriş"></asp:Button></P>
</TD>
</TR>
<TR>
<TD colSpan="2">
<asp:Label id="lblMesaj"
runat="server"></asp:Label></TD>
</TR>
</TABLE>
</P>
</TD>
<TD width="150" bgColor="#0099ff" vAlign="top">
<uc1:yan id="Yan1"
runat="server"></uc1:yan></TD>
</TR>
<TR>
<TD bgColor="#99ccff" colSpan="3">
<uc1:Alt id="Alt1"
runat="server"></uc1:Alt></TD>
</TR>
</TABLE>
</form>
</body>
</HTML>
Giris formunun eklenmesi
ASPEticaret projesine Giris isminde yeni bir web form ekleyin.
Form üzerine, tablodaki kontrolleri ekleyin belirtilen özelliklerini ayarlayın.
Kontrol – Kontrol İsmi
Özellik
Değer
HyperLink – lnk1
NavigateUrl
UyeGiris.aspx
Text
Tıklayınız
NavigateUrl
UyeKayit.aspx
Text
Tıklayınız
HyperLink – lnk2
208
Modül 7:
Giris Web formun Html kodları aşağıdaki gibi olacaktır.
<%@ Register TagPrefix="uc1" TagName="Alt" Src="Alt.ascx" %>
<%@ Register TagPrefix="uc1" TagName="Ust" Src="Ust.ascx" %>
<%@ Register TagPrefix="uc1" TagName="kategori"
Src="kategori.ascx" %>
<%@ Register TagPrefix="uc1" TagName="yan" Src="yan.ascx" %>
<%@ Page Language="C#" AutoEventWireup="false"
Codebehind="Giris.aspx.cs" Inherits="AspEticaret.Giris" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0
Transitional//EN">
<HTML>
<HEAD>
<title>Kayit</title>
<meta name="GENERATOR" content="Microsoft Visual
Studio .NET 7.1">
<meta name="CODE_LANGUAGE" content="C#">
<meta name="vs_defaultClientScript"
content="JavaScript">
<meta name="vs_targetSchema"
content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body bgColor="#f0fff0">
<form id="Form1" method="post" runat="server">
<TABLE id="Table1" cellSpacing="0" cellPadding="0"
width="700" align="center" border="0">
<TR>
<TD bgColor="#99ccff" colSpan="3">
<uc1:Ust id="Ust1"
runat="server"></uc1:Ust></TD>
</TR>
<TR>
<TD width="150" vAlign="top">
<uc1:kategori id="Kategori1"
runat="server"></uc1:kategori></TD>
<TD width="400" vAlign="top">
<P><BR>
Sayfaya erişmek için üye girişi
yapmalısınız.<BR>
Giriş yapmak için
<asp:HyperLink id="lnk1" runat="server"
NavigateUrl="UyeGiris.aspx">tıklayınız</asp:HyperLink></P>
<P>Üye olmak için
209
Konu: 1
<asp:HyperLink id="lnk2" runat="server"
NavigateUrl="UyeKayit.aspx">tıklayınız</asp:HyperLink></P>
</TD>
<TD width="150" bgColor="#0099ff" vAlign="top">
<uc1:yan id="Yan1"
runat="server"></uc1:yan></TD>
</TR>
<TR>
<TD bgColor="#99ccff" colSpan="3">
<uc1:Alt id="Alt1"
runat="server"></uc1:Alt></TD>
</TR>
</TABLE>
</form>
</body>
</HTML>
Kayit formunun eklenmesi
ASPEticaret projesine Kayit isminde yeni bir web form ekleyin.
Form üzerine, tablodaki kontrolleri ekleyin belirtilen özelliklerini ayarlayın.
Kontrol – Kontrol İsmi
Özellik
Değer
HyperLink – lnk1
NavigateUrl
UyeGiris.aspx
Text
tıklayınız
Kayit web formun Html kodları aşağıdaki gibi olacaktır.
<%@ Register TagPrefix="uc1" TagName="yan" Src="yan.ascx" %>
<%@ Page Language="c# " AutoEventWireup="false"
Codebehind="Kayit.aspx.cs" Inherits="AspEticaret.Kayit" %>
<%@ Register TagPrefix="uc1" TagName="kategori"
Src="kategori.ascx" %>
<%@ Register TagPrefix="uc1" TagName="Ust" Src="Ust.ascx" %>
<%@ Register TagPrefix="uc1" TagName="Alt" Src="Alt.ascx" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0
Transitional//EN">
<HTML>
210
Modül 7:
<HEAD>
<title>Kayit</title>
<meta name="GENERATOR" content="Microsoft Visual
Studio .NET 7.1">
<meta name="CODE_LANGUAGE" content="C#">
<meta name="vs_defaultClientScript"
content="JavaScript">
<meta name="vs_targetSchema"
content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body bgColor="#f0fff0">
<form id="Form1" method="post" runat="server">
<TABLE id="Table1" cellSpacing="0" cellPadding="0"
width="700" align="center" border="0">
<TR>
<TD bgColor="#99ccff" colSpan="3">
<uc1:Ust id="Ust1"
runat="server"></uc1:Ust></TD>
</TR>
<TR>
<TD width="150" vAlign="top">
<uc1:kategori id="Kategori1"
runat="server"></uc1:kategori></TD>
<TD width="400" vAlign="top">
<P><BR>
Kayıt işlemi başarıyla tamalandı.<BR>
Giriş yapmak için
<asp:HyperLink id="lnk1" runat="server"
NavigateUrl="UyeGiris.aspx">tiklayiniz</asp:HyperLink></P>
</TD>
<TD width="150" bgColor="#0099ff" vAlign="top">
<uc1:yan id="Yan1"
runat="server"></uc1:yan></TD>
</TR>
<TR>
<TD bgColor="#99ccff" colSpan="3">
<uc1:Alt id="Alt1"
runat="server"></uc1:Alt></TD>
</TR>
</TABLE>
</form>
</body>
</HTML>
Satis formunun eklenmesi
ASPEticaret projesine Satis isminde yeni bir web form ekleyin.
Form üzerine, tablodaki kontrolleri ekleyin belirtilen özelliklerini ayarlayın.
Kontrol – Kontrol İsmi
Özellik
Değer
HyperLink – lnk1
NavigateUrl
Default.aspx
Text
tıklayınız
211
Konu: 1
Satis web formun Html kodları aşağıdaki gibi olacaktır.
<%@ Register TagPrefix="uc1" TagName="Alt" Src="Alt.ascx" %>
<%@ Register TagPrefix="uc1" TagName="Ust" Src="Ust.ascx" %>
<%@ Register TagPrefix="uc1" TagName="kategori"
Src="kategori.ascx" %>
<%@ Register TagPrefix="uc1" TagName="yan" Src="yan.ascx" %>
<%@ Page Language="c#" AutoEventWireup="false"
Codebehind="Satis.aspx.cs" Inherits="AspEticaret.Satis" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0
Transitional//EN">
<HTML>
<HEAD>
<title>Kayit</title>
<meta name="GENERATOR" content="Microsoft Visual
Studio .NET 7.1">
<meta name="CODE_LANGUAGE" content="C#">
<meta name="vs_defaultClientScript"
content="JavaScript">
<meta name="vs_targetSchema"
content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body bgColor="#f0fff0">
<form id="Form1" method="post" runat="server">
<TABLE id="Table1" cellSpacing="0" cellPadding="0"
width="700" align="center" border="0">
<TR>
<TD bgColor="#99ccff" colSpan="3">
<uc1:Ust id="Ust1"
runat="server"></uc1:Ust></TD>
</TR>
<TR>
<TD width="150" vAlign="top">
<uc1:kategori id="Kategori1"
runat="server"></uc1:kategori></TD>
<TD width="400" vAlign="top">
<P><BR>
Satiş işlemi başarıyla
tamalandı.<BR>
Devam etmek için
<asp:HyperLink id="link1" runat="server"
NavigateUrl="Default.aspx">tıklayınız</asp:HyperLink></P>
</TD>
<TD width="150" bgColor="#0099ff" vAlign="top">
212
Modül 7:
<uc1:yan id="Yan1"
runat="server"></uc1:yan></TD>
</TR>
<TR>
<TD bgColor="#99ccff" colSpan="3">
<uc1:Alt id="Alt1"
runat="server"></uc1:Alt></TD>
</TR>
</TABLE>
</form>
</body>
</HTML>
Modul 9:
Modül 8: ASP.NET ile Kod Geliştirmek
Bu modülde Visual Studio .NET ortamı içerisinde ASP.NET uygulamalarının
kullanım yollarını öğreneceksiniz.
Bu modül tamamlandıktan sonra:
•
Inline ve Code Behind kod yazmayı öğrenecek,
214
Modül 8: Asp.Net ile Kod Geliştirmek
•
Client Side – Server Side olay prosedürlerini öğrenecek,
•
Page Event yaşam döngüsünü tanıyacaksınız.
Konu 1: Kod Yazmak
Web Form içerisinde kullanılan kontrollere ait HTML kodları ve bu kontrollere
ait Visual Basic .NET kodları bulunur. Web Formların en önemli özelliği ise,
tasarım ve kod ara yüzlerinin ayrı tutulmasıdır.
Web Forma kod eklemek için üç yol izlenir:
•
Mixed Code: Bu metotta web içeriği ile kod aynı sayfa içerisinde yazılır.
Bu metot pek tercih edilmez çünkü okunması ve düzenlenmesi zordur.
•
Inline Code: Web içeriği ile kod aynı sayfa içerisinde yer alır. ASP.NET
kodu Script etiketi içerisine yazılır.
•
Code-behind: HTML içeriği ve Visual Basic .NET kodu tamamen ayrı
dosyalarda tutulur. Kod dosyasına code-behind sayfası denir. Bu metot
Visual Studio .NET ortamının varsayılan çalışma şeklidir.
215
Konu: 1
Inline Kod Yazmak
Aynı .aspx dosyası içinde HTML kodu ve Visual Basic .NET kodu ayrı
bölümlere yazılır. Bölümlerin ayrı tutulması okunabilirliği arttırır. Server taraflı
kodlar Script etiketi içersine yazılmalıdır ve runat=”server” özelliği
belirtilmelidir.
Kod 8.1: Inline Kod Yazmak
<%@ Page Language="C#" %>
<html>
<head>
<title>My First Web Form</title>
<script runat="server">
private void Page_Load (Sender As Object , e As EventArgs )
{
Message.Text = "Inline Kod Yazdık";
}
</script>
</head>
<body>
<form runat="server">
<asp:Label id="Message" runat="server" />
</form>
</body>
</html>
216
Modül 8: Asp.Net ile Kod Geliştirmek
Code-Behind Kod Yazmak
Visual Studio .NET ortamının kullandığı varsayılan model code-behind tasarım
modelidir. Programlama ve tasarım sayfaları ayrı tutularak çalışma mantığına
göre ayrım yapılmış olur. Code-behind sayfaları, .aspx uzantılı sayfanın
sonuna .cs eklenerek isimlendirilir. Webform1.aspx sayfasının code-behind
sayfası, WebForm1.aspx.cs şeklindedir.
Form üzerinde bir kontrole çift tıklandığında code-behind sayfası açılır ve o
kontrole ait olay için metot tanımlanır.
Code-behind sayfasının .aspx sayfasıyla birlikte çalışabilmesi için, .aspx
sayfasının Page bildiriminde, CodeBehind ve Src özelliklerine ilgili değerlerin
girilmesi gerekir.
Kod 8.2: WebForm.aspx - Code-behind kod yazmak
<%@ Page Language="c#" AutoEventWireup="false"
Codebehind="WebForm1.aspx.cs"
Inherits="ilkAspNet.WebForm1"%>
<HTML>
<HEAD>
<title>BilgeAdam</title>
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<asp:TextBox id="txtAd" runat="server"/>
<asp:Button id="btnGonder" runat="server"
Text="Gönder"></asp:Button>
<asp:Label id="lblMesaj" runat="server"></asp:Label>
217
Konu: 1
</form>
</body>
</HTML>
Kod 8.3: WebForm.aspx.cs – Code-Behind Sayfası
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.TextBox txtAd;
protected System.Web.UI.WebControls.Label lblMesaj;
protected System.Web.UI.WebControls.Button btnGonder;
private void Page_Load(object sender, System.EventArgs e)
{
Response.Write("Selam");
}
private void Button1_Click(object sender, System.EventArgs e)
{
lblMesaj.Text = "Hoşgeldin " +
txtAd.Text.ToString();
}
Codebehind
Code-behind sayfasının ismini temsil eder. Visual Studio .NET platformunun
dosyayı birleştirebilmesi için gereklidir.
Src
Code-behind sayfasının ön derleme işleminden geçmediği durumlarda bu
özellik kullanılır. Code-behind sayfasının ismini temsil eder.
218
Modül 8: Asp.Net ile Kod Geliştirmek
Konu 2: Client Side(İstemci Taraflı) Olay
Prosedürleri
Client-side olay prosedürleri, web forma istekte bulunan kullanıcı bilgisayarı
üzerinde işlenen olaylardır. Kullanıcı tarafında oluşan bu olaylar, sunucuya
hiçbir bilgi göndermezler. Çünkü istemci tarafındaki Internet tarayıcısı kodu alır
ve işler.
Client-side olay prosedürleri yalnızca HTML kontrolleri tarafından kullanılır.
Client-side olay prosedürleri hiçbir zaman sunucu kaynağı kullanmaz. Örneğin
SQL Server veritabanına erişmek için client-side kod kullanılamaz.
Client-side olay prosedürlerini, istemci tarafında kısa zamanda oluşması
istenilen olaylar için kullanılır. Örneğin, metin kutusuna girilen değerin
doğruluğunu kontrol etmek için client-side kod kullanılabilir.
Client-side kodlar <Script> blokları içerisinde tanımlanır. Örnekte JavaScript
ile istemci tarafılı kod tanımlanmaktadır.
<SCRIPT language=”JavaScript”>
</SCRIPT>
219
Konu: 1
Konu 3: Server Side(Sunucu Taraflı) Olay
Prosedürleri
Server-side olay prosedürleri, sunucu üzerinde çalışan olaylardır. Server-side
olay prosedürleri client-side olay prosedürlerinden oldukça güçlüdür.
Server-side olay prosedürleri, web sunucusu üzerinde bulunan derlenmiş
kodlardan oluşur. Web ve HTML server kontrolleri tarafından oluşturulan
olayların, işlenmesinde kullanılır. Client-side olay prosedürleri sunucu
kaynaklarını kullanamazken, server-side olay prosedürleri sunucu kaynaklarını
kullanır.
Server-side olay prosedürleri için aşağıdaki tanımlama yapılır.
<SCRIPT language=”c#” runat=”server”>
Client-side olay prosedürleri ile fare ve klavye olaylarına kod yazılabilir. Serverside olay prosedürleri Click ve Change gibi olaylar için kullanılır. Fare ve
klavye olayları gibi çok sık gerçekleşebilecek olayları desteklenmez.
220
Modül 8: Asp.Net ile Kod Geliştirmek
Olay Prosedürleri Oluşturmak
Visual Studio .NET içerisinde server-side olay prosedürleri iki adım ile
oluşturulur. Birinci adım olay üretecek kontrolu web form üzerine eklemektir.
İkinci adım ise code-behind sayfasına olay prosedurünü eklemektir.
Olay prosedürleri kontrolun ID özelliğine girilen değerden faydalanarak
oluşturulur. Handles anahtar sözcüğü kontrolün hangi olay ile
ilişkilendirileceğini belirler. Handles anahtar sözcüğü ile tek bir olay için birden
fazla olay prosedürü oluşturulabilir.
Örnekte Web form içerisine btn1 isminde bir button yerleştirilmiştir. Eklenen
btn1 kontrolunun, üretilen HTML kodu ve code-behind sayfasına eklenen olay
prosedürü kod 8.4 belirtilmiştir.
Kod 8.4: Button Kontrolüne Click Olayı ile İlişkilendirmek
<asp:Button id=”btn1” runat=”server”/>
‘...
protected System.Web.UI.WebControls.Button btn1
private void btn1_Click(object sender, System.EventArgs e)
{
//…
}
Server olay prosedürlerinin çalışmasını sağlamak için kontrollerin WithEvents
anahtar sözcüğü ile tanımlanması gerekir.
221
Konu: 1
Olay prosedürlerine iki parametre girilmelidir.
•
Sender: Olayı tetikleyen kontrol nesnesidir.
•
EventArgs: Olaya özgü parametreleri içeren nesnedir.
Olay Prosedürlerinde Kontrollerle Etkileşim
Web uygulamalarında, genellikle kontrollerden veri alma ve kontrollere veri
gönderme işlemlerine ihtiyaç duyulur. Server-side olay prosedürleri bu tür zor
işlemlerin kolayca yapılmasını sağlar.
Örnekte txtAd isimli metin kutusuna girilen değer lblMesaj isimli etikete
yazdırılmaktadır.
Kod 8.5: Olay prosedürleriyle Çalışmak
<asp:TextBox id=”txtAd” runat=”server” />
<asp:Button id=”btn1” runat=”server”/>
<asp:Label id=”lblMesaj” runat=”server” />
private void Page_Load(System.Object sender,
System.EventArgs e)
{
Button1.Click +=new EventHandler(btn1_Click);
}
private void btn1_Click (ByVal sender As System.Object, _
ByVal e As System.EventArgs)
{
string mesaj = “Merhaba ” + txtAd.Text.ToString();
lblMesaj.Text = Mesaj;
}
222
Modül 8: Asp.Net ile Kod Geliştirmek
Konu 4: Sayfa Yaşam Döngüsü
Bir ASP.NET sayfası belirli olaylar sırası ile çalışır. Bu sıraya “Sayfa Yaşam
Döngüsü” denir
Bu döngü olayları aşağıdaki sırada gerçekleşir.
1- Page_Init (Page Initialize – Sayfanın oluşmaya başlaması): Bu
aşamada sayfa başlatılır ve sayfadaki kontroller oluşturulur.
2- Page_Load (Sayfanın yüklenmesi): Bu olay, sayfa yüklendiği zaman
tetiklenir.
3- Control Events (Kullanıcı kontrol olayları): Click ve Change
olaylarıdır. Bu olaylar kontrollerin tıklanması veya kontrol değerlerinin
değişimi ile tetiklenir. TxtAd_Changed ve Btn1_Click gibi.
4- Page_Unload (Sayfanın Kapanması): Bu olay, sayfa kapandığı zaman
tetiklenir.
Page Event yaşam döngüsü sonlandığında sayfaya ait bilgiler hafızadan silinir.
Kontrol olaylarının çoğu, sayfa sunucuya geri gönderilene kadar
gerçekleşmez. Örneğin Click olayı ile form sunucuya gönderilmeden Change
olayları gerçekleşmez.
223
Konu: 1
Response.Redirect
Kullanıcıyı bir sayfadan başka bir sayfaya yönlendirmek için kullanılır.
HyperLink kontrolü gibi sayfalar arasında dolaşmayı sağlar. Parametre olarak
gidilecek sayfanın adresini belirtilir.
Örnekte
Response.Redirect
gerçekleştirilmektedir.
metodu
ile
yönlendirme
işlemi
Kod 8.6: Response.Redirect
private void ListBox1_SelectedIndexChanged(object sender,
System.EventArgs e)
{
}
Response.Redirect(ListBox1.SelectedValue);
<asp:ListBox id="ListBox1" runat="server"
AutoPostBack="True">
<asp:ListItem
Value="http://www.yahoo.com">yahoo
</asp:ListItem>
<asp:ListItem
Value="http://www.google.com">google
</asp:ListItem>
</asp:ListBox>
224
Modül 8: Asp.Net ile Kod Geliştirmek
Postback İşlemleri
Sunucuya veri gönderme işlemine “postback” denir. Örneğin Button kontrolü
tıklanınca otomatik olarak sunucuya veri yollanır.
Varsayılan olarak veri yollayan tek kontrol Button kontrolüdür. Diğer kontroller
için AutoPostBack özelliğinin True yapılması gerekir.
Örnekte DropDownList kontrolunun AutoPostBack özelliğine True değeri
girilmiştir. Bu durum liste kutusundan seçilen değerin sunucuya gönderilmesini
sağlar.
Kod 8.7 DropDownList Kontrolunun Sunucuya Gönderilmesi
<asp:DropDownList id="DropDownList1"
runat="server" AutoPostBack=”True”>
<asp:ListItem>Türkçe </asp:ListItem>
<asp:ListItem>İngilizce</asp:ListItem>
</asp:DropDownList>
<asp:TextBox
id=”mesaj” runat=”server”/>
private void DropDownList1_SelectedIndexChanged(object
sender, System.EventArgs e)
{
mesaj.Text = DropDownList1.SelectedItem.Value;
}
225
Konu: 1
Page.IsPostback
Page Load olayı, sayfa yüklendiği zaman gerçekleşir. Sayfaya yapılan her
istekte Page Load olayı içindeki kodlar çalışır. Aynı sayfanın her seferinde
yeniden çalıştırılması, istenilen bir durum değildir.
Page.IsPostback özelliği ile, sayfanın Load olayı içindeki kodlar sadece bir
kez çalıştırılır. Böylece sayfa yeniden çağrıldığında bu işlemler gerçekleşmez.
Örnekte Page.IsPostBack özelliğinin kullanımı gösterilmektedir.
Kod 8.8: Page.IsPostBack
private void Page_Load(System.Object sender,
System.EventArgs e)
{
//Put user code to initialize the page here
if(!Page.IsPostBack)
{
//sadece sayfanın ilk yüklendiğinde çalışan istenilen
alan
}
//sayfa her yüklendiğinde çalılşan alan
}
Modül Özeti
226
Modül 8: Asp.Net ile Kod Geliştirmek
21.
22.
23.
24.
25.
Web form içerisinde kod yazmak için hangi yöntemler kullanılır?
Code-Behind kod yazma tekniğini açıklayın?
Sayfa yaşam döngüsünü açıklayın?
Response.Redirect niçin kullanılır?
Page.IsPostBack niçin kullanılır?
Lab 1: ASP.Net ile Kod Geliştirmek
Bu uygulamada, Code Behind ve Inline kod yöntemlerinin kullanımını
öğreneceksiniz. Ayrıca istemci taraflı skriptlerin yazılımını öğreneceksiniz.
Bu lab tamamlandıktan sonra:
•
Code Behind kod yazma yöntemini öğrenecek,
•
Inline kod yazma yöntemini öğrenecek,
•
İstemci taraflı skriptlerin kullanımını öğreneceksiniz.
Web uygulaması oluşturmak
Bu uygulamada kullanılacak ASP.Net Web Application projesini oluşturun.
14. File menüsü altından New alt menüsünü işaret edin ve Project
komutunu tıklayın.
15. New Project ileti kutusundan “ASP.Net Web Application” şablonunu
seçin.
16. Location metin kutusuna “http://localhost/AspCode” yazın.
227
Konu: 1
17. Enter butonu tıklayın.
Web Form eklenmesi
AspCode projesine Test isminde yeni bir web form ekleyin.
Form üzerine, tablodaki kontrolleri ekleyin belirtilen özelliklerini ayarlayın.
Kontrol – Kontrol İsmi
Özellik
Değer
Button – btnCodeBehind
Text
Code Behind
Button – btnInline
<INPUT type="button">
Text
Inline
Value
Java script
Kodların yazılması
1- btnCodeBehind kontrolunun Click olayına “Code Behind” yazan kodu
yazin. Bu kod code behind yöntemi ile btnCodeBehind kontrolunun click
olayını çalıştırır.
Response.Write("Code Behind")
2- Test web formunun HTML bölümüne aşağıdaki kodları yazın. Bu kod,
inline kod yöntemi ile btnInline butonunun Click olayını çalıştırır. Bu kodu
<Body>..</Body> etiketleri arasına ekleyin.
<script language="c#" runat="server">
private void btn_Click(object sender, System.EventArgs e)
{
Response.Write("Inline");
228
Modül 8: Asp.Net ile Kod Geliştirmek
}
</script>
3- Test web formunun HTML bölümüne aşağıdaki kodları yazın. Bu kod,
Java Script ile istemci taraflı kod tanımlamaktadır. . Bu kodu
<Head>..</Head> etiketleri arasına ekleyin.
<script language="javascript">
function mesaj()
{
alert('Hello World')
}
</script>
Fonksiyonu çağırmak için <Body>..</Body> etiketleri arasına aşağıdaki kodu
ekleyin.
<INPUT style="Z-INDEX: 103; LEFT: 24px; WIDTH: 112px;
POSITION: absolute; TOP: 88px; HEIGHT: 24px"
type="button" value="Java Script" onclick="mesaj()">
Modul 9:
Modül 9: Web Programlamaya Giriş
Web uygulamalarını zenginleştiren birçok programlama dili bulunur. Web
sayfalarını geliştirmek için HTML dilinin kullanılması gerekir. Sadece HTML
kullanımı statik (sabit) sayfalar geliştirmek için yeterlidir. Ancak içeriği kolayca
şekillendirmeyi sağlayan CSS dili, istemci taraflı çalışan kodların yazılması için
Javascript – VBScript dilleri de Web uygulamalarını zenginleştirir.
230
Modül 9: Web Programlamaya Giriş
Bu modül tamamlandıktan sonra:
•
HTML nesnelerini öğrenecek,
•
Javascript ve VBScript dilleri ile istemci taraflı kod yazabilecek,
•
CSS ile sayfalara özel stiller kazandıracaksınız.
Konu 1 : Web Programlamaya Giriş
İstemci ve sunucu tarafında çalışan çeşitli teknolojiler mevcuttur. Bir Web
sayfası tasarlamak için kullanılan ortak dil HTML dilidir. Ancak HTML sayfaları
içinde, sunucu tarafında ve kullanıcı tarafında çalışabilen ayrı web
programlama dilleri kullanılabilir. Örneğin JavaScript, kullanıcı tarafında
kodlama imkanı sunarken, CGI, ASP, Php, Perl, ASP.NET gibi web
programlama dilleri, sunucu tarafında kod yazma imkanı sunar.
Konu 2: HTML
HTML (Hyper Text Markup Language), bir işaretleme dilidir. İstemci tarafında
çalışan Internet tarayıcısı tarafından okunur, yorumlanır ve alınan işaretler
neticesinde ekrana ilgili görüntü yansıtılır.
HTML, HTTP (HyperText Transfer Protocol) ile bir arada çalışır. Bu işaretleme
dili ile oluşturulmuş dökümanlar yalnızca istemci tarafında çalışır.
231
Konu: 1
HTML dökümanlarının tümü ASCII karakterlerinden oluşur ve herhangi bir
metin editöründe yazarak oluşturulabilir.
HTML Yapısı
HTML dilini oluşturan bileşenler
•
Tag (etiket)
•
Attribute (nitelik)
•
Value (değer) olarak tanımlanır.
HTML kodlarının temeli etiketlerdir. Bir etiket, HTML’e yapılması istenen bir
olayın bildirimini temsil eder. Etiketlerin içerisine attribute adı verilen değerler
girilir. Etiketlere ait değişik özellikler, attribute nesnelerinde saklanır.
Attribute değerleri, olaylara ait ayrıntıları tutar. Value ise, bir attribute
değerinin davranacağı tarzı belirler.
Tag
Etiketler (Tag), <> işaretleri arasında yazılır. Semboller ve etiket arasında
boşluk yoktur.
<Html>
Bir etikete ait açma ve kapatma ifadeleri vardır. Açma ifadesi <Html>,kapatma
ifadesi ise </Html> şeklinde bildirilir. Yani açılan bir etiket, aynı isim başına /
işareti getirilerek kapatılır. Örneğin <P> etiketi,bir paragraf açmaya yarar. </P>
232
Modül 9: Web Programlamaya Giriş
Kapatma ifadesi kullanıldığında ise bu kapatma ifadesinin kullanıldığı yere
kadar olan bölüm paragrafın , içine dahil edilir. Ancak bazı istisnalarda vardır.
<Img> ve <Br> etiketi gibi bazı etiketler için bir kapatma ifadesi yoktur.
HTML etiketlerinde büyük harf, küçük harf duyarlılığı yoktur.
Attribute
Öznitelikler (Attribute), bir etikete ait özellikleri belirler. <html> etiketi ve
</html> kapatma etiketi, HTML belgesinin başladığı ve bittiği yeri belirtir ve
Attribute değerine ihtiyacı yoktur. Attribute olmadan çalışan etiketlerin
yanı sıra, attribute ile birlikte çalışan etiketler de vardır. <body> etiketi,
görüntülenecek alanın başlangıcını ve bitişini
bildirir. Bu etiket, hiçbir attribute tanımlanmadan çalışabilir. Görüntülenecek
alana bir arka plan rengi tanımlamak istediğinizde bgcolor veya
görüntülenecek yazı tipini tanımlamak istediğinizde text özniteliklerine
değerler atanmalıdır.
</body> kapatma ifadesi ile
Aşağıdaki örnekte siyah zemin üzerine beyaz yazı yazılmaktadır.
<Body bgcolor=”#000000” text=”#ffffff”>
233
Konu: 1
Value
Bir olayın ne şekilde gerçekleşeceği value ile bildirilir. Örneğin bir paragraflık
metinin hizalanması, <DIV> etiketi kullanılarak yapılır. DIV etiketinin align
attribute değeri, left, right, center ve justify değerlerinden birini
alır.
234
Modül 9: Web Programlamaya Giriş
HTML Belgesi Nasıl Oluşturulur?
HTML belgeleri tag, attribute ve value bileşenleri kullanılarak oluşturulur.
Bir HTML belgesi en basit şekilde kod 9.1’de gösterilmiştir.
Kod 9.1:Temel HTML Belgesi
<html>
<head>
<title> Temel HTML Belgesi </title>
</head>
<body>
Sayfada kullanılacak herşey burada bildirilir.
</body>
</html>
<html>…</html>, Tarayıcıya HTML belgenin başladığı ve bittiği alanı bildirir.
<head>…</head>, Tarayıcıya HTML belge hakkında bilgi verir. <title> ve
<meta> etiketleri <head>…</head etiketleri arasında yer alır.
<title>…</title>, belgenin başlık yazısını tutar.
<body>…<body>, belgenin gövde bölümüdür. Sayfada görüntülenmesi istenen
tüm değerler burada bildirilir.
235
Konu: 1
En Sık Kullanılan Etiketler
Başlıklar
Bir sayfadaki yazının başlıklarını standart şekilde tutmak için HTML başlıkları
kullanılır. Başlıklar 1 ve 6 arası değerler alır.
Kod 9.2: HTML Başlık Etiketleri
<html>
<head>
<title>Başlık Etiketleri</title>
</head>
<body>
<h1>html başlıkları</h1>
<h1>Bu başlık H1 tag'i ile
<h2>Bu başlık H2 tag'i ile
<h3>Bu başlık H3 tag'i ile
<h4>Bu başlık H4 tag'i ile
<h5>Bu başlık H5 tag'i ile
<h6>Bu başlık H6 tag'i ile
</body>
</html>
oluştu</h1>
oluştu</h2>
oluştu</h3>
oluştu</h4>
oluştu</h5>
oluştu</h6>
Paragraf ve Satır Sonu
<p>... </p> etiketleri arasında paragraflar tanımlanır. Paragrafta, satır sonunu
bildirmek için <br> etiketi kullanılır.
236
Modül 9: Web Programlamaya Giriş
Sayfalara Bağlantı Vermek
Birden fazla sayfayı birbirine bağlamak için sayfa bağlantıları kullanılır.
Bir sayfada başka bir sayfaya bağlantı verebilmek için
•
<a> etiketi yazılır,
•
<a ifadesinden sonra href attribute değerine bağlantı verilecek
sayfanın adresi girilir,
•
Target attribute değerine bağlantı sayfasının nasıl bir sayfada
görüntüleneceği bilgisi girilir. (Varsayılan olarak _self değeri alınır. Yani
kendi sayfasında açılır.)
•
> karakteri ile <a> etiketi sonlanır. Bağlantının açılması için tıklanması
gereken metin girilir.
•
Ve metin bitimine </a> etiketi yerleştirilir.
Kod 9.3: Sayfa içinde Bağlantı Vermek
<a href="http://www.bilgeadam.com" target="_blank">BilgeAdam
BTA</a>
Listeler
Belge içinde metine liste görünümü vermek için listeleme etiketleri kullanılır.
Sırasız ve sıralı listeler oluşturulabilir. Sırasız listeler, <ul>...</ul> etiketleri
arasında oluşturulur. Her bir liste nesnesi için <li> etiketi kullanılır.
Sıralı listeler, <ol>...</ol> etiketleri arasında oluşturulur. Her bir liste
nesnesi için <li> etiketi kullanılır.
Kod 9.4: Liste Oluşturmak
<h4> Sıralı liste</h4>
<ol>
<li>nesne 1
<li>nesne 2
</ol>
<h4>Sırasız Liste</h4>
<ul>
<li>nesne 1
<li>nesne 2
</ul>
Sıralı ve sırasız listelerin dışında programcı tarafından tanımlı listeler
oluşturulabilir. <dl>...</dl> etiketleri arasında listelenecek metinler girilir. Bu
etiketler arasına, başlığı tutan <dt> etiketi ve başlık altında görüntülenecek
metini tutan <dd> etiketi yerleştirilir.
237
Konu: 1
Kod 9.5: Tanımlı Liste Oluşturmak
<dl>
<dt> Başlık 1:
<dd> Başlık 1'e ait açıklama bu paragrafta girilir.Başlık
1'e ait açıklama bu paragrafta girilir.
<dt> Başlık 2:
<dd> Başlık 2'ye ait açıklama bu paragrafta girilir.
Başlık 2'ye ait açıklama bu paragrafta girilir.
</dl>
NOT: Listeleme ifadeleri iç içe kullanılabilir.
Resim Görüntüleme
HTML sayfalarında resim görüntülemek için <img> etiketi kullanılır. src
attribute değeri, görüntülenecek resmin adresini tutar.
Kod 9.6’da <img> kullanımı gösterilmektedir.
Kod 9.6: Resim Görüntülemek
<a href="http://www.bilgeadam.com">
<img src="c:\resimler\resim1.jpg">
</a>
img etiketinin sonlandırma ifadesi yoktur.
Tablolar
Satır ve sütünlardan oluşan yapılara tablo denir. Bir Web sayfası içerisinde,
görünümü belirli sınırlarda tutmak için tablolardan yararlanılır.
<table>...</table> etiketleri ile tablonun başlangıç ve bitiş alanı bildirilir. Bu
etiketler arasındaki, <tr> satırları, <td> ise sütunları temsil eder. Tablonun
align , border, width, height bgcolor attribute değerleri ile tabloya
çeşitli nitelikler verilebilir. Align attribute nesnesi center, left veya right
hizalama değerini alır. Border tablo kenarlıklarının kalınlık değerini tutar.
Kod 9.7: 4x3 Boyutlarında Tablo oluşturmak
<table width="140" border="2" bgcolor="#6633CC"
align="left">
<tr>
<td>1. satır 1. sütun</td>
<td>1. satır 2. sütun </td>
<td>1. satır 3. sütun </td>
</tr>
<tr>
<td>2. satır 1. sütun </td>
<td>2. satır 2. sütun </td>
<td>2. satır 3. sütun </td>
</tr>
<tr>
238
Modül 9: Web Programlamaya Giriş
<td>3.
<td>3.
<td>3.
</tr>
<tr>
<td>4.
<td>4.
<td>4.
</tr>
</table>
satır 1. sütun </td>
satır 2. sütun </td>
satır 3. sütun </td>
satır 1. sütun </td>
satır 2. sütun </td>
satır 3. sütun </td>
Konu 3: Script Nedir?
HTML dosyası içine gömülmüş kodlara script denir. Yorumlanması için internet
tarayıcısına ihtiyaç vardır. HTML dilinin karşılayamadığı bazı ihtiyaçlara çözüm
üretmek için scriptler kullanılır.
239
Konu: 1
JavaScript
JavaScript dili, Netscape firması tarafından oluşturulmuştur. Yazım biçimi
olarak C dili esas alınarak tasarlanmıştır. Amaç olarak HTML’in yetmediği
yerlere script’ler ile destek vermesi düşünülmüştir. Web programcılığına
dinamik bir yapı kazandıran JavaScript, istemci tarafında çalışır. Kullanımı
giderek yaygınlaşan JavaScript, daha sonra Microsoft firmasının Internet
Explorer web tarayıcısında da kullanılabillir hale geldi. Günümüzde tüm
tarayıcıların desteklediği bir script dilidir.
JavaScript kodları yazmak için Notepad gibi bir metin editörü yeterlidir. Kodlar
<script>...</script> etiketleri arasında yazılmalıdır.
Bu kod alanı içinde yorum satırları için // ve /* ... */ ifadeleri kullanılabilir.
Sadece bir satır yorum satırı yapılacaksa // ifadesi kullanılır.
// bu satır yorum satırıdır.
Birden fazla satır yorum satırı yapılacaksa, satırların başladığı yere /*, bittiği
yere */ ifadeleri yerleştirilir.
/*
yoruma alınan 1. satır
2. satır
...
*/
JavaScript kodları HTML sayfaları içine <head> etiketlerine gömülü olarak veya
.js uzantılı dosyalara referans gönderilerek HTML içinden çağrılabilir.
240
Modül 9: Web Programlamaya Giriş
JavaScript dilinde nesneler, nesnelere uygulanan olaylar ve olaylara ilişkin
görevler vardır. Bir nesneyi tıklamak, üzerine gelmek, üzerinde dolaşmak gibi
işlemler, sayfa ile kullanıcının etkileşimli olarak çalışmasını sağlar.
JavaScript, aynı bir programlama dilinde olduğu gibi değişkenlere, klavyeden
bilgi alma, ekrana çıktı verme işlemlerine, koşul ve döngü yapılarına,
fonksiyon, nesne ve olay kavramlarına sahiptir.
Kod 9.8: Örnek JavaScript
<html>
<head><title>onClick</title>
<script language="javascript">
function merhaba()
{
alert ("beni tikladiniz");
}
</script>
</head>
<body>
<input type="button" name="tikla" value="tikla"
onClick=merhaba()>
</body>
</html>
script etiketinin language attribute değeri ile kullanılacak script dili belirtilir.
Javascript kullanılması için burada language=”javascript” bildirimi yapılır.
Kod 9.9: Örnek JavaScript
<html>
<head>
<title>JavaScript Örneği</title>
</head>
<body>
<br> Bu yazı html ile yazıldı.
<br>
<script language="JavaScript">
document.write("İşte bu ise JavaScript ile yazıldı!")
</script>
<br>
Bu yazı yine HTML ile yazıldı.
</body>
</html>
Buradaki script ifadesi head etiketleri arasında bir fonksiyon olarak değil,
body etiketleri arasında satır halinde kullanılmıştır.
Değişkenler
var anahtar sözcüğü ile yeni bir değişken oluşturulur. Tür bilgisi saklanmaz.
Sayısal değerler verildiğinde işlem yapma yeteneğine sahip olurlar. Çift tırnak
içerisinde değer verildiğinde ise metin ifadesi olarak anlaşılır.
241
Konu: 1
Dikkat edilmesi gereken nokta değişkenlerin küçük – büyük harf duyarlı
olmasıdır. Bazı tarayıcılar için değişken isimlerinde bu duyarlılık göz önünde
bulundurulmazken, çoğu tarayıcıda küçük – büyük harf duyarlılığına dikkat
edilir. Bu nedenle her değişken adı bu durum göz önünde bulundurularak
verilmelidir.
var
var
var
var
var
deger1;
deger2=20;
deger3=30;
ay=”Mayıs”;
yil=”2005”;
var degerToplam=deger2+deger3;
var tarih=ay+yil;
Satırın sonunda sonlandırma karakteri olarak ; kullanılır. degerToplam isimli
değişkende 20 ve 30 değerleri toplanarak elde edilen 50 değeri tutulurken,
tarih isimli değişkende, ay ve yil değişkenlerinden gelen metin ifadeleri
birleştirilir ve “Mayıs2005” değeri oluşturulur.
Koşul Operatörü
[koşul ifadesi] ? koşul_doğru_ise : koşul_yanlış_ise
Değişken tanımlarken aritmetik, karşılaştırma ve mantıksal operatörler
kullanılabilir. Bunlara ek olarak C dilinden gelen koşul operatörleri kullanılabilir.
Bir if deyiminin tek satırda yazılmış haline benzeyen bu operatörün kullanımı
kod 3.1.1’de gösterilmiştir.
Genel kullanım biçimi ise
[koşul ifadesi] ? koşul_doğru_ise : koşul_yanlış_ise
şeklindedir.
Kod 9.10: Koşul Operatörünün Kullanımı
var
var
var
var
var
a=5;
b=7;
c=14;
d=23;
e;
e = (a + b < c) ? d : a+b ;
Bu kodda, (a + b < c ) ifadesi ile elde edilen sonuca göre, e değerine d
veya a + b değerleri atanır.
a + b işleminin sonucu olan 12 değeri, c değerinden küçük olduğu için ifade
doğru olarak sonuçlanır. Bu durumda d değeri, e değişkenine atanır ve e
değişkeni 23 değerini taşır.
Bu koşulu if deyimi ile yazılabilir.
if (a + b < c)
e = d;
else
242
Modül 9: Web Programlamaya Giriş
e = a+ b;
Operatörler
JavaScript operatörleri, Visual Basic .NET dilinde kullanılan operatörlerden
biraz farklıdır. Örneğin mod almak için Mod anahtar sözcüğü yerine % mod alma
operatörü kullanılır.
Atama Operatörü ( = )
Değişkenlere değer atamak için = karekteri kullanılır.
Aritmetik Operatörler
Değişkenler üzerinde aritmetik işlemler yapmak için tanımlanmış operatörlerdir.
Operatör
Açıklama
+
Sayısal değişkenleri toplar. String
değişkenlerini birbirine ekler.
-
Sayısal değişkenlerde çıkarma
işlemi yapar.
*
Sayısal değişkenlerde çarpma
işlemi yapar.
/
Sayısal değişkenlerde bölme işlemi
yapar.
%
Sayısal değişkenlerde mod alma
işlemini yapar.
++
Sayısal değişkenlerde artma
işlemini yapar.
--
Sayısal değişkenlerde azalma
işlemini yapar.
Tablo 9.1: Aritmetik Operatörler
Visual Basic .NET aritmetik operatörlerinden farklı olan ++ ve -- operatörleri, C
dili operatörlerindendir. Değişkeni bir arttırma veya bir azaltma yeteneğine
sahiptir. Prefix (değişken isminin önünde) ve subfix (değişken isminin
arkasında) olmak üzere iki kullanım şekli vardır.
Değişkenin prefix kullanımı kod 9.11 de gösterilmektedir.
Kod 9.11: Prefix ++ operatörü
var x = 5;
// x değişkeni bir arttırılır ve ekrana 6 değeri yazılır
document.write(++x);
243
Konu: 1
Değişkenin subfix kullanımında ise önce değer alınır, akış bir sonraki satıra
geçtikten sonra değişkenin değeri bir arttırılır.
Kod 9.12: Subfix ++ operatörü
var x = 5;
/* x değişkeni önce yazılır, sonra bir arttırılır.
Yani ekrana 5 yazılır. */
document.write( x++);
// Ekrana 6 değeri yazılır.
document.write(x);
Karşılaştırma Operatörleri
JavaScript kodları içerisinde de karşılaştırma işlemleri yapılabilir. Ancak bu
operatörler Visual Basic .NET karşılaştırma operatörlerinden biraz farklıdır.
Operatör
Açıklama
==
Eşit midir? operatörü. İki değer de
birbirine eşit ise true sonucu verir.
!=
Eşit değil midir? operatörü. İki
değer birbirine eşit değilse true
sonucunu verir.
<
Küçük operatörü. Sol taraf değeri,
sağ taraf değerinden küçükse true
sonucunu verir.
>
Büyüktür operatörü. Sol taraf
değeri, sağ taraf değerinden büyük
ise true sonucunu verir.
<=
Küçük eşittir operatörü.
>=
Büyük eşittir operatörü.
Tablo 9.2: Karşılaştırma Operatörleri
İki değerin eşitliğinin karşılaştırılması için == operatörü kullanılır.
if (a == b) {
document.write(“a ile b değişkeni eşit”)
}
İki değerin eşitsizliğinin karşılaştırılması için != operatörü kullanılır.
if (a != b) {
document.write(“a ile b değişkeni eşit değildir”)
}
Mantıksal Operatörler
Mantıksal operatörler ise Visual Basic .NET mantıksal operatörlerinden
tamamen farklıdır.
244
Modül 9: Web Programlamaya Giriş
Operatör
Açıklama
&&
And (ve) operatörü. İki tarafta
belirtilen ifadeler true ise, sonuç
olarak true değerini döndürür.
||
Or (veya) operatörü. İki tarafta
verilen ifadelerden en az birinin
doğru olması durumunda true
değerini döndürür.
!
Not operatörü: Koşulun yanlış
olması durumunda true değerini
verir.
Tablo 9.3: Mantıksal Operatörler
Visual Basic .NET programlamada And operatörünün karşılığı && operatörüdür.
Or operatörünün karşılığı ise || operatörüdür. Bir değerin değili anlamına
gelen Not operatörünü karşılığı ise ! operatörüdür.
Klavyeden Bilgi Alma ve Ekrana Çıktı Verme
JavaScript dilinde kullanıcıdan bilgi almak için formların dışında promt komutu
kullanılır. promt komutu ile kullanıcıdan bilgi alırken ayrı bir pencere açılır.
prompt(“soru”, “cevap için rehber ifade”);
Kod 9.13: Prompt ile kullanıcıdan değer almak
var sehir;
sehir=prompt(“Yaşadığınız şehrin trafik kodunu giriniz”,
“İstanbul için 34, Ankara için 6 gibi”);
JavaScript dilinde HTML sayfasına yazı yazdırmak için write komutu kullanılır.
document.write(“Yazılmak istenen değişkene ilişkin
açıklama”, degisken);
Görüldüğü gibi write komutu document fonksiyonuyla birlikte kullanılır.
Koşul ve Döngü Yapıları
Programlamanın akışını yönlendiren koşul yapıları ve döngülerdir. Döngüler
birden fazla gerçekleştirilecek işlemlerin blok halinde yazılmasını sağlar.
if koşul ifadesinin genel yapısı
if ( koşul )
// koşul doğru ise çalışacak ifade
// koşul yanlış ise akışın devam edeceği alan
245
Konu: 1
Koşulun doğru olması halinde yapılacak işlemler bir satırdan fazla yer
tutuyorsa, bu satırlar {} parantezleri ile gruplanır. Visual Basic .NET dilindeki
gibi End if ifadesi kullanılmaz.
if (koşul) {
//koşul doğru ise
}
else {
//koşul yanlış ise
}
Tekrarlanan belirli bir işlemi yaptırmak için kullanılan döngülerin JavaScript
dilindeki kullanımı tamamen C dilinin yapısına göre tasarlanmıştır.
for döngüsünün genel kullanım biçimi;
for(başlangıç_değeri; döngü_ifadesi; değişecek_değişken_adı)
{
//yapılacak işlemler
}
şeklindedir.
Kod 9.14: For Döngüsünün Kullanımı
var a;
var b = 10;
for (a = 1; a <= b; a++) {
document.write( a , “. sayı”, “<br>”);
}
while döngüsünün yapısı
while ( döngü_koşul_ifadesi )
{
//şart doğruysa yapılacak işlemler
}
//şart doğru değilse yapılacak işlemler
Visual Basic .NET dilindeki Select Case döngüsüne karşılık olarak JavaScript
dilinde switch-case ifadesi vardır. Genel kullanımı:
switch (parametre)
{
case “ifade1”:
// ifade1 koşulu doğru ise yapılması istenenler
break; //break ile diğer koşulların da çalışması
//engellenir ve döngüden çıkılır.
case “ifade2:”
//ifade2 koşulu doğru ise yapılması istenenler
break;
}
Fonksiyonlar
JavaScript dilinde, kodların yeniden kullanılabilmesi için kullanılır. Genel
kullanımı:
246
Modül 9: Web Programlamaya Giriş
function fonksiyon_ismi(parametre1, parametre2)
{
//yapılacak işlemler
}
Fonksiyon içinde hesaplanan değer, return ifadesi ile geri döndürülür.
Kod 9.15: JavaScript ile Toplama
function topla(deger1, deger2)
{
var sonuc= deger1+deger2;
return sonuc;
}
Topla fonksiyonuna gönderilen deger1 ve deger2 değişkenleri toplanarak,
fonksiyon içinde oluşturulan sonuc değişkenine atanır. return sonuc; ifadesi
ile topla fonksiyonunda elde edilen sonuç geri döndürülür.
JavaScript Nesneleri
JavaScript içinde bazı işlemler, bazı nesnelerin fonksiyonları çağrılarak yapılır.
Örneğin document.write komutu, aslında document nesnesinin write
metodunu çağırır.
Window Nesnesi
Genel pencere özelliklerini tutan nesnedir. Pencere açma ve kapama işlemleri
için bu nesne kullanılır.
Genel kullanımı:
window.open(“ url ”,“pencere_ismi”,“pencere_ozellikleri”);
window.close();
Open komutu ile yeni bir pencere açılırken, close komutu ile pencere kapatılır.
Yeni bir pencere açmak için open komutuna ilk parametrenin girilmesi
zorunludur. Pencere_ismi, birden fazla pencere ile işlem yapıldığı durumlarda
kullanılabilir. Pencereye ait özellikler tablo 9.4’te belirtilmiştir.
Özellik
Açıklama
Menubar
Menu çubuğunun
görüntülenmesini sağlar.
Toolbar
Araç çubuğun
görüntülenmesini sağlar.
Location
Adres çubuğunun
görüntülenmesini sağlar.
Status
Durum çubuğunun
görüntülenmesini sağlar.
247
Konu: 1
Scrollbars
Kaydırma çubuklarının
görüntülenmesini sağlar.
Resizable
Penceresinin
boyutlandırılmasını sağlar.
Width
Açılan pencerenin pixel
genişliğini belirtir.
Height
Açılan pencerenin pixel
yüksekliğini belirtir.
Left
Ekranın sol noktasına ile
pencere arasındaki uzaklığı
verir.
Top
Ekranın üst noktasına ile
pencere arasındaki uzaklığı
verir.
Tablo 9.4: Pencere Özellikleri
Kod 9.16: Yeni bir pencere açma
window.open("http://www.bilgeadam.com", "bilgeadam" ,
"menubar=no, toolbar=no, scrollbars=yes, location=yes,
width=300, heigt=300";)
Internet tarayıcısı ile daha önce ziyaret edilmiş sayfalara tekrar ulaşabilmek için
window.history.go(-1) komutu kullanılabilir. -1 ifadesi ile bir önceki sayfaya
gidilir. Sayı arttırılarak daha önceki sayfalara da gidilebilir.
Internet tarayıcısının en alt kısmında bulunan status penceresine erişmek için
window.status komutu kullanılır.
window.status
=”JavaScript öğreniyoruz!”;
Navigator (tarayıcı) Nesnesi
JavaScript, tarayıcıları da bir nesne olarak değerlendirir. Kullanıcının
tarayıcısına ilişkin bilgileri almak için tablo 3.1.5’te belirtilen değişkenler
kullanılabilir.
Değişken İsmi
Açıklama
appname
Tarayıcı adı
appversion
Tarayıcı versiyonu
appCodeName
Tarayıcının kod adı
userAgent
Tarayıcının sunucuya kendini
tanıtırken verdiği isim.
Tablo 9.5: Navigator (Tarayıcı) Nesnesinin Değişkenleri
Kod 9.17: Tarayıcı nesnesi ile bilgi almak
<html>
248
Modül 9: Web Programlamaya Giriş
<head>
<title>Browser'ımızı tanıyalım</title>
<METAcontent=text/html;CHARSET=iso-8859-9 httpequiv=Content-Type>
<script language="Javascript">
function Tarayici()
{
var browseradi=" ";
browseradi +="Browser:"+navigator.appName +"\r“ ;
browseradi +="Surumu:"+navigator.appVersion +"\r“ ;
browseradi +="Kodadi:"+navigator.appCodeName+"\r“ ;
browseradi +="Useragent:"+navigator.userAgent+"\r“ ;
alert(browseradi);
}
</script>
</head>
<body onLoad="Tarayici()"></body>
</html>
Olaylar
Bir Web sayfası üzerinde kullanıcının her türlü hareketi kontrol edilebilir. Bir
kontrolün üzerine gelmesi, dolaşması ve üzerinden ayrılması gibi hareklere
olay denir. Bu olaylar ise onClick, onMuoseOver, onMouseOut,
onSubmit,onReset, onChange, onLoad, onUnLoad, onError, onAbort,
onFocus, onBlur olarak belirtilebilir.
onClick
Internet sitelerinin çoğunda en sık kullanılan JavaScript olayıdır. Sayfa
üzerinde bir nesnenin fare ile tıklanıp bırakılması sonucunda gerçekleşen
olaydır. Link, button ve resim nesneleri tıklanarak onClick olayı tetiklenebilir.
Nesnelerin etiketlerinde ise onClick olaylarını tetikleyen fonksiyonların ismi
bildirilmelidir.
Kod 9.18: onClick Olayı
function tikla()
{
alert(“Tıklama işlemi gerçekleşti…”);
}
<input type="button" name="tikla" value="tikla"
onClick=tikla()>
Butona tıklanıp bırakıldığında, onClick olayı tetiklenir ve bu olayla
ilişkilendirilen tikla fonksiyonu devreye girer. alert komutu ile ekrana bir
mesaj kutusu çıkar.
Ayrıca onDblClick, çift tıklanma olayını tetikler.
onMouseOver, onMouseOut
Fare nesnenin üzerindeyken onMouseOver, fare nesne üzerinden ayrılınca
onMouseOut olayları devreye girer.
249
Konu: 1
Kod 9.19: onMouseOver ve onMouseOut Olayı
function nesneUzerinde()
{
window.status="Şu anda nesne üzerindesiniz.";
}
function nesneDisinda()
{
window.status="nesnenin dışına çıktınız." ;
}
<a href="http://www.google.com"
onMouseOver = nesneUzerinde()
onMouseOut = nesneDisinda()> Google
</a>
onSubmit
Web safyalarında ziyaretçinin forma bilgi girip sunucuya göndermesi
durumlarında onSubmit devreye girer. Gönderilecek forma girilen verilerin
uygunluğunun kontrolü bu olayın tetiklediği fonksiyonlara yaptırılabilir.
Kod 9.20: onSubmit Olayı
function dogrula()
{
confirm (‘Formu doldurduysanız OK'i tıklayınız');
}
<form action="mail.pl" method="post" onSubmit="dogrula()">
confirm komutu, kullanıcıya Ok ve Cancel butonlarından oluşan bir diyalog
penceresi açar.
onReset
Form içinde kullanılan tüm metin alanlarının temizlenmesini sağlar. Doldurulan
formda yanlışlık olduğunda bu olay tetiklenir. Kullanıcıya onay penceresi
çıkartmak için de kullanılabilir.
Kod 9.21: onReset Olayı
function sil()
{
return confirm('Silmek istediginize emin misiniz?');
}
<form onReset="return sil()">
<input type="text" name="mail">
<input type="reset" value="sil">
</form>
onChange
Bilgi girişi yapılan alanlarda, değişikliğin gerçekleştiği bilgisi onChange olayı ile
tetiklenir.
250
Modül 9: Web Programlamaya Giriş
Kod 9.22: onChange Olayı
function degisti()
{
alert(‘Seçimi değiştirdiniz’);
}
<form method="post">
<p>
<select name="degistir" size="1" onChange="degisti()">
<option>Istanbul
<option>Ankara
<option>Antalya
</select>
</form>
Sunulan seçeneklerden herhangi biri seçidiğinde uyarı penceresi çıkacaktır.
onLoad, onUnLoad
onLoad olayı sayfaya giriş yapıldığında gerçekleşir. onUnLoad olayı sayfadan
çıkıldığında gerçekleşir.
Kod 9.23: onLoad ve onUnLoad Olayı
function giris()
{
alert(“Sayfaya Giriş Yaptınız!");
}
function cikis()
{
alert("Sayfadan çıktınız..");
}
<body onLoad="giris()" onUnload="cikis()">
</body>
onError, onAbort
Ziyaret edilen sayfadaki nesneler, çeşitli nedenlerden dolayı tam olarak
yüklenememiş olabilir. Genellikle resim nesnelerinin yüklenmesinde problem
çıkabilir. Bu tür durumları ziyaretçiye bildirmek için onError veya onAbort
olayları kullanılır.
Kod 9.24: onError ve onAbort Olayı
<img src="resim.gif" onError="alert(‘Resim dosyası
yüklenemedi')">
onFocus, onBlur
onFocus olayı kullanıcı kontrollerine giriş yapılırken gerçekleşir. OnBlur olayı
ise ve kullanıcı kontrollerinden çıkış yapılırken gerçekleşir.
Kod 9.25: onFocus ve onBlur Olayı
function dogru()
{
251
Konu: 1
document.form1.mesaj.value="Lütfen hata yapmayın!";
}
function sor()
{
document.form1.mesaj.value="isminiz alındı";
}
<form name="form1" method="post">
<p><h3>Lütfen isminizi yazınız!</h3></p>
<input type="text" size="20" name="isim"
onfocus="dogru()" onblur="sor()">
<p>
<input type="text" name="mesaj"></p>
</form>
VbScript
VbScript , Microsoft tarafından geliştirilmiştir. Ancak, VbScript tüm tarayıcılar
tarafından desteklenmez. Bu nedenle tüm tarayıcılarda çalışacak script
yazılmak isteniyorsa, JavaScript kullanılmalıdır.
Vbscript dilinin kullanılabilmesi için script etiketi içerisindeki language
özniteliğine vbscript değeri atanır.
<script language="vbscript">...</script>
Kod 9.26: İlk VbScript Örneği
<html>
<body>
<script language="vbscript">
document.write("İlk VBScript!")
</script>
</body>
</html>
Değişken tanımlamaları dim anahtar sözcüğü ile yapılır.
Kod 9.27: Değişken tanımalaması
<html>
<body>
<script language=”vbscript">
dim isim
isim="Bilge Adam"
document.write(isim)
</script>
</body>
</html>
Metot tanımlaması Visual Basic.NET diline benzer. Geriye sonuç
döndürmeyen metotlar Sub, geriye sonuç döndüren metotlar ise function
anahtar sözcüğü ile tanımlanır. Bu tanımlanmış metotlar “call MetotAdı()“
anahtar sözcüğü ile çağrılabilirler.
252
Modül 9: Web Programlamaya Giriş
Kod 9.28: Sub Tanımlaması
<html>
<head>
<script language="vbscript">
sub mySub()
msgbox("sub procedure")
end sub
</script>
</head>
<body>
<script language=”vbscript">
call mySub()
</script>
<p> sub procedure geri dönüş değeri taşımaz.</p>
</body>
</html>
Kod 9.29: Function Tanımlaması
<html>
<head>
<script language=”vbscript">
function sehir()
sehir = "Trabzon"
end function
</script>
</head>
<body>
<script language=“vbscript">
document.write("En sevdiğim sehir: " & sehir())
</script>
<p> function procedure geri dönüş değerine sahiptir.</p>
</body>
</html>
Koşul ve döngü yapılarının kullanımı Visual Basic .NET dilindeki gibidir.
253
Konu: 1
Konu 4: CSS
CSS (Cascading Style Sheets), HTML sayfaları içerisinde özel stiller
tanımlamak için kullanılır. Sayfanın yazı türü, arka plan rengi, link renkleri,
nesnelerin sayfa üzerindeki yerleşimi birer stil öğeleridir. Bir sitedeki tüm
sayfalara aynı stili vemek için CSS dosyaları hazırlanır. Bu CSS dosyaları
HTML sayfalarına dahil edilir.
Stiller HTML sayfalarına üç yöntem ile dahil edilebilir:
•
Inline (iç)
•
Embedded (gömülü)
•
Linked (bağlantılı)
İç (Inline)
Herhangi bir HTML etiketi içinde stil kullanılabilir. Örneğin paragraf etiketine
style=”x” attribute değeri eklenebilir. Ve o paragrafa özel tasarım özellikleri
bildirilebilir.
<p style=”font: 12pt arial”> Bu paragraftaki tüm yazılar
arial 12 stilidedir.</p>
Gömülü (Embedded)
Gömülü stiller, HTML sayfasının Head etiketi içerinde tanımlanır. Bu stilleri
tanımlamak için <Style>..</Style> etiketleri kullanılmalıdır.
254
Modül 9: Web Programlamaya Giriş
Kod 9.30: Gömülü stillerin Tanımlanması
<html>
<head>
<style>
body
{
background:#ff0000;
color:#ffffff;
}
</style>
</head>
<body>
Kırmızı zemin üzerine beyaz renkle yazı
</body>
</html>
Bağlantılı (linked)
Stil verileri .css uzantılı dosyalarda tanımlanır. En güçlü tasarım özelliği
bağlantılı stil dosyalarındadır. Tasarım özellikleri bu dosyada tanımlanır ve her
sayfa içinden bu stil dosyasına bağlantı verilerek etiketlere gerekli stiller
uygulanır.
HTML sayfalarda stil dosyası ile bağlantı kurmak için aşağıdaki tanımlama
yapılır. Bu tanımlama head etiketleri içerisinde yapılır.
<link rel=stylesheet href=”stil.css” type=”text/css”>
Style Sheet’lerin Söz Dizimi
Slide12
Stil nesnelerinin söz dizimi, HTML söz dizimine benzer yapıdadır. Stil
nesnelerinin belirli kısımları vardır:
•
Seçici (Selector): Atanılan özellikler ve değerleri alır. H1 ve P gibi HTML
etiketlerine benzerler.
•
Özellik (Property): Bir seçiciyi tanımlar. P paragraf etiketine verilen
özellikler o seçiciyi tanımlar. Kenar boşlukları, font ve arka plan değerleri
birer özellik öğesidir.
•
Değer (Value): Özellikleri tanımlayan öğelerdir.
Özellikler ve değerler birleşerek bir tanım oluşturur. Seçici ve tanım ise bir kural
oluşturur. Sayfa düzeni ,kenar boşlukları, girinti ve hizalama değerleri kontrol
edilerek hazırlanmış bir site profosyonel bir görünüme sahip olabilir.
En çok kullanılan yazı özellik ve değerleri tablo 4.1’de listelenmiştir.
255
Konu: 1
Özellik ve Değer
Açıklama
Margin-left
Sol kenar boşluğunu belirlemek için kullanılır. Punto,
inç, cm ve piksel cinsinden değer verilir.
{margin-left: 10px;}
Margin-right
Sağ kenar boşluğunu belirlemek için kullanılır.
Margin-top
Üst kenar boşluklarını belirlemek için kullanılır.
text-indent
Bir yazı için girinti bilgisini belirler.
text-align
Yazının hizalanmasını sağlayan değeri tutar. left,
center, right
text-decoration
underline, overline, line-through,
none değerleriyle yazıya şekil verir.
text-transform
Yazının büyük veya küçük harflerle
görüntülenmesini sağlar. Uppercase, lowercase
Tablo 9.6: En çok kullanılan yazı özellik ve değerleri
Body {
margin-left: 10px;
margin-right: 10px;
margin-top: 20px;
margin-bottom:15px;
}
Font özellik ve değerleri tablo 9.7’de belirtilmiştir.
Özellik ve Değer
Açıklama
font-size
Yazı büyüklüğünü belirler.
color
Yazının rengini tutar.
font-family
Yazının tipini belirler.
font-style
Yazının italikliğini belirler. italic, normal.
font-weight
Yazı kalınlığını belirler. Bold, normal
Tablo 9.7: Font özellik ve değerleri
p {
font-size: 20;
color: blue;
font-weight: bold;
font-style: italic;
font-family: Times New Roman;
}
Liste özellikleri ve değerleri tablo 4.3’te belirtilmiştir.
Özellik ve Değer
Açıklama
list-style-type
Liste elemanlarının başına gelecek karakteri belirler.
disc, circle, square, decimal
lower(upper)roman
Liste elemanlarının başına küçük veya büyük Roma
rakamları koyar.
lower(upper)-
Liste elemanlarının başına küçük(büyük) harfler
256
Modül 9: Web Programlamaya Giriş
alpha
koyar.
none
Liste elemanları için bir sembol almaz.
list-styleimage
Liste imleri yerine resim kullanır.
list-styleposition
indise: Listenin ikinci satırını en soldan başlatır.
outside: İkinci satırı bir öncekinin dikey
hizasından başlatır.
Tablo 9.8: Liste özellikleri ve değerleri
Background özellikleri ve değerleri tablo 9.9’de belirtilmiştir.
Özellik ve Değer
Açıklama
backgroundcolor
Arka plan renk değerini tutar.
backgroundimage
Arka plan resminin yol bilgisini tutar.
backgroundrepeat
Resmin x ve y koordinatları boyunca tekrarlanması
bilgisini tutar.
repeat: tüm yönlerde
repeat-x: x ekseni boyunca
repeat-y: y ekseni boyunca
no-repeat: tekrar edilmez
backgroundposition
left: Resmi pencerenin sol kenarına yaklaştırır.
right: Sağ kenara yakşaltırır.
center: Resmi ortalar.
Tablo 9.9: Background özellik ve değerleri
p {
background-color:blue;
background-image: url(back.gif);
background-position:left;
backround-repeat:repeat-x;
}
Seçiciler
Seçiciler, oluşturulan <H1>, <P> gibi etiketlerin mevcut özelliklerini aynı tutarak
onlara yeni özellikler ekleme olanağı verir. Ayrıca istenilen bir kelimeye stil
özelliği atayıp istenilen zamanda çağrılmasını sağlar.
h1 {
background:green;
color:white;
font-weight:bold;
font-family:arial;
}
h1.kirmizi{color:red}
257
Konu: 1
Linkler ve CSS
Sayfalarda ziyaret edilen linklerin mavi alt çizgilerini ortadan kaldırmak veya
başka stiller vermek için CSS dilinden yararlanılabilir. <A> etiketinin stilini
belirlemekte kullanılan dört ifade vardır:
•
active: Tıklanan linkin stilini belirler.
•
link: Link yazı stilini belirler.
•
visited: Ziyaret edilmiş linkin sitilini belirler.
•
hover: Fare linkin üzerindeyken nasıl bir stil alacağını belirler.
a:link{text-decoration:none; color:teal}
a:active{text-decoration:none; color:red}
a:visited{text-decoration:none; font-family:Times New Roman;
color:green}
a:hover{background-color:teal; color:white; fontfamily:arial}
Sınıf ve Gruplama
Sınıf (class), stil kurallarının küçük parçalara ayrılmasını sağlar. Sayfadaki
herhangi bir yazının diğer yazılardan farklı görünmesi istendiği durumda,
istenilen sayıda özel HTML etiketi oluşurulabilir. Örneğin sayfada iki farklı türde
H1 etiketi kullanılmak istensin.
H1.serif {
font: 14pt Century Schoolbook;
}
H1.sans{
font: 20pt Arial;
}
Bu stilleri kullanmak için kod içine serif veya sans sınıf ismi vermek yeterlidir.
Gruplama, stil özellikleri ve değerleri yoğunlaştırıldığında oluşur. Örneğin;
P.1 {
font: verdana;
font-size: 12pt;
line-height: 18pt;
}
1 sınıfındaki tüm paragraflar 12 punto Verdana fontuyla ve 18 punto satır
yüksekliğiyle görüntülenir. Sınıf yerine gruplama yapılabilir.
P.1{font:12pt/18pt verdana}
Her iki gösterimde de aynı görüntü elde edilir. Ancak gruplamada değerler
girerken font-size, font-height ve font sıralamasına uyulması gerektiğine
dikkat edilmelidir.
258
Modül 9: Web Programlamaya Giriş
Modül Özeti
26.
27.
28.
29.
30.
HTML nedir? En sık kullanılan HTML etiketlerini açıklayın.
Script Nedir?
Java Script nedir? Java Script niçin kullanılır?
CSS nedir?
CSS, Html sayfalara nasıl dahil edilebilir?
259
Konu: 1
Lab 1: Web Programlamaya Giriş
Bu uygulamada, Java Script .ile sanal klavye yapmasını öğreneceksiniz.
Ayrıca Java Script ile popup pencere oluşturmayı öğreneceksiniz.
Bu lab tamamlandıktan sonra:
•
Java Script ile Sanal Klavye oluşturabilecek,
•
Java Script ile popup pencere oluşturabileceksiniz.
Web uygulaması oluşturmak
Bu uygulamada kullanılacak ASP.Net Web Application projesini oluşturun.
18. File menüsü altından New alt menüsünü işaret edin ve Project
komutunu tıklayın.
19. New Project ileti kutusundan “ASP.Net Web Application” şablonunu
seçin.
20. Location metin kutusuna “http://localhost/ WebOrnek” yazın.
21. Enter butonu tıklayın.
Sanal Klavye oluşturmak
WebOrnek projesine SanalKlavye isminde yeni bir Html sayfa ekleyin.
260
Modül 9: Web Programlamaya Giriş
Aşağıdaki kodları <Body>..</Body> etiketlerinin arasına yazarak Html sayfayı
tasarlayın.
<div id="klavyem">
<table width="200" border="1" cellpadding="0"
cellspacing="0" bordercolor="#00ff00" bgcolor="#0099cc"
ID="Table1">
<tr>
<td><input type="button" id="ba"
onClick="HarfA()" value="A" NAME="ba"></td>
<td><input type="button" id="bb"
onClick="HarfB()" value="B" NAME="bb"></td>
<td><input type="button" id="bc"
onClick="HarfC()" value="C" NAME="bc"></td>
<td><input type="button" id="bd"
onClick="HarfD()" value="D" NAME="bd"></td>
<td><input type="button" id="be"
onClick="HarfE()" value="E" NAME="be"></td>
<td><input type="button" id="bf"
onClick="HarfF()" value="F" NAME="bf"></td>
<td><input type="button" id="bg"
onClick="HarfG()" value="G" NAME="bg"></td>
<td><input name="button2" type="button" id="bh"
onClick="HarfH()" value="H"></td>
</tr>
<tr>
<td><input type="button" id="bi"
onClick="HarfI()" value="I" NAME="bi"></td>
<td><input type="button" id="bj"
onClick="HarfJ()" value="J" NAME="bj"></td>
<td><input type="button" id="bk"
onClick="HarfK()" value="K" NAME="bk"></td>
<td><input type="button" id="bl"
onClick="HarfL()" value="L" NAME="bl"></td>
<td><input type="button" id="bm"
onClick="HarfM()" value="M" NAME="bm"></td>
<td><input type="button" id="bn"
onClick="HarfN()" value="N" NAME="bn"></td>
<td><input type="button" id="bo"
onClick="HarfO()" value="O" NAME="bo"></td>
<td><input type="button" id="bp"
onClick="HarfP()" value="P" NAME="bp"></td>
261
Konu: 1
</tr>
<tr>
<td><input type="button" id="br"
onClick="HarfR()" value="R" NAME="br"></td>
<td><input type="button" id="bs"
onClick="HarfS()" value="S" NAME="bs"></td>
<td><input type="button" id="bt"
onClick="HarfT()" value="T" NAME="bt"></td>
<td><input type="button" id="bu"
onClick="HarfU()" value="U" NAME="bu"></td>
<td><input type="button" id="bv"
onClick="HarfV()" value="V" NAME="bv"></td>
<td><input type="button" id="by"
onClick="HarfY()" value="Y" NAME="by"></td>
<td><input type="button" id="bz"
onClick="HarfZ()" value="Z" NAME="bz"></td>
</tr>
</table>
</div>
<br>
<form name="form1" method="post" ID="Form1">
<table width="268" border="1" cellpadding="1"
cellspacing="2" bordercolor="#99ff66" bgcolor="#0099cc"
ID="Table2">
<tr>
<td width="85">Kullanici Adi</td>
<td width="167"><input name="text" type="text"
id="user"></td>
</tr>
<tr>
<td>Parola</td>
<td><input type="password" id="password"
readonly NAME="password"></td>
</tr>
<tr>
<td> </td>
<td><input name="button2" type="button"
id="giris" value="Giris Yap" onClick="hosgeldin()">
  <input name="button2" type="reset"
id="temizle" value="Sil"></td>
</tr>
</table>
</form>
Kodların yazılması
SanalKlavye Html sayfasının HTML bölümüne aşağıdaki kodları yazın. Bu kod,
Java Script ile istemci taraflı fonksiyonlar eklemektedir. Bu kodu
<Head>..</Head> etiketleri arasına ekleyin.
<script language="javascript">
function HarfA()
{
form1.password.value += "A";
}
function HarfB()
{
form1.password.value += "B";
}
262
Modül 9: Web Programlamaya Giriş
function HarfC()
{
form1.password.value += "C";
}
function HarfD()
{
form1.password.value += "D";
}
function HarfE()
{
form1.password.value += "E";
}
function HarfF()
{
form1.password.value += "F";
}
function HarfG()
{
form1.password.value += "G";
}
function HarfH()
{
form1.password.value += "H";
}
function HarfI()
{
form1.password.value += "I";
}
function HarfJ()
{
form1.password.value += "J";
}
function HarfK()
{
form1.password.value += "K";
}
function HarfL()
{
form1.password.value += "L";
}
function HarfM()
{
form1.password.value += "M";
}
function HarfN()
{
form1.password.value += "N";
}
function HarfO()
{
form1.password.value += "O";
}
function HarfP()
{
263
Konu: 1
form1.password.value
}
function HarfR()
{
form1.password.value
}
function HarfS()
{
form1.password.value
}
function HarfT()
{
form1.password.value
}
+= "P";
+= "R";
+= "S";
+= "T";
function HarfU()
{
form1.password.value += "U";
}
function HarfV()
{
form1.password.value += "V";
}
function HarfY()
{
form1.password.value += "Y";
}
function HarfZ()
{
form1.password.value += "Z";
}
function hosgeldin()
{
alert("hosgeldiniz sayin: " + form1.user.value)
}
</script>
Popup pencere oluşturmak
WebOrnek projesine Popup isminde yeni bir Html sayfa ekleyin.
264
Modül 9: Web Programlamaya Giriş
Aşağıdaki kodları <Body>..</Body> etiketlerinin arasına yazarak Html sayfayı
tasarlayın.
<INPUT id="Button1" type="button" onclick="pencereac()"
value="Pencere Aç" name="Button1">
WebOrnek projesine acilan_pencere isminde yeni bir Html sayfa ekleyin.
Aşağıdaki kodları <Body>..</Body> etiketlerinin arasına yazarak Html sayfayı
tasarlayın.
Burada acılan pencere mevcut
<br>
<INPUT id="Button2" onclick="window.close()" type="button"
value="Pencere Kapat" name="Button2">
265
Konu: 1
Kodların yazılması
Popup, Html sayfasının HTML bölümüne aşağıdaki kodları yazın. Bu kod, Java
Script ile istemci taraflı fonksiyon eklemektedir. Bu kodu <Head>..</Head>
etiketleri arasına ekleyin.
<script language="javascript">
function pencereac()
{
window.open('acilan_pencere.htm','acilan','width=500,heig
ht=300')
}
</script>
Modül 10:
Modül 10: Kullanıcı Kontrolleri Oluşturmak
Web uygulamaları geliştirirken, her sayfada görüntülenecek sabit paneller
gerekebilir. Bu panelleri her sayfa için tekrar oluşturmak zaman ve performans
267
Modul 10:
kaybına yol açar. Bu paneller, User Controls (kullanıcı kontrolleri) biçminde
oluşturulup, proje içinde birçok yerde kullanılabilir.
Bu modül tamamlandıktan sonra :
•
Kullanıcı kontrollerin yapısını öğrenecek,
•
Kullanıcı kontrolü oluşturabilecek,
•
Kullanıcı kontrollerini proje içinde kullanabileceksiniz.
Konu 1: Kullanıcı Kontrolleri
Sık kullanılan kontroller bir araya getirilerek yeni bir kontrol oluşturulur. Bu
kontroller uygulama içerisinde her sayfada kullanılabilir. Örneğin sayfalar arası
dolaşımı sağlayan menü paneli, kullanıcı kontrolü haline getirilebilir.
Web kontrollerinde olduğu gibi kullanıcı kontrolleri de sunucu tarafında çalışır.
Kullanıcı kontrolleri System.Web.UI.UserControl sınıfından türetilmiştir.
Kullanıcı Kontrolünün Avantajları
•
Kullanıcı kontrolleri, ayrı bir namespace içinde tanımlanır. Bu durum
kullanıldıkları Web formları ile oluşabilecek isim çakışmasını ortadan
kaldırır.
•
Kullanıcı kontrolleri, aynı sayfa içinde birden fazla kullanılabilir. Hiçbir
özellik veya metot için isim çakışması söz konusu değildir.
268
Modül 10: Kullanıcı Kontrolleri Oluşturmak
•
Kullanıcı kontrolleri ayrı dillerde yazılabilir.
Kullanıcı kontrolleri, uygulama içindeki tüm sayfalara eklenebilir. Ancak diğer
uygulamalardaki kullanıcı kontrolleri sayfalara direk eklenemez. Diğer
uygulamalardaki kullanıcı kontrolleri, kullanmadan önce uygulamaya
eklenmelidir.
Kullanıcı Kontrolünü Projeye Eklemek
Projeye yeni bir kullanıcı kontrolü eklemek için aşağıdaki adımları takip edin.
1. Solution Explorer penceresi açın.
2. Proje adı üzerinde farenin sağ butonunu tıklayın.
3. Açılan penceredeki Add menüsünden Add Web User Control
komutunu seçin.
4. Name metin kutusuna kullanıcı kontrolune verilecek ismi girin.
Modul 10:
Kullanıcı kontrol formları, normal Web formlar gibi tasarlanır. Kullanıcı kontrol
dosyaları .ascx ve bu kontrollere ait code-behind sayfası ise ascx.cs uzantılıdır.
Kullanıcı kontrollerinde HTML ve Visual Basic .NET kodu birlikte kullanılabilir.
Ancak kullanıcı kontrolleri web formları tarafından kullanıldığı için <head>,
<body>, <form> gibi HTML elementleri bulundurmaz.
Web form direktifi olan @Page yerine kullanıcı kontrollerinde @Control ifadesi
kullanılır. Bu direktif @Page direktifinin AspCompat ve Trace dışındaki tüm
attribute değerlerine sahiptir.
269
270
Modül 10: Kullanıcı Kontrolleri Oluşturmak
Kullanıcı kontrollerini Web form içerisine eklemek için @Register ifadesi
kullanılır. Bu ifade kullanıcı kontrollerinin web forma bağlanmasını sağlar.
<%@ Register TagPrefix=”deneme” TagName”=Login”
src=”login.ascx” %>
TagPrefix attribute değeri kullanıcı kontrolü için bir namespace oluşturur.
Böylece her kontrol ayrı bir namespace içinde tanımlanır. TagName, kullanıcı
kontrolünün ismidir. Src ise kullanıcı kontrolünün bulunduğu yolu belirtir.
@Register ifadesi ile forma bağlanan kullanıcı kontrolu, aşağıda kod ile web
form içerisinde görüntülenir. Kullanıcı kontrolleri sunucu üzerinde çalıştığı için,
runat="server" parametresi ile tanımlanmalıdır.
<deneme:Login id="Login1" runat="server"/>
Modul 10:
Örnekte tüm sayfalarda kullanılacak sayfa başlığı, kullanıcı kontrolü olarak
tasarlanmıştır.
<%@ Control Language="cs" AutoEventWireup="false"
Codebehind="Header.ascx.cs"
Inherits="KullaniciKontrolleri.UserControls.Header" %>
<table width="100%" height="100%" bgcolor="#ffeeaa">
<tr valign="middle">
<td align="center">
<asp:Label id="lblHeader" runat="server"
Font-Bold="True" ForeColor="White"
Font-Size="X-Large">Hoşgeldiniz
</asp:Label>
</td>
</tr>
</table>
271
272
Modül 10: Kullanıcı Kontrolleri Oluşturmak
Modül Özeti
31. Kullanıcı kontrolleri niçin oluşturulur?
32. Kullanıcı kontrollerinin avantajları nelerdir?.
33. Web form içerisinde kullanıcı kontrolleri nasıl kullanılır?
273
Modul 10:
Lab 1: E-Ticaret Uygulaması Geliştirmek
Bu uygulamada, e-ticaret uygulamasının kullanıcı kontrolleri tasarlanacaktır. Bu
uygulamada, bütün sayfalarda kullanılacak üst ve alt menü oluşturulacaktır.
Ayrıca kategori isimli kullanıcı kontrolu ile tüm kategoriler listelenecektir.
Kategori değerleri veritabanı içerisinden alınır.
Bu lab tamamlandıktan sonra:
•
Kullanıcı kontrolu oluşturabileceksiniz.
Kullanıcı kontrollerin eklenmesi
AspEticaret isimli projeyi açın.
Ust kontrolunun eklenmesi
ASPEticaret projesine Ust isminde yeni bir kullanıcı kontrolü ekleyin.
Kullanıcı kontrolu içerisine tablodaki kontrolleri ekleyin.
Kontrol – Kontrol İsmi
Özellik
Değer
HyperLink – btnAnaSayfa
NavigateUrl
Default.aspx
Text
AnaSayfa
NavigateUrl
UyeGiris.aspx
Text
tıklayınız
HyperLink – btnUyeGiris
274
Modül 10: Kullanıcı Kontrolleri Oluşturmak
HyperLink – btnUyeKayit
LinkButton – btnCikis
NavigateUrl
UyeKayit.aspx
Text
Üye Kayit
Text
Çıkış
Visible
False
Label – lblAd
Ust isimli kullanıcı kontrolunün Html kodları aşağıdaki gibi olacaktır.
<%@ Control Language="cs" AutoEventWireup="false"
Codebehind="Ust.ascx.cs" Inherits="AspEticaret.Ust"
TargetSchema="http://schemas.microsoft.com/intellisense/ie5"
%>
<TABLE id="Table1" cellSpacing="0" cellPadding="0"
width="700" border="0">
<TR>
<TD style="HEIGHT: 17px">
<P align="center"><FONT face="Lucida Handwriting"
size="6">Yazilim Uzmani Kitapevi</FONT></P>
</TD>
</TR>
<TR>
<TD> 
<asp:Label id="lblAd"
runat="server"></asp:Label> </TD>
</TR>
<TR>
<TD>
<P align="center">
<asp:HyperLink id="btnAnaSayfa" runat="server"
NavigateUrl="Default.aspx">AnaSayfa</asp:HyperLink> |
<asp:HyperLink id="btnUyeGiris" runat="server"
NavigateUrl="UyeGiris.aspx">Üye Giriş</asp:HyperLink> |
<asp:HyperLink id="btnUyeKayit" runat="server"
NavigateUrl="UyeKayit.aspx">Üye
Kayit</asp:HyperLink>   
 
<asp:LinkButton id="btnCikis" runat="server"
Visible="False">Çıkıs</asp:LinkButton></P>
</TD>
</TR>
</TABLE>
Ust isimli kullanıcı kontrolunün code behind kodları aşağıdaki gibi olacaktır.
Using System.Data.OleDb
private void Page_Load(System.Object sender,
System.EventArgs e)
{
If (Session("user") != "")
{
275
Modul 10:
lblAd.Text = "Bay / Bayan : " + Session("ad") +
" " + Session("soyad");
btnCikis.Visible = true;
else
{
btnCikis.Visible = false;
}
}
private void btnCikis_Click(System.Object sender,
System.EventArgs e)
{
Session.Abandon();
btnCikis.Visible = false;
Response.Redirect("Default.aspx");
}
Alt kontrolunun eklenmesi
ASPEticaret projesine Alt isminde yeni bir kullanıcı kontrolü ekleyin.
Kullanıcı kontrolu içerisine tablodaki kontrolleri ekleyin.
Kontrol – Kontrol
İsmi
Özellik
HyperLink – Link1
NavigateUrl
Text
HyperLink – Link2
HyperLink – Link3
Değer
AnaSayfamYap
NavigateUrl
Text
SikKullanilanlaraEkle
NavigateUrl
mailto:[email protected]
Text
Iletisim
Alt isimli kullanıcı kontrolunün Html kodları aşağıdaki gibi olacaktır.
<%@ Control Language="cs" AutoEventWireup="false"
Codebehind="Alt.ascx.cs" Inherits="AspEticaret.Alt"
TargetSchema="http://schemas.microsoft.com/intellisense/ie5"
%>
<TABLE id="Table1" cellSpacing="0" cellPadding="0"
width="700" border="0">
<TR>
<TD>
<P align="center"><asp:hyperlink id="Link1"
runat="server">AnaSayfamYap</asp:hyperlink> |
<asp:hyperlink id="Link2"
runat="server">SikKullanilanlaraEkle</asp:hyperlink> |
<asp:hyperlink id="Link3" runat="server"
NavigateUrl="mailto:[email protected]">Iletisim</a
sp:hyperlink></P>
276
Modül 10: Kullanıcı Kontrolleri Oluşturmak
</TD>
</TR>
</TABLE>
Yan kontrolunun eklenmesi
ASPEticaret projesine Yan isminde yeni bir kullanıcı kontrolü ekleyin.
Yan isimli kullanıcı kontrolunün Html kodları aşağıdaki gibi olacaktır.
<%@ Control Language="cs" AutoEventWireup="false"
Codebehind="yan.ascx.cs" Inherits="AspEticaret.yan"
TargetSchema="http://schemas.microsoft.com/intellisense/ie5"
%>
<TABLE id="Table1" cellSpacing="0" cellPadding="0"
width="150" border="0">
<TR>
<TD>
<P align="center"><A
href="http://www.yazilimuzmani.com"><IMG
src="resimler/YazilimUzmani.gif" border="0"></A></P>
</TD>
</TR>
<TR>
<TD style="HEIGHT: 35px">
<P align="left"><IMG
src="resimler/bilgeadam%20logo.jpg" border="0"><A
href="http://www.yazilimuzmani.com"></A></P>
</TD>
</TR>
<TR>
<TD>
<P align="left"><A
href="http://sdnet.bilgeadam.com"><IMG
src="resimler/sdNetLogo.gif" border="0"></A></P>
</TD>
</TR>
</TABLE>
DataSet nesnesinin Oluşturulması
dsBook isminde yeni bir DataSet oluşturun.
277
Modul 10:
12345-
Solution Explorer penceresi açın.
Proje adı üzerinde farenin sağ butonunu tıklayın.
Açılan penceredeki Add menüsünden Add New Item komutunu seçin.
Templates seçeneği içerisinden DataSet öğesini seçin
Name metin kutusuna dsBook ismini girin.
Bağlantı oluşturulması
KitapDB veritabanı üzerinde işlem yapılması için bağlantı kurulması gerekir. Bu
bağlantıyı Server Explorer’ı kullanarak oluşturun. Bu baglantı ile veritabanı içerisindeki
Kategori tablosu, dsBook isimli dataset içerisine eklenecektir.
KitapDb uygulaması için yeni bağlantı oluşturmak.
5. Server Explorer penceresi üzerinde farenin sağ butonunu tıklayın. Açılan
menüden Add Connection komutunu tıklayın.
6. Açılan Data Link Properties penceresinin Provider sekmesini tıklayın.
7. Provider sekmesinden Microsoft.Jet.OLEDB.4.0 Provider ‘i seçerek
Next butonunu tıklayın.
8. Açılan Connection sekmesinin görüntüsünü resimdeki gibi düzenleyerek OK
butonunu tıklayın.
9. Server Explorer penceresinden DataConnections seçeneğini seçin
10. Eklediğiniz bağlantı içerisinden Tables seçeneğini seçin.
11. Tables içerisindeki Kategori tablosunu dsBook nesnesinin içerisine
sürükleyin.
278
Modül 10: Kullanıcı Kontrolleri Oluşturmak
Kategori kontrolunun eklenmesi
ASPEticaret projesine Kategori isminde yeni bir kullanıcı kontrolü ekleyin.
Kullanıcı kontrolu içerisine tablodaki kontrolleri ekleyin.
Kontrol – Kontrol İsmi
Özellik
Değer
Repeater – rptKategori
NavigateUrl
Default.aspx
Kategori isimli kullanıcı kontrolunün Html kodları aşağıdaki gibi olacaktır.
<%@ Control Language="cs" AutoEventWireup="false"
Codebehind="kategori.ascx.cs"
Inherits="AspEticaret.kategori"
TargetSchema="http://schemas.microsoft.com/intellisense/ie5"
%>
<asp:Repeater id="rptKategori" runat="server">
<ItemTemplate>
<table width="150" cellpadding="2" cellspacing="2">
<tr bgcolor="#0099ff">
<td>
<a style="COLOR: white"
href='Kitap.aspx?KategoriID=<%#
databinder.eval(Container.dataitem,"KategoriID") %>'>
<%# Databinder.eval(container.dataitem
,"KategoriAdi") %>
</a>
</td>
</tr>
</table>
</ItemTemplate>
</asp:Repeater>
Kategori isimli kullanıcı kontrolunün code behind
olacaktır.
kodları aşağıdaki gibi
using System.Data.OleDb;
private void Page_Load(System.Object sender,
System.EventArgs e)
{
String connStr = "Provider=Microsoft.Jet.OleDB.4.0; " +
"Data Source=" + Server.MapPath("KitapDb.mdb");
OleDbConnection conn = new OleDbConneciton();
279
Modul 10:
conn.ConnectionString = connStr;
OleDbCommand comm = new OleDbCommand();
comm.CommandType = CommandType.Text;
comm.CommandText = "Select * from Kategori";
comm.Connection = conn;
OleDbDataAdapter da =new OleDbDataAdapter();
da.SelectCommand = comm;
DataSet ds = new DataSet();
try
{
conn.Open();
da.Fill(ds, "Kategori");
rptKategori.DataSource = ds.Kategori;
rptKategori.DataBind();
catch (Exception ex)
{
Response.Write(ex.Message);
}
finally
{
if (conn.State = ConnectionState.Open)
{
conn.Close();
}
}
}
Modul 11:
Modul 11:
Modul 11: ADO.NET ile Veriye Erişim
Web uygulamaları ile veriye erişim, Windows uygulamalarına oldukça
benzemektedir. Ancak verileri listelemek için kullanılan kontrollerin çalışma
yapısı farklılık gösterir. Veriye ulaşım ADO.NET nesneleri ile gerçekleşir.
281
282
Modül 11:
Bu modül tamamlandıktan sonra:
•
Repeater, DataList
ve DataGrid gibi listeleme kontrollerini
öğrenecek,
•
Web uygulamlarında Connected ve Disconnected çalışma yapısını
öğrenecek,
Konu 1: Veri Bağlantılı Kontroller
ASP.Net ile veritabanı içindeki veriyi görüntülemek ve düzenlemek için veri
bağlantı kontrolleri kullanılır. ListBox, DropDownList kontrolleri dışında
CheckBoxList, RadioButtonList kontrolleri veri bağlantılı olarak çalışabilir.
Repeater, DataList ve DataGrid kontrolleri veri listelemek için kullanılır.
283
Modul 11:
CheckBoxList, RadioButtonList Kullanımı
CheckBox ve RadioButton kontrollerinden farklı olarak, birden fazla seçenek
arasında seçim yapılmasını sağlayan CheckBoxList ve RadioButtonList
kontrolleri kullanılabilir. Örneğin bir sayfada dört tane isteğe bağlı seçenek
varsa dört ayrı CheckBox kullanmak yerine, bir CheckBoxList kontrolü
kullanılır. Aynı şekilde beş seçenekten sadece bir tanesi seçilmesi gerekiyorsa,
beş ayrı RadioButton oluşturmak yerine, bir RadioButtonList kontrolü
kullanılır.
CheckBoxList kontrolünün DataSource, DataMember, DataTextField ve
DataValueField özellikleri ile veritabanı işlemleri gerçekleştirilir. DataSource,
bağlantısız çalışan DataSet nesnesine bağlanır. DataMember, bu DataSet
içerisindeki tablo ismini temsil eder. DataValueField, value özelliğinde
tutulması istenen kolonu, DataTextField ise text özelliğinde görüntülenmek
istenen kolonu temsil eder.
Örnekte CheckBoxList kontrolü ile seçilen tüm öğeler, lblMsg isimli etiketin
içerisine yazdırılmaktadır.
int i ;
for (int i=0;i< checkboxlist1.Items.Count ;i++)
{
If (checkboxlist1.Items(i).Selected)
{
lblMsg.Text &= checkboxlist1.Items(i).Text & "<br>"
284
Modül 11:
}
}
CheckBoxList
kontrolü
ile
birden
fazla
seçim
yapılabilir.
Fakat
RadioButtonList kontrolü ile sadece bir öğe seçilebilir.
Örnekte CheckBoxList veya RadioButtonList kontrolü ile veritabanı
bağlantısı .gösterilmektedir.
private void Page_Load(System.Object sender,
System.EventArgs e)
{
da.Fill(DataSet1, "Kitaplar");
CheckBoxList1.DataSource = DataSet1;
CheckBoxList1.DataMember = "Kitaplar";
CheckBoxList1.DataTextField = "Kitap_baslik";
CheckBoxList1.DataValueField = "kitap_ISBN";
CheckBoxList1.DataBind();
}
Repeater, DataList ve DataGrid Kullanımı
Repeater, DataList ve DataGrid, veri listelenmesi için tasarlanmış özel
kontrollerdir.
Bu üç kontrol şablonlardan oluşur. Ortak şablonları ise HeaderTemplate,
ItemTemplate ve FooterTemplate şablonlarıdır. Şablonlar içerisinde verinin
görüntülenmesine yönelik tanımlamalar yapılır.
Modul 11:
DataList ve DataGrid, veriler üzerinde güncelleme yapma imkanı sunarken,
Repeater sadece veri görüntülemeyi sağlar. Ancak DataGrid, DataList
kontrolünden farklı olarak veri sayfalama ve sıralama özellikleri sunar.
Repeater
Repeater; veriyi veritabandan alarak istenilen biçimde görüntülenmesini
sağlayan oldukça güçlü bir kontroldür. Her kaydın görüntülenme şekli, HTML
etiketleri ile oluşturulan bir şablon ile belirlenir. Haber yayını yapan sitelerinin
çoğunda bu kontrol kullanılır.
Kod 11.1 de Repeater kullanımı gösterilmektedir.
Kod 11.1:Repeater Kullanımı
<asp:Repeater id="Repeater1" runat="server">
<HeaderTemplate>
<asp:Label id="lblh" Runat="server" text="Company _
Name" Font-Bold="True" Width="260"></asp:Label>
<asp:Label id="lblh2" Runat="server" text="Contact _
Name" Font-Bold="True"></asp:Label>
</HeaderTemplate>
<ItemTemplate>
<table>
<tr>
<td width="260">
<asp:Label ID=lbl1 Runat=server
text='<%#Databinder.eval(container.dataitem,
"companyname")%> ' >
</asp:Label>
</td>
285
286
Modül 11:
<td>
<asp:Label ID=Lbl2 Runat=server
text='<%# Databinder.eval(container.dataitem,
"contactname")%> ' >
</asp:Label>
</td>
</tr>
</table>
</ItemTemplate>
<FooterTemplate>
<b>BilgeAdam BTA</b>
</FooterTemplate>
</asp:Repeater>
Repeater kontrolünün ItemTemplate şablonda, her kayıt için yapılacak
gösterim şekli belirlenir. HTML etiketleri kullanarak çıktıya şekil verilebilir.
HeaderTemplate şablonu repeater kontrolünün başlığının, FooterTemplate
alt başlığın biçimini belirler.
HeaderTemplate içinde açılan bir <table> etiketi, FooterTemplate içinde
</table> ifadesiyle kapatılabilir. SeperatorTemplate şablonu, kayıtlar
arasında ayraç stili belirler.
Tablo 11.1’de Repeater kontrolünün şablonları açıklanmıştır.
Şablon Adı
Açıklama
ItemTemplate
Veritabanından gelecek satırların
görüntüleneceği stilin belirlendiği alan.
AlternatingItemTemplate
Ardışıl olarak gelen satırların birbirinden
farklı olmasını sağlar.
HeaderTemplate
Repeater kontrolünün başlığıdır.
İstenilen stil verilebilir.
FooterTemplate
Repeater kontrolünün en altındaki
alandır. Alt başlık olarak istenilen stil
verilebilir.
SeperatorTemplate
Veritabanından gelen her bir satırı
diğerinden ayıran şablondur.
Tablo 11.1: Repeater kontrolünün şablonları
<table> </table> etiketleri ile kayıtların bir tablonun satırları biçiminde
görüntülenmesini sağlanır. <tr> </tr> etiketi arasında iki <td> </td> etiketi
kullanır. Bu şekilde, bir satır bilgiyi iki kolona ayırılmış biçimde görüntülenmesini
istenir. İlk td etiketinde bir <asp:Label> etiketi kullanarak bu birinci sütunda
verinin bir Label kontrolü içinde görüntülenmesi isteğini bildirilir. Ve Label
etiketinin Text özelliği içine,
287
Modul 11:
text='<%#Databinder.eval(container.dataitem,
"companyname")%> '
ifadesi
yazılarak
veri
bağlama
işlemi
gerçekleştirilir.
Burada
Databinder.eval, repeater kontrolüne bağlanan veri kümesi içinden
CompanyName adı verilen kolonu bulur ve o kolondaki verileri sırasıyla repeater
içine alır ve görüntüler.
İkinci td etiketinde, Label kontrolünün Text özelliğine ContactName kolonunu
bağlar.
text='<%#Databinder.eval(container.dataitem,
"contactname")%> '
Code-behind sayfasında ise, Repeater kontrolünün DataSource özelliğine,
veri kaynağını temsil eden DataSet nesnesinin ismi bildirilir. Ve DataBind
metodu ile bağlantının işlenmesi sağlanır.
Repeater1.DataSource = DataSet2;
Repeater1.DataBind();
Sonuç olarak Repeater kontrolü, HTML kullanımını yoğun olarak gerektirir ve
karşılığında, verilerin istenilen şablona uygun biçimde görüntülenmesini sağlar.
DataList
288
Modül 11:
DataList kontrolü, Repeater kontrolünün daha gelişmiş halidir. Veri
görüntülemek dışında, verilerin seçilip ve üzerinde güncelleme işlemleri
yapmaya olanak sağlar.
Datalist eklemek için aşağıdaki adımları takip edin. Örnekte DataList kullanımı
gösterilmektedir.
1. Araç kutusundan DataList kontrolü seçerek formumuzun üzerine
sürükleyip bırakın.
2. Kontrol üzerine sağ tıklayın ve açılan menüden “Edit Template” alanını
seçin.
3. Açılan yeni pencerede Header and Footer Templates, Item
Template ve Seperator Templates alanları çıkacaktır. Header and
Footer Templates alanını seçerek, başlık ve alt başlık alanlarına
istenilen form girilebilir. Header alanına iki label ekleyin ve Text
özelliğine “Kitap Adı” ve “Yazar” değerini verin. Footer alanına yine bir
Label ekleyin ve Text özelliğine “Bilge Adam BTA” yazın.
4. Kontrol üzerinde tekrar sağ tıklayın ve “Item Templates” alanını seçin.
ItemTemplate ve AlternatingItemTemplate şablonuna ek olarak,
SelectedItemTemplate ve EditItemTemplate şablonları bulunur.
ItemTemplate alanında, görüntülemek istenilen alanları temsil edecek
kontrolleri oluşturulur. Bu kontrolde repeater kontrolünden farklı olarak,
tasarım ekranında araç kutusundan istenen kontrol ItemTemplate
şablonuna eklenebilir.
5. İki tane Label kontrolünü ItemTemplate alanına ekleyin ve HTML
koduna geçerek veri bağlama işlemlerini gerçekleştirin.
Kod 11.2: DataList kullanımında code-behind sayfası
string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;” +
“Data Source=" & Server.Mappath("./Stok.mdb");
OleDbConnection conn = new OleDbConnection (connStr);
OleDbDataAdapter da = new OleDbDataAdapter("select * from
kitaplar", conn);
DataSet ds = New DataSet();
private void Page_Load(Object sender, EventArgs e)
{
da.Fill(ds, "kitaplar");
DataList1.DataSource = ds;
DataList1.DataBind();
}
Kod 11.3: DataList aspx sayfası ve veri bağlama
<form id="Form1" method="post" runat="server">
<asp:DataList id="DataList1" style="Z-INDEX: 101; LEFT:
88px; POSITION: absolute; TOP: 168px" runat="server">
<HeaderTemplate>
<asp:Label id="Label1" runat="server" Width="300px"
Font-Bold="True">Kitap Adı</asp:Label>
289
Modul 11:
<asp:Label id="Label2" runat="server" Width="65px"
Font-Bold="True">Yazar</asp:Label>
</HeaderTemplate>
<FooterTemplate>
<asp:Label id="Label3" runat="server" FontBold="True">Bilge adam Bta</asp:Label>
</FooterTemplate>
<ItemTemplate>
<asp:Label id=Label5 runat="server" Width="300px"
text='<%# databinder.eval(container.dataitem,
"kitap_baslik")%>'> </asp:Label>
<asp:Label id=Label4 runat="server" text='<%#
databinder.eval(container.dataitem, "kitap_yazar")%>'>
</asp:Label>
</ItemTemplate>
</asp:DataList>
</form>
DataList kontrolünün bir diğer farkı, çıktı görünümünün tablo içinde veya düz
bir biçimde verilmesidir. RepeatLayout özelliğinin Table ve Flow değerlerini
kullanarak tablo görünümü ve düz görünüm verilir. Varsayılan görülüm Table
biçimindedir.
RepeatColums özelliği ise verilerin kaç sütun halinde görüntüleneceğini belirler.
RepeatDirection özelliği ise tekrarlanan kayıtların alt alta veya yan yana
sıralanarak görüntülenmesini sağlar.
GridLines özelliği ise dikey ve yatay çizgilerle kayıt görüntülerini birbirinden
ayırır.
DataList içerisinde görüntü formunu düzenlemek için
penceresindeki görünüme ilişkin pek çok özellik sunulmuştur.
properties
SelectedItemTemplate şablonu, listeden seçilen nesneye ait ayrıntıların
görüntülenmesini sağlar.
EditItemTemplate şablonu, kullanıcının seçtiği kayıt üzerinde düzenleme
yapmasını sağlayan alana ait kodların girildiği bölümdür..
DataList kontrolünün şablonları içerisine kullanılan kontrollere, formun
üzerinden direk erişilemez. Örneğin DataList içindeki bir Button kontrolünün
Click olayına kod yazılamaz. DataList içinde kullanılan Button kontrolüne
kod yazmak için, DataList kontrolünün CommandName özelliği kullanılır. Bu
özellik, Button kontrolünü Command nesnesi ile alır ve forma yollar. Ve
DataList kontrolünün ItemCommand olayında, gelecek komutun adına göre
kod yazılır.
290
Modül 11:
DataGrid
DataGrid kontrolü, DataList kontrolünden daha gelişmiş özelliklere sahiptir.
Verileri sayfalama ve sıralama yeteneği sayesinde görüntüleme işlemleri
özelleşmiştir. DataGrid, veritabanından alınan bir tabloyu, tablo biçimi ile
ekrana yansıtılmasını sağlar. Seçilen kayıt üzerinde değişiklik yapma ve kayıt
silme olanaklarını sağlar. Sayfalama, sıralama, seçme, düzeneleme ve silme
işlemlerini destekler. DataGrid kontrolüne veri bağlamak için şablon
kullanmaya gerek yoktur.
Kod 11.4: DataGrid kontrolünün en basit kullanımı
string connStr = "Provider= Microsoft.Jet.OLEDB.4.0;”+
“Data Source=" + Server.Mappath("./Stok.mdb");
OleDbConnection conn = new OleDbConnection(connStr);
OleDbDataAdapter da = new OleDbDataAdapter("select * from
kitaplar", conn);
DataSet ds = new DataSet;
private void Page_Load(Object sender, EventArgs e)
{
da.Fill(ds, "kitaplar");
DataGrid1.DataSource = ds;
DataGrid1.DataMember = "kitaplar";
DataGrid1.DataBind();
}
HTML
<asp:DataGrid id="DataGrid1" style="Z-INDEX: 101;
LEFT: 28px; POSITION: absolute; TOP: 96px"
runat="server" Width="432px" Height="203px">
291
Modul 11:
</asp:DataGrid>
Sadece tasarım ekranı kullanılarak DataGrid oluşturulabilir.
•
Server Explorer panelinden yeni bir Access veritabanı bağlantısı
oluşturun.
•
Bu veritabanından, kullanmak istediğiniz tabloyu sürükleyerek form
üzerine bırakın. Formun alt penceresinde iki yeni nesne oluşacaktır.
(OleDbConnection1 ve OleDbDataAdapter1)
•
OleDbDataAdapter1 nesnesi seçin ve Properties panelinden
“Generate DataSet” komutunu verin.
•
Açılan pencerede Next düğmeleri ile ilerleyin.
•
Araç kutusundan DataGrid kontrolünü sürükleyip forma bırakın.
•
Properties penceresinde DataSource alanına oluşturulan DataSet
kontrolünün ismi, DataMember alanına, DataSet içine alınan
tablolardan birini girin.
•
DataSet kontrolünü veri ile dolduran ve bağlama işlemlerini
gerçekleştiren kodları yazın.
OleDbDataAdapter1.Fill(DataSet1, “Tablo_ismi”);
DataGrid1.DataBind();
DataGrid için hazırlanmış çeşitli şablonlar vardır. Hazır şablonları seçmek
için DataGrid kontrolü üzerinde sağ tıklanır ve AutoFormat seçilir.
Varsayılan olarak DataGrid verileri Grid görünümünde sunar. GridLines
özelliğine Both, Hortizonal, Vertical ve None değerlerinden biri
atanabilir. BackImageUrl özelliği sayesinde DataGrid kontrolünde bir arka
plan resmi görüntülenebilir.
DataGrid Kontrolünde Kolon Oluşturma
Slide9
DataGrid kontrolü içerisinde çeşitli kolon türleri bulunur.
•
BoundColumn
•
HyperLinkColumn
•
TemplateColumn
•
ButtonColumn
•
EditCommandColumn
AutoGenerateColumns özelliği, varsayılan olarak True değerini alır ve
tablodan gelen kolonları değiştirmeden görüntüler.
BoundColumn
BoundColumn, DataGrid kontrolünün varsayılan kolonudur. Kayıtları
görüntüler. Veri kaynağından alınan tablodan sadece belirli kolonların
292
Modül 11:
görüntülenmesi istenirse, BoundColumn kontrolleri kullanılabilir. Kod 11.5’de
veri kaynağından alınan tablonun istenilen kolonları görüntülenir.
Kod 11.5: DataGrid içerisinde BoundColumn kullanımı
ile sadece görüntülenmesi istenen kolonları DataGrid
kontrolüne eklenir.
BoundColumn
private void Page_Load(Object sender,
EventArgs e)
{
string connStr = “Provider=Microsoft.Jet.OLEDB.4.0;” +
“Data Source=" & Server.Mappath("./Stok.mdb")
OleDbConnection conn =new OleDbConnection(connStr);
OleDbCommand cmdSelect = new OleDbCommand("Select * From
kitaplar", conn);
conn.Open();
DataGrid1.DataSource = cmdSelect.ExecuteReader();
DataGrid1.DataBind();
conn.Close();
}
Html
<asp:DataGrid ID="DataGrid1"
AutoGenerateColumns="False"
EnableViewState="False" Runat="Server">
<Columns>
<asp:BoundColumn DataField="Kitap_baslik"
HeaderText=”Kitap Adı” />
<asp:BoundColumn DataField="Kitap_yazar"
HeaderText=”Yazar Adı”/>
</Columns>
</asp:DataGrid>
AutoGenerateColumns özelliği varsayılan olarak True değerindedir ve tüm
kolonların otomatik olarak görüntülenmesini sağlar. Örnekte bu özelliğe False
değeri atanmıştır.
BoundColumn kolonunun birçok özelliği vardır.
•
DataField
•
DataFormatString
•
FooterText
•
HeaderImageUrl
•
HeaderText
BoundColumn kolonu, DataGrid kontrolünün Columns etiketi içerisinde
tanımlanmıştır. DataField özelliğinde ise kolon adı belirtilmiştir.
293
Modul 11:
İPUCU: DataGrid içinde görüntülenecek kolonları seçen sql komut
tanımlanırken select * from ... ifadesinden kaçınılmalıdır. Bu komut yerine
sadece ihtiyaç duyulan kolonlar tek tek belirtilmelidir. Aksi halde, Web üzerinde
yayın anında performans kaybı ortaya çıkar. BoundColumn’un DataFormatString
özelliği ise, kolondan alınan ifadenin belirli bir formatta görüntülenmesini sağlar.
Örneğin bir para miktarı söz konusuysa bu özellik kullanılabilir.
<asp:BoundColumn DataField="Kitap_fiyat"
DataFormatString="{0:c}"/>
BoundColumn’un HeadetText, FooterText ve HeaderImageUrl özellikleri,
header, footer alanlarına görüntülenmesi istenilen yazıları, ve başlıkta
görüntülenecek resimi belirler. HeaderText alanına yazılan yazının
görüntülenebilmesi için DataGrid kontrolünün ShowFooter özelliği True
yapılmalıdır. Bu özellik varsayılan olarak False değerindedir. Aynı anda
HeaderImageUrl ve HeaderText özelliklerine değer girildiğinde, resim ve yazı
beraber görüntülenemez.
Örnekte Header alanında hem resim hem de yazı gösterilir
HeaderText="<img src=myImage.Gif>Başlık"
HyperLinkColumn
HyperLinkColumn, kayıtları linkler şeklinde görüntüleyen kolondur. Yani
DataGrid kontrolünde görüntülenen kayıtlar üzerinden başka sayfalara ilgili
linkler verilmek isteniyorsa, HyperLinkColumn kullanılmalıdır. DataGrid
kayıtlarına ilişkin ayrıntılı bilgi verilmek isteniyorsa master/detail formları
şeklinde görüntü vermek için yine bu kolon kullanılabilir.
Örnekte HyperLinkColumn kullanımı gösterilmektedir. DataGrid nesnesi
üzerindeki Detaylar kolunu tıklanarak, detay bilgileri getirilebilir. Bu bilgiler
Detaylar.aspx sayfası üzerinde gösterilir.
Kod 11.7: DataGrid içerisinde HyperLinkColumn kullanımı
private void Page_Load(Object sender,EventArgs e)
{
string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;” +
“Data Source=" & Server.Mappath("./Stok.mdb");
OleDbConnection conn =new OleDbConnection(connStr);
OleDbCommand cmdSelect = OleDbCommand("Select * From” +
“musteri",
conn);
conn.Open();
DataGrid1.DataSource = cmdSelect.ExecuteReader();
DataGrid1.DataBind();
conn.Close();
}
294
Modül 11:
Html
<asp:DataGrid ID="DataGrid1"
AutoGenerateColumns="False" EnableViewState="False"
CellPadding="10" Runat="Server">
<Columns>
<asp:BoundColumn
HeaderText="Müşteri Adı"
DataField="musteri_ad" />
<asp:BoundColumn
HeaderText="Müşteri Soyadı"
DataField="musteri_soyad" />
<asp:HyperLinkColumn
HeaderText="Detaylar"
DataNavigateUrlField="musteri_id"
DataNavigateUrlFormatString="Detaylar.aspx?id={0}"
Text="Detay Görüntüle" />
</Columns>
</asp:DataGrid>
Sayfaya Parametre Yollama
Tablodan genel bilgi verilecek alan belirlenir ve tıklandığı zaman o kolona ait
veri hakkında daha ayrıntılı bilgi görüntülemek için detay sayfasına link verilir.
HyperLinkColumn kolonunda görüntülenen linkler, DataNavigateUrlField,
DataNavigateUrlFormatString ve Text özelliklerine girilen bilgiler ile
yapılandırılır. DataNavigateUrlField linkin adresini, DataTextField link
üzerinde görüntülenecek yazıyı tutar.
HyperLinkColumn kolonunun özellikleri:
•
DataNavigateUrlField
•
DataNavigateUrlFormatString
•
DataTextField
•
DataTextFormatString
•
FooterText
•
HeaderImageUrl
•
HeaderText
•
NavigateUrl
•
Target
•
Text
DataTextField ve DataTextFormatString özellikleri, her bir hyperlink için
farklı etiketler görüntülenmesi için kullanılabilir.
Örnekte HyperLinkColumn kullanımı gösterilmektedir. Site linkleri(link_url) ve
başlıkları(link_title) veritabanındaki linkler tablosundan çekilerek, DataGrid
295
Modul 11:
üzerinde gösterilir. Link_title kolonu site başlıklarının görüntülenmesini sağlar.
Link_title kolunu tıklanarak link_url kolonundaki adres bilgisine yönlendirilir.
Kod 11.8: DataGrid içerisinde HyperLinkColumn kullanımı
private void Page_Load(Object sender, EventArgs e)
{
string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;” +
“Data Source=" + Server.Mappath("./Stok.mdb");
OleDbConnection conn = new OleDbConnection(connStr);
OleDbCommand cmdSelect = OleDbCommand ("Select * From
linkler", conn);
conn.Open();
DataGrid1.DataSource = cmdSelect.ExecuteReader();
DataGrid1.DataBind();
conn.Close();
}
Html
<asp:DataGrid ID="DataGridLink"
AutoGenerateColumns="False" EnableViewState="False"
ShowHeader="False" CellPadding="10" Runat="Server">
<Columns>
<asp:HyperLinkColumn
DataNavigateUrlField="link_url"
DataTextField="link_title" />
</Columns>
</asp:DataGrid>
TemplateColumn
TemplateColumn,
kayıtları bir şablona uyarak görüntüleyen kolondur.
DataGrid hücreleri içinde görüntülenecek verileri çeşitli kontroller kullanarak
ekrana yansıtmak için bu kolon kullanılır. Ancak TemplateColumn, kendi içinde
HeaderTemplate, FooterTemplate, ItemTemplate ve EditItemTemplate
olmak üzere alanlara ayrılır.
Kod 11.9 da TemplateColumn kullanımı gösterilmektedir. TemplateColumn
alanında, kitaba ait yazar ve açıklama bilgileri görüntülenir. Ancak bu iki kolon
bilgileri HTML kodlarıyla alınır.
Kod 11.9: DataGrid içerisinde TemplateColumn kullanımı
private void Page_Load(Object sender, EventArgs e)
{
string connStr= “Provider=Microsoft.Jet.OLEDB.4.0;” +
“Data Source=" + Server.Mappath("./Stok.mdb");
296
Modül 11:
OleDbConnection conn = new OleDbConnection(connStr);
OleDbCommand cmdSelect = OleDbCommand("Select * From
kitaplar",conn);
conn.Open();
DataGrid1.DataSource = cmdSelect.ExecuteReader();
DataGrid1.DataBind();
conn.Close();
}
HTML
<asp:DataGrid ID="DataGrid1"
AutoGenerateColumns="False" EnableViewState="False"
ShowHeader="False" CellPadding="10" Runat="Server">
<Columns>
<asp:BoundColumn
DataField="kitap_baslik" />
<asp:TemplateColumn>
<itemTemplate>
<table>
<tr>
<td>Yazar:</td>
<td><%# DataBinder.Eval( Container.DataItem,
"kitap_yazar" )%></td>
</tr>
<tr>
<td>Açıklama:</td>
<td><%# DataBinder.Eval(Container.DataItem,
"kitap_aciklama" )%></td>
</tr>
</table>
</itemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>
297
Modul 11:
ButtonColumn
ButtonColumn, Button kontrollerinin görüntülenmesini sağlar. Uygulanacak
metot kolon üzerinde, button şeklinde görüntülenir. Örneğin “Sepete Ekle” gibi
bir iş için Button kullanılır ve ButtonColumn içerisinde tanımlanır.
ButtonColumn alanı kullanarak Select ismindeki butona tıklandığı zaman
kontrolün arka plan rengi ve yazı kalınlığı değiştirilir. UnSelect seçildiğinde
kontrol eski haline getirilir.
Kod 11.9: DataGrid içerisinde ButtonColumn kullanımı
private void Page_Load(Object sender, EventArgs e)
{
string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;” +
“Data Source=" + Server.Mappath("./Stok.mdb");
OleDbConnection conn = new OleDbConnection(connStr);
OleDbCommand cmdSelect = OleDbCommand("Select * From
kitaplar", conn);
conn.Open();
DataGrid1.DataSource = cmdSelect.ExecuteReader();
DataGrid1.DataBind();
conn.Close();
}
void DataGrid1_ItemCommand(s, DataGridCommandEventArgs e)
{
if (e.CommandName =="select")
{
e.Item.BackColor = System.Drawing.Color.LightGreen;
298
Modül 11:
e.Item.Font.Bold = true;
}
else
{
e.Item.BackColor = System.Drawing.Color.Blue
e.Item.Font.Bold = False
}
}
HTML
<asp:DataGrid ID="DataGrid1"
OnItemCommand="DataGrid1_ItemCommand"
AutoGenerateColumns="False"
CellPadding="10" Runat="Server">
<Columns>
<asp:BoundColumn
HeaderText="Kitap Adı"
DataField="kitap_baslik" />
<asp:ButtonColumn
CommandName="select"
Text="Select!" />
<asp:ButtonColumn
CommandName="unselect"
Text="UnSelect!" />
</Columns>
</asp:DataGrid>
Select butonuna basıldığında, DataGrid kontrolünün OnItemCommand
özelliğinde belirtilen DataGrid1_ItemCommand isimli metot devreye girer.
ItemCommand olayını tetikleyen DataGrid1_ItemCommand isimli metot, ilgili
işlemleri gerçekleştirir.
Unselect düğmesine tıklandığında ise, yine OnItemCommand özelliğinde
tutulan DataGrid1_ItemCommand metodu devreye girer. Ancak tıklanan
butonun isimlerine göre yapılacak işlem belirlenir.
if (e.CommandName="select")
{
e.Item.BackColor = System.Drawing.Color.LightGreen;
e.Item.Font.Bold = true;
}
else
{
e.Item.BackColor = System.Drawing.Color.White;
e.Item.Font.Bold = False;
}
e.CommandName, hangi buttonun tıklandığını belirtir. Tıklanan butona göre
hangi metodun uygulanacağını belirler.
ButtonColumn özellikleri:
•
ButtonType: LinkButton veya PushButton
299
Modul 11:
•
CommandName
•
DataTextField
•
DataTextFormatString
•
FooterText
•
HeaderImageUrl
•
HeaderText
•
Text
EditCommandColumn
EditCommandColumn, Edit, Update, Cancel gibi düzenleme komutlarının
görüntülenmesini sağlar. EditCommandColumn ile sadece bir
düzenlenebilir. Düzenlemenin veritabanı geçmesi ayrı işlemler gerektirir.
satır
EditCommandColumn kolonunun görüntülediği kayıt, düzenleme için kayıt
seçen DataGrid nesnesinin EditItemIndex özelliğine göre değişecektir.
Düzenleme işleminin seçili olmadığı durumda bu kolonda Edit butonu
gözükür. Edit seçildiği anda ise Update ve Cancel butonları gözükür.
EditCommandColumn özellikleri:
•
ButtonType
•
CancelText
•
EditText
•
FooterText
•
HeaderImageUrl
•
HeaderText
•
UpdateText
300
Modül 11:
DataGrid Kontrolünde Sıralama Ve Sayfalama
DataGrid kontrolünün kolonlarında sıralama yapmak için hazırlanmış özellikler
vardır. İsteğe göre tüm kolonlarda veya sadece belirli kolonlarda sıralama
yapılabilir.
DataGrid içindeki tüm kolonlara sıralama yapma izni vermek için, varsayılan
olarak False olan AllowSorting özelliği True yapılır. Ve SortCommand olayını
tetikleyecek bir metot yazılır.
Kod 11.10: DataGrid içerisinde Sıralama
private void Page_Load(Object sender,EventArgs e)
{
If (! IsPostBack)
{
BindDataGrid( "kitap_baslik" );
}
}
void BindDataGrid(string strSortField)
{
String connStr = "Provider=Microsoft.Jet.OLEDB.4.0;” +
“Data Source=" + Server.Mappath("./Stok.mdb");
OleDbConnection conn = new OleDbConnection(connStr);
OleDbCommand cmdSelect = OleDbCommand("Select * From
Kitaplar Order By " & strSortField, conn );
conPubs.Open("Select * From kitaplar", conn)
conn.Open();
301
Modul 11:
DataGrid1.DataSource = cmdSelect.ExecuteReader();
DataGrid1.DataBind();
conn.Close();
}
void DataGrid1_SortCommand (Object s,
DataGridSortCommandEventArgs e)
{
BindDataGrid( e.SortExpression );
}
Html
<asp:DataGrid ID="DataGrid1"
AllowSorting="True"
OnSortCommand="DataGrid1_SortCommand"
CellPadding="10"
Runat="Server" />
BoundColumn kolonunun SortExpression özelliğine ilgili kolon isimleri girilerek
sıralama yapılacak kolonlar belirtilebilir.
Sayfalama
Sayfalarca uzunluktaki kayıtları bir seferde göstermek yerine sayfalara ayırmak
daha kullanışlı olur. DataGrid kontrolünde sayfalama yapabilmek için
kontrolün AllowPaging özelliği True yapılır. Varsayılan değer False değeridir.
PageIndexChanged olayını tetikleyecek bir metodun yazılması gerekir.
Kod 11.11: DataGrid içerisinde Sayfalama
private void Page_Load(Object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
BindDataGrid();
}
}
void BindDataGrid()
{
string connStr =
"Provider=Microsoft.Jet.OLEDB.4.0;Data
Source='"+Server.MapPath("./Stok.mdb")+"'";
OleDbConnection conn = new OleDbConnection(connStr);
OleDbDataAdapter da = new OleDbDataAdapter("Select *
From Kitaplar Order By Kitap_baslik", conn);
DataSet ds = new DataSet();
da.Fill(ds);
}
private void DataGrid1_PageIndexChanged(object source,
System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
{
DataGrid1.CurrentPageIndex =e.NewPageIndex;
}
html
<asp:DataGrid
ID="DataGrid1"
302
Modül 11:
AllowPaging="True" PageSize="5"
OnPageIndexChanged="DataGrid1_PageIndexChanged"
CellPadding="3" Runat="Server" />
DataGrid kontrolünde sayfalama yapıldığında kayıtlar sayfalara ayrılır ve diğer
sayfalara linkler verilir. PageSize özelliği, bir sayfada kaç kayıt görüntüleneceği
bilgisini tutar.
Sayfalamaya ait stiller, tasarım penceresinde DataGrid kontrolüne sağ tıklanıp
Property Builder ile seçilebilir.
DataGrid Kontrolü Üzerinde Kayıt Düzenleme İşlemleri
DataGrid kontrolünün EditCommand, UpdateCommand ve CancelCommand
olayları kullanılarak DataGrid içinde görüntülenen veriler üzerinde istenilen
değişiklikler yapılabilir. Aynı şekilde kayıt silme işlemi de gerçekleştirilir.
Düzenleme yapılacak kayıt seçildiğinde EditCommand olayı devreye girer.
EditItemIndex özelliği ile düzenleme yapılacak kaydın indeksi alınır ve o
satırdaki tüm veriler TextBox kontrollü biçiminde görünür. Üzerinde düzenleme
yapılmasın istenmeyen kolona, BoundColumn alanının ReadOnly özelliğine
True değeri verilmelidir.
Update düğmesine tıklanlığında ise UpdateCommand olayı devreye girer. İlgili
kaydın Primary Key değeri alınır ve Primary Key ile güncelleme kodu
çalıştırılır.
PlaceHolder Kullanımı
Programın çalışma zamanı sırasında, kullanıcıdan gelecek isteğe göre yeni
kontroller eklenmek isteniyorsa PlaceHolder kontrolü kullanılır. PlaceHolder
kontrolünün amacı, dinamik olarak eklenen bu kontrollerin bir arada
tutulmasıdır. Dinamik olarak oluşturulan kontroller istenildiği gibi dizayn
edilebilir.
<asp:PlaceHolder id="PlaceHolder1" runat="server">
</asp:PlaceHolder>
Çalışma zamanında forma yeni bir kontrol eklemek için Controls.Add()
metodu kullanılır.
Kod 11.12: PlaceHolder Eklemek
private void Page_Load(Object sender, EventArgs e)
{
int i;
Button btnNewButton;
303
Modul 11:
for (i = 1;i<=10;i++)
{
PlaceHolder1.Controls.Add(
New LiteralControl("<p>Alan " & i & ": "));
PlaceHolder1.Controls.Add(New TextBox);
}
btnNewButton = New Button();
btnNewButton.Text = "Tıklayın!";
PlaceHolder1.Controls.Add(btnNewButton);
}
Konu 2: Connected ve Disconnected
Uygulamalar Geliştirme
ADO.NET ile veriye erişmek için Connected ve Disconnected veri erişim
yöntemi kullanılır. Bu yöntemler ile ASP.NET sayfalarında veri alışverişi yapılır.
304
Modül 11:
ASP.NET uygulamaları web sunucuları üzerinde işlem yapacağı için
performans çok önemlidir. Dolayısıyla, çalışma modelinin yerinde seçilmesi
gereklidir. Örneğin veriler sadece görüntülenmek amacıyla alınacaksa
Connected bağlantı modeli kurulmalı ve kaynaklar mümkün olan en az
seviyede tüketilmelidir. Ancak veri üzerinde güncelleme işlemleri söz
konusuysa disconnected bağlantı modeli uygulanmalıdır.
Modul 11:
Namespace
ADO.NET sınıflarını, ASP.NET uygulaması içinde kullanabilmek için
System.Data isimalanı using yapılmalıdır. Ayrıca Access veri tabanına
bağlantı için System.Data.OleDb isimalanı import edilmelidir.
Code behind sayfasında using işlemi, Windows uygulamalarında kullanılan
biçimdedir.
using System.Data;
using System.Data.OleDb;
Inline kod yazımında <%@ %> ifadeleri arasında isim alanları using yapılır.
<%@ using Namespace=”System.Data” %>
<%@ using Namespace=”System.Data.OleDb” %>
305
306
Modül 11:
Modül Özeti
34.
35.
36.
37.
38.
Veri bağlantı kontrolleri nelerdir? Açıklayın
Repeater niçin kullanılır? Açıklayın
DataList niçin kullanılır? Açıklayın
DataGrid niçin kullanılır? Açıklayın
DataGrid ile sayfalama nasıl yapılır?
307
Modul 11:
Bu uygulamada, e-ticaret uygulaması ile Connected ve Disconnected
veritabanı işlemleri gerçekleştirilecektir. Bu uygulamada Uye kayıt ve Uye giriş
işlemlerini gerçekleştirebileceksiniz. Ayrıca kategoriye göre tüm kitapları
listeleyecek ve kitap satın alma işlemini gerçekleştirebileceksiniz.
Bu lab tamamlandıktan sonra:
•
Connect ve Disconnect veritabanı işlemlerini öğreneceksiniz.
•
DataSet içerisindeki veriyi Repeater,
kontrollerinei bağlayabileceksiniz.
DataGrid
ve
DataList
Connect Veritabanı işlemleri
AspEticaret isimli projeyi açın.
UyeKayit formu ile veritabanı işlemlerinin yapılması
UyeKayıt web formunu açın.
UyeKayit web formunun Code Behind kodları aşağıdaki gibi olacaktır.
using System.Data.OleDb ;
private void btnKaydet_Click(System.Object sender,
System.EventArgs e)
{
string connStr= "Provider=Microsoft.Jet.OleDB.4.0;”+
”Data Source=" & Server.MapPath("KitapDb.mdb");
308
Modül 11:
OleDbConnection conn = new OleDbConnection();
conn.ConnectionString = connStr
OleDbCommand comm = new OleDbCommand();
comm.Connection = conn;
comm.CommandType = CommandType.Text;
comm.CommandText = "INSERT INTO
Musteri(Ad,Soyad,Email,Sifre)
values(@ad,@soyad,@email,@sifre)" ;
comm.Parameters.Add("@ad", txtAd.Text);
comm.Parameters.Add("@soyad", txtSoyad.Text);
comm.Parameters.Add("@email", txtEmail.Text);
comm.Parameters.Add("@sifre", txtSifre.Text);
int sonuc;
try
{
conn.Open();
sonuc = comm.ExecuteNonQuery();
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
finally
{
conn.Close();
}
if (sonuc == 1)
{
Response.Redirect("Kayit.aspx");
}
}
UyeGiris formu ile veritabanı işlemlerinin yapılması
UyeGiris web formunu açın.
UyeGiris web formunun Code Behind kodları aşağıdaki gibi olacaktır
using System.Data.OleDb;
private void btnGiris_Click(System.Object sender,
System.EventArgs e)
{
' Session["user"] = "tamer";
string connStr ="Provider=Microsoft.Jet.OleDB.4.0;”+
”Data Source=" + Server.MapPath("KitapDb.mdb");
OleDbConnection conn = new OleDbConnection();
conn.ConnectionString = connStr;
OleDbCommand comm =new OleDbCommand();
comm.CommandType = CommandType.Text;
comm.CommandText =
"Select * from Musteri Where Email=@email and“ +
“Sifre=@sifre";
comm.Connection = conn;
309
Modul 11:
comm.Parameters.Add("@email", txtEmail.Text);
comm.Parameters.Add("@sifre", txtSifre.Text);
bool sonuc;
OleDbDataReader dr = OleDbDataReader();
try
{
conn.Open();
dr = comm.ExecuteReader();
if (dr.HasRows == true)
{
sonuc = true;
if (dr.Read = true)
{
Session["user"] = dr.Item("Email");
Session["ad"] = dr.Item("Ad");
Session["soyad"] = dr.Item("Soyad");
Session["musteriId"] = Item("MusteriID");
}
}
else
{
sonuc = false;
}
dr.Close();
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
finally
{
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
}
if (sonuc == true)
{
Response.Redirect("Default.aspx");
}
Else
{
lblMesaj.Text = "Hatali kullanici adi veya sifre";
}
}
KitapDetay formunun eklenmesi ve veritabanı
işlemlerinin yapılması
ASPEticaret projesine KitapDetay isminde yeni bir web form ekleyin.
Form üzerine, tablodaki kontrolleri ekleyin belirtilen özelliklerini ayarlayın.
Kontrol – Kontrol İsmi
Label – lblKitapAdi
Özellik
Değer
310
Modül 11:
Label – lblYazarAdi
Label – lblFiyat
Label – lblAciklama
Label – lblMesaj
Image – imgResim
TetxBox – txtAdet
Button – btnSatinAl
Text
Satın Al
KitapDetay Web formun Html kodları aşağıdaki gibi olacaktır
<%@ Register TagPrefix="uc1" TagName="yan" Src="yan.ascx" %>
<%@ Page Language="c#" AutoEventWireup="false"
Codebehind="KitapDetay.aspx.cs"
Inherits="AspEticaret.KitapDetay" %>
<%@ Register TagPrefix="uc1" TagName="kategori"
Src="kategori.ascx" %>
<%@ Register TagPrefix="uc1" TagName="Ust" Src="Ust.ascx" %>
<%@ Register TagPrefix="uc1" TagName="Alt" Src="Alt.ascx" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0
Transitional//EN">
<HTML>
<HEAD>
<title>KitapDetay</title>
<meta content="Microsoft Visual Studio .NET 7.1"
name="GENERATOR">
<meta content="C#" name="CODE_LANGUAGE">
<meta content="JavaScript"
name="vs_defaultClientScript">
<meta
content="http://schemas.microsoft.com/intellisense/ie5"
name="vs_targetSchema">
</HEAD>
<body bgColor="#f0fff0">
<form id="Form1" method="post" runat="server">
<TABLE id="Table1" cellSpacing="0" cellPadding="0"
width="700" align="center" border="0">
<TR>
<TD bgColor="#99ccff" colSpan="3"><uc1:ust
id="Ust1" runat="server"></uc1:ust></TD>
Modul 11:
</TR>
<TR>
<TD width="150" vAlign="top"><uc1:kategori
id="Kategori1" runat="server"></uc1:kategori></TD>
<TD vAlign="top" width="400">
<P><BR>
</P>
<P>
<TABLE id="Table2" borderColor="#000033"
cellSpacing="0" cellPadding="0" width="300" align="center"
border="0">
<TR>
<TD width="100" rowSpan="5">
<P align="center"><asp:image
id="imgResim" runat="server"></asp:image></P>
</TD>
<TD>
<P align="center"><asp:label
id="lblKitapAdi" runat="server"></asp:label></P>
</TD>
</TR>
<TR>
<TD>
<P align="center"><asp:label
id="lblYazarAdi" runat="server"></asp:label></P>
</TD>
</TR>
<TR>
<TD>
<P align="center"><asp:label
id="lblFiyat" runat="server"></asp:label></P>
</TD>
</TR>
<TR>
<TD>
<P align="center"><asp:label
id="lblAciklama" runat="server"></asp:label></P>
</TD>
</TR>
<TR>
<TD>
<P align="center">Adet:
<asp:textbox id="txtAdet"
runat="server" Width="68px"></asp:textbox> 
<asp:button id="btnSatinAl"
runat="server" Text="Satın Al"></asp:button></P>
</TD>
</TR>
<TR>
<TD colSpan="2">
<P align="center">
<asp:Label id="lblMesaj"
runat="server"></asp:Label></P>
</TD>
</TR>
</TABLE>
</P>
</TD>
<TD width="150" bgColor="#0099ff" vAlign="top">
<uc1:yan id="Yan1"
runat="server"></uc1:yan></TD>
</TR>
<TR>
311
312
Modül 11:
<TD bgColor="#99ccff" colSpan="3"><uc1:alt
id="Alt1" runat="server"></uc1:alt></TD>
</TR>
</TABLE>
</form>
</body>
</HTML>
KitapDetay web formunun Code Behind kodları aşağıdaki gibi olacaktır.
using System.Data.OleDb ;
string kID;
private void Page_Load(System.Object sender,
System.EventArgs e)
{
If (Session["user"] == "")
{
Response.Redirect("Giris.aspx");
}
kID = Request.Params("kID");
'Response.Write(kID)
string connStr= "Provider=Microsoft.Jet.OleDB.4.0;”+
”Data Source=" + Server.MapPath("KitapDb.mdb");
OleDbConnection conn = new OleDbConnection();
conn.ConnectionString = connStr;
OleDbCommand comm =new OleDbCommand();
comm.CommandType = CommandType.Text;
comm.CommandText =
"Select * from Kitap Where KitapID =@kitapID";
comm.Connection = conn;
comm.Parameters.Add("@kitapID",Convert.ToInt32(kID));
OleDbDataReader dr = OleDbDataReader();
try
{
conn.Open();
dr = comm.ExecuteReader();
if (dr.Read = True)
{
lblKitapAdi.Text = dr.Item("KitapAdi");
lblYazarAdi.Text = dr.Item("Yazar");
lblFiyat.Text = dr.Item("Ucret");
lblAciklama.Text = dr.Item("Aciklama");
imgResim.ImageUrl = "resimler/" +
dr.Item("Image");
}
dr.Close();
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
finally
{
If (conn.State == ConnectionState.Open)
{
313
Modul 11:
conn.Close();
}
}
}
private void btnSatinAl_Click(System.Object sender,
System.EventArgs e)
{
if (txtAdet.Text == "")
{
lblMesaj.Text = "Adet Giriniz";
return;
}
string connStr = “Provider=Microsoft.Jet.OleDB.4.0;”+
”Data Source=" + Server.MapPath("KitapDb.mdb");
OleDbConnection conn = new OleDbConnection();
conn.ConnectionString = connStr;
OleDbCommand comm = new OleDbCommand();
comm.Connection = conn;
comm.CommandType = CommandType.Text;
comm.CommandText = "INSERT INTO
Siparis(MusteriID,SiparisTarihi,KitapID,Adet)
values(@MusteriID,@SiparisTarihi,@KitapID,@Adet)";
comm.Parameters.Add("@MusteriID",
Session["musteriId"]);
comm.Parameters.Add("@SiparisTarihi",
DateTime.Now.ToShortDateString);
comm.Parameters.Add("@KitapID", CInt(kID));
comm.Parameters.Add("@Adet", txtAdet.Text);
int sonuc
try
{
conn.Open();
sonuc = comm.ExecuteNonQuery();
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
finally
{
conn.Close();
}
if (sonuc = 1)
{
Response.Redirect("Satis.aspx");
}
}
Disconnect Veritabanı işlemleri
AspEticaret isimli projeyi açın.
314
Modül 11:
Default formunun eklenmesi ve veritabanı
işlemlerinin yapılması
ASPEticaret projesine Default isminde yeni bir web form ekleyin.
Form üzerine, tablodaki kontrolleri ekleyin belirtilen özelliklerini ayarlayın.
Kontrol – Kontrol İsmi
Özellik
Değer
DataGrid – dgEncokSatanlar
Default Web formun Html kodları aşağıdaki gibi olacaktır.
<%@ Register TagPrefix="uc1" TagName="yan" Src="yan.ascx" %>
<%@ Page Language="cs" AutoEventWireup="false"
Codebehind="Default.aspx.cs" Inherits="AspEticaret._Default"
%>
<%@ Register TagPrefix="uc1" TagName="kategori"
Src="kategori.ascx" %>
<%@ Register TagPrefix="uc1" TagName="Ust" Src="Ust.ascx" %>
<%@ Register TagPrefix="uc1" TagName="Alt" Src="Alt.ascx" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0
Transitional//EN">
<HTML>
<HEAD>
<title>Default</title>
<meta name="GENERATOR" content="Microsoft Visual
Studio .NET 7.1">
<meta name="CODE_LANGUAGE" content="C#">
<meta name="vs_defaultClientScript"
content="JavaScript">
<meta name="vs_targetSchema"
content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body bgColor="honeydew">
<form id="Form1" method="post" runat="server">
<TABLE id="Table1" cellSpacing="0" cellPadding="0"
width="700" align="center" border="0">
<TR>
<TD bgColor="#99ccff" colSpan="3">
Modul 11:
<uc1:Ust id="Ust1"
runat="server"></uc1:Ust></TD>
</TR>
<TR>
<TD width="150" vAlign="top">
<uc1:kategori id="Kategori1"
runat="server"></uc1:kategori></TD>
<TD width="400" vAlign="top">
<P>
<TABLE id="Table2" cellSpacing="0"
cellPadding="0" width="350" align="center" border="0">
<TR>
<TD style="HEIGHT: 55px">
<P align="center">En Çok
Satanlar</P>
</TD>
</TR>
<TR>
<TD>
<DIV align="center">
<asp:DataGrid
id="dgEncokSatanlar" runat="server"
AutoGenerateColumns="False" Width="253px" BorderWidth="1px"
BorderColor="#003333">
<HeaderStyle FontBold="True"></HeaderStyle>
<Columns>
<asp:HyperLinkColumn
DataNavigateUrlField="KitapID"
DataNavigateUrlFormatString="Kitapdetay.aspx?KID={0}"
DataTextField="KitapAdi" HeaderText="Kitap Adi">
<HeaderStyle
Width="275px"></HeaderStyle>
</asp:HyperLinkColumn>
<asp:BoundColumn
DataField="Ucret" HeaderText="Fiyati">
<HeaderStyle
Width="75px"></HeaderStyle>
</asp:BoundColumn>
</Columns>
</asp:DataGrid></DIV>
</TD>
</TR>
<TR>
<TD></TD>
</TR>
</TABLE>
</P>
</TD>
<TD width="150" bgColor="#0099ff" vAlign="top">
<uc1:yan id="Yan1"
runat="server"></uc1:yan></TD>
</TR>
<TR>
<TD colSpan="3" bgColor="#99ccff">
<uc1:Alt id="Alt1"
runat="server"></uc1:Alt></TD>
</TR>
</TABLE>
 
</form>
</body>
</HTML>
315
316
Modül 11:
DataSet içerisine DataTable Eklenmesi
12. Server Explorer penceresinden DataConnections seçeneğini seçin
13. Veritabanı tablo ve sorgularına erişmek için oluşturduğumuz, bağlantı
içerisinden Views seçeneğini seçin.
14. Views içerisindeki EnCokSatanlar sorgusunu dsBook nesnesinin içerisine
sürükleyin.
Default web formunun Code Behind kodları aşağıdaki gibi olacaktır.
using System.Data.OleDb;
private void Page_Load(System.Object sender,
System.EventArgs e)
{
if(!Page.IsPostBack)
{
string connStr =
"Provider=Microsoft.Jet.OleDB.4.0;Data Source=" +
Server.MapPath("KitapDb.mdb");
OleDbConnection conn = new OleDbConnection();
conn.ConnectionString = connStr;
OleDbCommand comm = new OleDbCommand();
comm.CommandType = CommandType.Text;
comm.CommandText = "SELECT Kitap.KitapAdi, "+
"Kitap.Ucret, Kitap.KitapID FROM Kitap INNER JOIN Siparis "+
"ON Kitap.KitapID = Siparis.KitapID GROUP BY "+
"Kitap.KitapAdi, Kitap.Ucret, Kitap.KitapID ORDER BY"+
"Count(Siparis.Adet) DESC";
comm.Connection = conn;
OleDbDataAdapter da = new OleDbDataAdapter();
da.SelectCommand = comm;
DataSet ds = new DataSet();
try
{
conn.Open();
da.Fill(ds, "EnCokSatanlar");
dgEncokSatanlar.DataSource =
ds.Tables["EnCokSatanlar"];
dgEncokSatanlar.DataBind();
}
catch(Exception ex)
{
Response.Write(ex.Message);
}
finally
{
if(conn.State == ConnectionState.Open)
{
conn.Close();
317
Modul 11:
}
}
}
}
Kitap formunun eklenmesi ve veritabanı
işlemlerinin yapılması
ASPEticaret projesine Kitap isminde yeni bir web form ekleyin.
Form üzerine, tablodaki kontrolleri ekleyin belirtilen özelliklerini ayarlayın.
Kontrol – Kontrol İsmi
Özellik
Değer
DataList – dlKitap
RepeatColumns
2
Kitap Web formun Html kodları aşağıdaki gibi olacaktır.
<%@ Register TagPrefix="uc1" TagName="Alt" Src="Alt.ascx" %>
<%@ Register TagPrefix="uc1" TagName="Ust" Src="Ust.ascx" %>
<%@ Register TagPrefix="uc1" TagName="kategori"
Src="kategori.ascx" %>
<%@ Page Language="cs" AutoEventWireup="false"
Codebehind="Kitap.aspx.cs" Inherits="AspEticaret.Kitap" %>
<%@ Register TagPrefix="uc1" TagName="yan" Src="yan.ascx" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0
Transitional//EN">
<HTML>
<HEAD>
<title>Kitap</title>
<meta content="Microsoft Visual Studio .NET 7.1"
name="GENERATOR">
<meta content="C#" name="CODE_LANGUAGE">
<meta content="JavaScript"
name="vs_defaultClientScript">
<meta
content="http://schemas.microsoft.com/intellisense/ie5"
name="vs_targetSchema">
318
Modül 11:
</HEAD>
<body bgColor="#f0fff0">
<form id="Form1" method="post" runat="server">
<TABLE id="Table1" cellSpacing="0" cellPadding="0"
width="700" align="center" border="0">
<TR>
<TD bgColor="#99ccff" colSpan="3"><uc1:ust
id="Ust1" runat="server"></uc1:ust></TD>
</TR>
<TR>
<TD width="150" vAlign="top"><uc1:kategori
id="Kategori1" runat="server"></uc1:kategori></TD>
<TD vAlign="top" align="center" width="400">
<asp:datalist id="dlKitap" runat="server"
RepeatColumns="2">
<ItemTemplate>
<table width="180">
<tr align="center">
<td>
<a
href='KitapDetay.aspx?kID=<%#
databinder.eval(Container.dataitem,"KitapID") %>'><img
border=0 src='resimler/<%#
databinder.eval(Container.dataitem,"Image") %>'>
</a>
</td>
</tr>
<tr align="center">
<td>
<%#
databinder.eval(Container.dataitem,"KitapAdi") %>
</td>
</tr>
<tr align="center">
<td>
<%#
databinder.eval(Container.dataitem,"Yazar") %>
</td>
</tr>
<tr align="center">
<td>
<%#
databinder.eval(Container.dataitem,"Ucret") %>
</td>
</tr>
</table>
</ItemTemplate>
</asp:datalist>
</TD>
<TD width="150" bgColor="#0099ff" vAlign="top">
<uc1:yan id="Yan1"
runat="server"></uc1:yan></TD>
</TR>
<TR>
<TD bgColor="#99ccff" colSpan="3"><uc1:alt
id="Alt1" runat="server"></uc1:alt></TD>
</TR>
</TABLE>
</form>
</body>
</HTML>
319
Modul 11:
DataSet içerisine DataTable Eklenmesi
1. Server Explorer penceresinden DataConnections seçeneğini seçin
2. Veritabanı tablo ve sorgularına erişmek için oluşturduğumuz, bağlantı
içerisinden Tables seçeneğini seçin.
3. Tables içerisindeki Kitap tablosunu dsBook nesnesinin içerisine sürükleyin.
Kitap web formunun Code Behind kodları aşağıdaki gibi olacaktır.
using System.Data.OleDb
private void Page_Load(System.Object sender,
System.EventArgs e)
{
string kategoriID = Request.Params["KategoriID"];
Session["KategoriID"] = kategoriID;
//Response.Write(kategoriID)
string connStr =
"Provider=Microsoft.Jet.OleDB.4.0;Data Source=" +
Server.MapPath("KitapDb.mdb");
OleDbConnection conn = new OleDbConnection();
conn.ConnectionString = connStr;
OleDbCommand comm = new OleDbCommand();
comm.CommandType = CommandType.Text;
comm.CommandText = "Select * from Kitap Where" +
"KategoriID =@kID";
comm.Connection = conn;
comm.Parameters.Add("@kID",
Convert.ToInt32(kategoriID));
OleDbDataAdapter da = new OleDbDataAdapter();
da.SelectCommand = comm;
DataSet ds = new DataSet();
try
{
conn.Open();
da.Fill(ds, "Kitap");
dlKitap.DataSource = ds.Kitap;
dlKitap.DataBind();
}
catch(Exception ex)
{
Response.Write(ex.Message);
}
finally
{
if(conn.State == ConnectionState.Open)
{
conn.Close();
}
}
}
320
Modül 11:
Modul 12:
Modül 12: ASP.NET ile Durum Yönetimi
Bu modülde ASP.NET Web uygulamalarında kullanılan durum yönetimi
üzerinde durulacaktır. Durum yönetim alt yapısı kullanılarak uygulama
seviyesinde veri paylaşımı gerçekleştirilebilir.
322
Modül 12:
Bu modül tamamlandıktan sonra:
•
ASP.NET Web uygulamalarında kullanılan durum yönetim alt yapısını
tanımlayabilecek,
•
Application ve Session ile web uygulamalarını yönetebilecek,
•
Cookies ve Cookieless Session kavramlarını açıklayabileceksiniz.
Durum Yönetimi
Web formları stateless çalışır. Yani kullanıcılardan gelen isteklerin nereden
geldiği anlaşılmaz. Web sunucusuna yapılan her istekte web formlar yeniden
oluşturulur.
ASP.NET, sunucuda uygulamaya ait özel bilgileri tutan ve sayfalar arası veri
aktarımı gerçekleştiren bir altyapı sağlar.
323
Modul 12:
Sayfalar arası state yönetimi sayesinde sunucuda tutulan bilgiler yeniden
kullanılabilir. Böylece veriler sunucuya gönderilip geri geldiğinde kullanıcının
yeniden veri girişi yapmasına gerek kalmaz.
Örneğin bir Login sayfasına “Bilge” kullanıcı ismiyle giriş yapıldıktan sonra,
diğer sayfalarda “Merhaba Bilge” mesajını verilebilir. Bu mesajı göstermek için
“Bilge” kullanıcı adı State yönetimi ile bir değişkende tutulmalıdır.
Sunucu taraflı durum yönetimi birden fazla yönetim seçeneği sunar.
•
Application state
• Session state
Kullanıcı taraflı durum yönetimi ise genellikle cookie nesneleri ile sağlanır.
324
Modül 12:
Konu 1: Session
Kullanıcı bilgisayarı ve web sunucusu arasında kurulan bağlantıya session
denir. Bir session, birden fazla web sayfasını kapsayabilir. Kullanıcının web
uygulamasına girişi ile çıkışı arasında tutulan değişkenlerdir ve bu değişkenler
kullanıcıya özeldir.
Session değişkenlerine, uygulama süresince erişilip gerekli bilgiler hızlı bir
şekilde kullanılabilir. Sayfalar arası bilgi aktarmak için pratik bir yöntemdir.
Veritabanına bağlantı kurularak alınan ve uygulama içinde sürekli kullanılan
bilgiler session değişkenleri içinde tutulur.
ASP.NET session değişkenlerini yönetirken HttpSessionState sınıfını
kullanır.
Modul 12:
Kullanıcı web sunucusuna bağlanıp bir ASP.NET sayfası görüntülemeyi talep
ettiği zaman, sunucu, kullanıcıya bir SessionID atar ve bu değeri kullanıcıya
gönderir. Kullanıcı uygulamadan çıkana kadar bu SessionID değişkeni
sunucuda tutulur.
Kod 12.1: SessionID
private void Page_Load(Object sender,EventArgs e)
{
Response.Write(Session.SessionID);
}
Kod 12.2: Session Nesnesini kullanmak
Login.aspx sayfası
private void BtnGiris_Click(Object sender, EventArgs e)
{
Session[“ad”] = TxtAd.Text;
Response.Redirect(“Sayfam.aspx”);
}
Sayfam.aspx sayfası
private void Page_Load(Object sender,EventArgs e)
{
lblAd.Text = Session[“ad”] + “Hoş Geldiniz”;
}
ASP.NET uygulamalarının, Session değişkenlerine ait çeşitli özellikleri,
web.config dosyası içinde tanımlanır.
325
326
Modül 12:
<sessionState
mode="InProc"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data
source=127.0.0.1;Trusted_Connection=yes"
cookieless="false"
timeout="20"
/>
‘in varsayılan attribute değerleri Visual Studio.NET
tarafından atanmıştır.
SessionState
Mode: session değerlerinin nerede tutulacağını belirler. InProc, değerler IIS
içinde saklanır. StateServer değerler sunucuda arka planda çalışan ASP.NET
state servisinde saklanır. SqlServer, değerler SQL Server içindeki tablolarda
saklar.
Cookieless: Varsayılan olarak False değerini alır. Session değişkenlerinin
kullanıcı bilgisayarında cookie içinde tutulmasını belirler. True değeri
verildiğinde ise SessionID değeri URL’ye eklenerek kullanıcıya geri yollanır.
Timeout: Session değişkenlerinin yaşam süresini belirler. Varsayılan olarak
20 dakikadır.
Bazı tarayıcıların cookie desteği olmadığı düşünüldüğünde, kullanıcıya ait
bilgileri session değişkenlerinde tutmak daha geçerli olacaktır.
Session Değişkenine İlk Değer Vermek
Global.asax dosyasında, Session nesnesinin Start olay prosedürü içinde ilk
değer verme işlemleri gerçekleştirilebilir.
Kod 12.3’ de Session_Start olayının kullanımı gösterilmektedir.
Kod 12.3: Session_Start
void Session_Start(Object Sender,EventArgs e)
{
Session[“ArkaPlan”] = “blue”;
Session[“Yazi”] = “gray”;
}
Konu 2: Cookie
Kullanıcı taraflı durum yönetimi için cookie değişkenleri kullanılır. Internet
sitelerinin çoğu istemci bilgisayarda cookie denilen küçük metin dosyaları
Modul 12:
oluşturur. Microsoft XP, Windows 2000 sistemlerinde cookie nesneleri
“C:\Documents And Settings\Kullanıcı Adı\Cookies” klasöründe saklanır. Bir
siteye ilk defa giriş yapıldığında cookie oluşur. Daha sonra tekrar giriş
yapıldığında cookie içindeki değerler okunur ve bu değerlere göre gerekli
işlemler yapılır. Örneğin üyelik sistemi içeren web sitelerindeki “Beni Hatırla”
seçeneği bu mantıkla çalışır.
ASP.NET Cookie değişkenlerini yönetirken HttpCookie sınıfını kullanır.
Cookie değişkenleri için yazma ve okuma işlemleri yapılırken Response ve
Request nesneleri kullanılır.
Örnek:
Kullanıcı adı girilip “Cookie yap” butonuna tıklanınca kullanıcı tarafında bir
cookie oluşturuluyor. “Cookie oku” butonuna tıklandığında ise oluşturulan
cookie nesnesinden veri alınıyor.
Şekil 2.1: Cookie kullanımı
Kod 12.4: Cookie oluşturup okumak
private void btnYap_Click(System.Object sender,
System.EventArgs e)
{
// Cookie oluşturmak için verilen direktif.
HttpCookie mycookie = new HttpCookie("sitem");
// Formdan Gelen Bilgileri Anahtarlara Yazar.
mycookie["ad"] = txtad.Text;
// Cookie'nin Bitiş Süresi.
mycookie.Expires = DateTime.Now.AddDays(30);
// Cookie'yi Gönder.
Response.Cookies.Add(mycookie);
}
private void btnOku_Click(System.Object sender,
System.EventArgs e)
{
' Cookie'yi oluşturur.
HttpCookie mycookie;
' Cookie'yi kullanıcı tarafından alır.
myCookie = Request.Cookies("sitem");
' Cookie'den gelen değerlerle formu doldurur.
txtad2.Text = mycookie("ad");
327
328
Modül 12:
}
Cookie Türleri
İki tür Cookie vardır:
•
Temporary (Geçici)
Temporary
cookie nesneleri, session
cookie veya non-persistent
cookie olarak da isimlendirilir. Bu cookie ‘ler sadece tarayıcının hafızasında
tutulup, tarayıcı kapatıldığında tüm temporary cookie nesneleri hafızadan
atılırlar.
•
Persistent (Kalıcı)
329
Modul 12:
Persistent
cookie nesneleri, temporary
cookie nesnelerinden farklı
olarak hafızadan silineceği zamanı tutan bir değişkene sahiptirler. Tarayıcı,
kalıcı bir cookie isteğinde bulunan bir sayfa açtığında, cookie sabit diske
yazılır. Bu tür cookie nesneleri kullanıcı bilgisayarında istenilen sürede
tutulabilir.
Cookie nesnelerinin diskte tutulacağının garantisi yoktur. Kullanıcı sabit
diskinden bu dosyaları silmiş olabilir.
330
Modül 12:
Konu 3: Application
Application nesnesinin tanımlanması session nesnesine benzer. Ancak
kullanım alanı çok farklıdır. Web uygulamasına giriş yapan ilk kullanıcıdan son
kullanıcıya kadar devam eder. Tüm kullanıcılara ait olan bir değişkendir.
Örneğin sitenin kaç kişi tarafından ziyaret edildiği, Application nesnesinde bir
değişken tanımlanarak belirlenebilir. Application değişkenini kullanırken
lock yaparak başka kullanıcıların kullanması engellenir ve değişken ile işiniz
sonra unlock yapılmalıdır.
Modul 12:
Session kullanıcıya özgü değişkenleri tutarken Application uygulamanın
kendisine ait değişkenleri tutar.
ASP.NET Application değişkeni kullanırken HttpApplicationState sınıfını
kullanır.
Kod 12.4: Application Değişkeni
Void Session_Start (Object sender, EventArgs e)
If (Application("ziyaret") == null)
{
Application("ziyaret") = 0;
}
Application.Lock();
Application("Ziyaret") = Application("Ziyaret") + 1;
Application.UnLock();
TextBox1.Text = "Ziyaret Sayısı: " +
Application("ziyaret").ToString();
}
Bu örnekte her bir yeni session açıldığında, yani siteye her istek yapıldığında
ziyaretçi sayısı birer artırılmaktadır.
Application değişkeni doldurulduktan sonra uygulama içinden çağırmak için
Application(“degisken_ismi”) ifadesi kullanılır.
Application Değişkenine İlk Değer Vermek
Global.asax dosyasında, Application nesnesinin Start olay prosedürü
içinde başlangıç değerleri verilir. Bu olay prosedürü uygulama çalışmaya
331
332
Modül 12:
başladığında ve ilk istek geldiğinde çalışır. Application değişkeni Web
uygulaması kaldırıldığında sonlanır.
Kod 12.5’de Application_Start olayının kullanımına örnek verilmiştir.
Kod 12.5: Application_Start
void Application_Start(Object sender,EventArgs e)
{
Application(“ziyaret”) = 0;
}
Konu 4: Global.asax
Sadece sunucu üzerindeki uygulama üzerinde çalışabilen bir dosyadır.
Global.asax, ASP.NET web uygulamasının çalıştığı sırada, çeşitli olayları ele
alacak bir dosyadır.
Bu dosyanın birçok özelliği vardır.
•
Her bir web uygulamasına ait bir global.asax dosyası vardır.
•
Global.asax dosyası, web uygulamasına ait sanal dosya içinde
saklanır.
•
Uygulamaya ait application ve session değişkenlerine ilk değer
vermek için kullanılan başlangıç ve bitiş olaylarını tutar.
•
Bu dosyanın tanımlanması isteğe bağlıdır. Eğer bu dosya projede
bulunmuyorsa, ASP.NET hiçbir application ve session olay
prosedürü tanımlanmamış varsayar.
333
Modul 12:
Global.asax dosyasında desteklenen olaylar üç kategoride toplanabilir:
•
Sayfaya bir istekte bulunulduğunda
•
İstekte bulunan sayfa istemciye yollandığında
•
Koşullu application olayları gerçekleştiğinde
Koşullu application olayları ise tablo 12.1’ de listelenmiştir.
Olay ismi
Açıklama
Application_Start Uygulamanın ilk çalışmaya başladığında çalışır.
Application_End
Uygulama sona erdiğinde çalışır.
Session_Start
Yeni bir session oluştuğunda çalışır.
Session_End
Session kapandığında çalışır.
Application_Error Uygulamanın çalışması sırasında bir hata
oluştuğunda çalışır.
Tablo 12.1: Koşullu Application olayları
334
Modül 12:
Modül Özeti
39.
Session niçin kullanılır?
40. Cookie niçin kullanılır?
41. Cookie türleri nelerdir?
42. Application niçin kullanılır?
335
Modul 12:
Lab 1: E-Ticaret Uygulaması Geliştirmek
Bu uygulamada session nesnesi ile KitapDetay sayfasına erişim
engelenecektir. KitapDetay sayfasına sadece sisteme giriş yapan kullanıcılar
erişebilecektir.
Bu lab tamamlandıktan sonra:
•
Session kullanımını öğreneceksiniz.
Session kullanmak
AspEticaret isimli projeyi açın.
UyeGiris formu içerinde Session Kullanmak
UyeGiris web formunu açın.
UyeGiris web formunun Code Behind kodları aşağıdaki gibi olacaktır. UyeGiris
kod dosyası içerisindeki işaretli satırlar, veri tabanı içerisinden çekilen kayıtların
session değişkenlere aktarılmasını sağlar.
using System.Data.OleDb
private void btnGiris_Click(System.Object sender,
System.EventArgs e)
{
' Session["user"] = "tamer";
336
Modül 12:
string connStr =
“Provider=Microsoft.Jet.OleDB.4.0;Data Source="
+ Server.MapPath("KitapDb.mdb");
OleDbConnection conn = new OleDbConnection();
conn.ConnectionString = connStr;
OleDbCommand comm = new OleDbCommand();
comm.CommandType = CommandType.Text;
comm.CommandText = "Select * from Musteri “
+ ”Where Email=@email and Sifre=@sifre";
comm.Connection = conn;
comm.Parameters.Add("@email", txtEmail.Text);
comm.Parameters.Add("@sifre", txtSifre.Text);
Boolean sonuc;
OleDbDataReader dr;
try
{
conn.Open();
dr = comm.ExecuteReader();
if (dr.HasRows == True)
{
sonuc = True;
if (dr.Read == True )
{
Session["user"] = dr.Item("Email");
Session["ad"] = dr.Item("Ad");
Session["soyad"] = dr.Item("Soyad");
Session["musteriId"] = dr.Item("MusteriID");
}
}
else
{
sonuc = False;
}
dr.Close();
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
finally
{
If (conn.State == ConnectionState.Open)
{
conn.Close();
}
}
if (sonuc == True )
{
Response.Redirect("Default.aspx")
}
else
{
lblMesaj.Text = "Hatali kullanici adi veya sifre";
}
}
337
Modul 12:
KitapDetay formu içerinde Session Kullanmak
KitapDetay web formunu açın.
KitapDetay web formunun Code Behind kodları aşağıdaki gibi olacaktır.
KitapDetay kod dosyası içerisindeki işaretli satırlar, kullanıcının sisteme girişini
kontrol etmektedir. Eğer kullanıcı sisteme giriş yapmadıysa, user değişkeni
içerisine değer aktarılmaz. Bu durum kullanıcının Giris.aspx sayfasına
yönlendirilmesine sebeb olur.
using System.Data.OleDb
string kID
private void Page_Load(System.Object sender,
System.EventArgs e)
{
if (Session["user"] == "" )
{
Response.Redirect("Giris.aspx");
}
kID = Request.Params("kID");
'Response.Write(kID)
string connStr =
"Provider=Microsoft.Jet.OleDB.4.0;Data Source=" +
"Server.MapPath("KitapDb.mdb");
OleDbConnection conn ;
conn.ConnectionString = connStr;
OleDbCommand comm = new OleDbCommand();
comm.CommandType = CommandType.Text;
comm.CommandText =
"Select * from Kitap Where KitapID =@kitapID" ;
comm.Connection = conn ;
comm.Parameters.Add("@kitapID",Convert.ToInt32(kID));
OleDbDataReader dr = new OleDbDataReader();
Try
{
conn.Open();
dr = comm.ExecuteReader()
If (dr.Read == true)
{
lblKitapAdi.Text = dr.Item("KitapAdi");
lblYazarAdi.Text = dr.Item("Yazar");
lblFiyat.Text = dr.Item("Ucret");
lblAciklama.Text = dr.Item("Aciklama");
imgResim.ImageUrl = "resimler/" +
dr.Item("Image");
}
dr.Close();
Catch (Exception ex)
{
Response.Write(ex.Message);
}
finally
338
Modül 12:
{
If (conn.State = ConnectionState.Open)
{
conn.Close();
}
}
}
Ust kullanıcı kontrolu içerisinde Session
kullanmak
Ust kullanıcı kontrolunu açın.
Ust kullanıcı kontrolunün Code Behind kodları aşağıdaki gibi olacaktır. Ust kod
dosyası içerisindeki işaretli satırlar, session değişkenin değerini lblAd isimli
etikete yazmaktadır.
private void Page_Load(System.Object sender,
System.EventArgs E)
{
if (Session["user"] != "" )
{
lblAd.Text = "Bay / Bayan : " + Session["ad"] + "
" + Session["soyad"];
btnCikis.Visible = true ;
}
else
{
btnCikis.Visible = false;
}
}
btnCikis butonunundaki işaretli kod satırları, tüm session değişkenlerin değerini
sıfırlar.
private void btnCikis_Click(System.Object sender,
System.EventArgs e)
{
Session.Abandon() ;
btnCikis.Visible = false;
Response.Redirect("Default.aspx");
}
Download