c# yazilim uzmani - bilge adam 670 sayfa

670
Modül 1: Programlamaya giriş Program nedir? Programcı kimdir? Programlama Dilleri Programlama Dillerinin Tarihçesi Programın Derlenmesi Hedefler 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.

Upload: etiken

Post on 27-Jun-2015

7.878 views

Category:

Documents


19 download

TRANSCRIPT

Page 1: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modül 1: Programlamaya giriş

Program nedir?Programcı kimdir?Programlama DilleriProgramlama Dillerinin TarihçesiProgramın Derlenmesi

Hedefler

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.

Page 2: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

2 Modül 1: Programlamaya Giriş

Konu 1: Program nedir?

Bilgisayarın, bir işi yapması için tasarlanan komutlar zinciri

Program TürleriSistem ProgramlarSü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.

Page 3: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 3

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ı

Bilgisayar

PrinterVeri girişi

İşlem

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

Page 4: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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: ATM makinesinden para çekmek

1. Kullanıcı ATM makinesine kartını yerleştirir 2. Şifresini girer. 3. ATM cihazında çalışan uygulama kartta yazan bilgileri okur 4. Şifre kontrolü işlemi yapılır. 5. Şifre doğru girilmişse kullanıcı çekmek istediği miktarı girer. 6. Bankadaki hesap kontrol edilir. 7. Uygunsa kullanıcıya ödeme yapar.

Konu 2: Programcı Kimdir?

Belirli işlevlere sahip programlar geliştirirKullanılan teknolojiyi, platformu iyi tanıması gerekir

Programcı türleriMimarGeliştiriciTest 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.

Page 5: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 5

• Geliştirici Programı yazan kişidir.

• Test mühendisi Programın geliştirilmesi aşamasında, hatanın kaynaklarını bulan ve geliştiricilere raporlayan programcıdır. (Ref: MOC 2667 Introduction to Programming - Module 1 - sayfa 9)

Konu 3: Programlama Dilleri

Programcı ile bilgisayarın haberleşmesini sağlarProgramlar 1 ve 0 sayılarından oluşan makine diline çevrildikten sonra çalıştırılırProgramlama Dilinin özellikleri:

Sözdizimi (Syntax)GramerSemantik

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.

Page 6: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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. (Ref: http://www.oreilly.com/pub/a/oreilly/news/languageposter_0504.html)

Page 7: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 7

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, 11011110Yordamların (Subroutine) ve Kütüphanelerin (Library) oluşması1957 FORTRAN1959 COBOL1968 Pascal1972 C Nesneye Yönelik Programlama Dilleri:

C++, JAVA2000 .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ı

Page 8: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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)

Page 9: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 9

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: Makine Dili:

011010101011010101011010101111

DerlemeSonuç

Çalıştırma

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.

Page 10: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

10 Modül 1: Programlamaya Giriş

Modül Sonu Soruları & Alıştırmalar

Program nedir?Programcı kimdir?Programlama DilleriProgramlama Dillerinin TarihçesiProgramın Derlenmesi

Özet

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?

Page 11: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

Page 12: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 13: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 3

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ı.

Page 14: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modül 3: Microsoft Visual Studio Arayüzü

Visual Studio çalışma ortamıStart PageMenülerSolution Explorer PaneliToolbox PaneliProperties PaneliHelp Kullanımı

Hedefler

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.

Page 15: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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ülerPaneller

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 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)

o 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.

o 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.

Page 16: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 3

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.

o 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 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.

o 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.

o Araç çubuğuna sağ tıklayın. Listenin en altındaki Customize (özelleştir) komutunu seçin.

o 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.

Page 17: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 Options

File Exit

View Show Web Browser

Window Close All Documents

o Araç çubuğunu, çalışma ortamının altına taşıyarak sabitleyin. o 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

Page 18: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 5

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 Auto Hide düğmesine basarak paneli gizleyin. o 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.

o 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.

o Panel seçili iken, Window menüsünden Hide komutunu seçin. Paneli tekrar açmak için bu etapları tekrarlayın.

Page 19: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

6 Modül 3: Microsoft Visual Studio Arayüzü

Konu 2: Start Page

Visual Studio ortamının başlangıçsayfasıdır

ProjectsOluşturulan Visual Studio projeleri listesi

Online Resourcesİnternet üzerindeki kaynaklarKod ö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.

Page 20: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 7

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.

Page 21: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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, EditDosya, metin düzeni işlemleri

View, WindowPaneller, çalışma sayfaları görünümleri

Project, Build, DebugProje, 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

Page 22: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 9

o Outlining ile metinleri gruplama işlemleri o 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 Tools menüsünden Options komutunu seçin. o Sol panelde bulunan Environment menüsünden Fonts and

Colors (Yazı düzeni ve Renkler) sekmesine gelin. o 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.

Page 23: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

10 Modül 3: Microsoft Visual Studio Arayüzü

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.

o 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.

Page 24: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 11

Konu 4: Solution Explorer Paneli

Visual Studio projeleri, bir “Solution”altında toplarSolution içinde bulunan tüm dosyalar, klasörler görüntülenirPanele 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.)

Page 25: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 listelenirNesneler, sekmeler halinde gruplanır

Windows Forms, Web Forms, ClipBoard Ring

Visual Basic profilinde, CTRL-ALT-X ile ulaşılır

Page 26: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 13

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 View menüsünden Toolbox panelini seçin o Panelde herhangi bir yere sağ tıklayın ve Show All Tab (Bütün Sekmeleri

Göster) komutunu seçin o 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. o “Metin Kutusu” nesnesini taşıyarak sekmenin en üstüne getirin.

Page 27: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

14 Modül 3: Microsoft Visual Studio Arayüzü

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.

o Panele sağ tıklayın ve Add Tab (Sekme Ekle) komutunu seçin. Sekmeye “Medya” ismini verin.

o 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.

Page 28: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 15

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.

Page 29: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

16 Modül 3: Microsoft Visual Studio Arayüzü

Konu 7: Help Kullanımı

En sık kullanılan kaynaktırMSDN (Microsoft Developer Network) kütüphaneleri Dynamic Help

İçeriği, seçilen nesnelere göre değişirF1 ile dinamik yardım

SearchZengin arama seçenekleri

IndexAlfabetik konu dizini

ContentsMSDN 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 Also) 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. 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.

Page 30: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 17

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.

Page 31: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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?

Page 32: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 19

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.

Page 33: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

Visual Studio çalışma ortamıStart PageMenülerSolution Explorer PaneliToolbox PaneliProperties PaneliHelp Kullanımı

Özet

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?

Page 34: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modül 4: Visual C# .NET İle Windows Tabanlı Programlama

Windows Tabanlı UygulamalarÖzellikler, Metotlar, OlaylarWindows kontrolleri Değişken, Sabit TanımlarıVeri Tipleri Operatörler

Hedefler

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

Page 35: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

Page 36: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 3

• 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ürProperties paneliText, Name, Size, BackColor

MetotlarYapılan işlemler Parametre ile, Parametresiz çağrılırlarFocus, Select, Hide, Show

OlaylarBaşlarına gelen işlemlerdirClick, 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

Page 37: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 sender, System.EventArgs e)

{

button1.BackColor = Color.Black;

button1.ForeColor = Color.White;

}

HERKES İÇİN UNIX

Page 38: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 5

• 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 sender, System.EventArgs e)

{

// Label kontrolünü gizle

label1.Visible = false;

// 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 sender, System.EventArgs e)

{

// İşlem yapıldıktan sonra

// TextBox kontrolüne odaklan

textBox1.Focus();

} 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 sender, System.EventArgs e)

{

textBox1.Text = "Yazılım Uzmanı";

textBox1.Focus();

// Sekizinci karakterden sonra,

HERKES İÇİN WINDOWS

Page 39: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

Page 40: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 7

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 EklenmesiToolbox panelinden kontrollerin eklenmesiFormButtonTextBoxLabelComboBoxListBoxTimer

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

Page 41: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

Page 42: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 9

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

Page 43: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

Page 44: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 11

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 sender, System.EventArgs e)

{

comboBox1.Items.Add("Lise");

comboBox1.Items.Add("Üniversite");

comboBox1.Items.Add("Yüksek Lisans");

comboBox1.Items.Add("Doktora");

}

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

Page 45: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

Page 46: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 13

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

Page 47: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

Page 48: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 15

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 sender, System.EventArgs e ) {

// Timer kontrolünü durdurur.

tmrKronometre.Stop();

// 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 ); // KalanSure değeri sıfıra ulaşmışsa kronometre durdurulur. 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

Page 49: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

16 KISIM I:

• Caption (Başlık): Mesaj kutusunun başlığıdır • Buttons (Düğmeler): Mesaj kutusunda hangi düğmelerin

gösterileceğini belirler. • Icon (Simge): Mesaj kutusunda gösterilecek olan simgeyi ve açıldığı

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

Page 50: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 17

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

Option Explicit Off, tanımlanmamış değişkenlerin kullanımına izin verirDeğişkenlere, kapsam alanı dışından erişilemezSabitler tanımlandıktan sonra değiştirilemez

int sayi;string kelime;

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

Page 51: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 Loop

HERKES İÇİN UNIX

Page 52: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 19

SinifDegiskeni Evet Evet Evet Evet YordamDegiskeni Evet Evet YordamDegiskeni2 Evet Evet DonguDegiskeni 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

Page 53: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

20 KISIM I:

Veri Tipleri

Veri TipleriBoolean ByteCharDateDecimalDoubleInt16 - ShortInt32 - IntegerInt64 – LongSingleString

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

Page 54: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 21

1.401298E-45 ile 3.4028235E+38 string Maksimum 2,147,483,647 Unicode

karakter tutar

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

Page 55: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

22 KISIM I:

struct

Kullanıcı tanımlı veri tipistruct 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

Page 56: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 23

Dizilerle Çalışmak

DizilerAynı tipte veriyi bir arada tutarBirden fazla boyutlu olabilir

Length, RankGetLength, Clear, Reverse, IndexOf

string [] isimler;string [] isimler = new string[10];string [] isimler;// ...isimler = new string[4];

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] = “Ali”; isimler[1] = “Ahmet”; isimler[2] = “Mehmet”; isimler[3] = “Ayşe”;

MessageBox.Show(isimler[3]);

HERKES İÇİN WINDOWS

Page 57: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

Page 58: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 25

İ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

Page 59: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

26 KISIM I:

Debug

DebugBreakPoint ile çalışma durdurulurDeğişkenlerin durumları izlenir

Autos, Locals, Watch panelleriKodlar 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

Page 60: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 27

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

Page 61: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

Page 62: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 29

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 +=secilenOgrenci.Isim + " " + secilenOgrenci.Soyad; bilgiler +="\n";

bilgiler +="Notu: " + secilenOgrenci.OrtalamaNotu + "\n";

bilgiler +="Şubesi: " + secilenOgrenci.Sube + "\n";

bilgiler +="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

Page 63: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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örlerAritmetik Operatörler

Çarpma *, Bölme /, Toplama +, Çıkarma -Üs alma ^, Mod alma (Mod)

Karşılaştırma OperatörleriKüçü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

Page 64: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 31

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

Page 65: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

Page 66: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 33

Modül Sonu Soruları & Alıştırmalar

Windows Tabanlı UygulamalarÖzellikler, Metotlar, OlaylarWindows kontrolleri Değişken, Sabit TanımlarıVeri Tipleri Operatörler

Özet

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

Page 67: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modül 5: Algoritma ve Dump Coding

Algoritma kurmakDump Coding çözümlemesiAkış diyagramları

Hedefler

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

Page 68: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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şiKararlarİş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

Page 69: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 3

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

Page 70: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

4 KISIM I:

Konu 2: Dump Coding Nedir?

Dump CodingKarışık algoritmaların çözümlenmesiDeğ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. İki sayı gir. Büyük A, küçük B 2. A sayısı B sayısına böl. Tam bölünüyorsa, OBEB B sayısıdır. Çıkış 3. A sayısının değerini, Kalan sayının değeri yap 4. 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

Page 71: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 5

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 – BitirVeri GirişiKarar VermeVeri TabanıEkranPrinterFonksiyonDevam

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

Page 72: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

Page 73: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 7

• 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

Page 74: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

Page 75: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 9

Ü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

Page 76: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

10 KISIM I:

Modül Sonu Soruları & Alıştırmalar

Algoritma kurmakDump Coding çözümlemesiAkış diyagramları

Özet

1. Algoritma kurulurken esas alınacak noktalar nelerdir?

HERKES İÇİN UNIX

Page 77: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 11

2. Dump Coding ile Algoritmanın farkı nedir? 3. Bir ürünün bilgilerinin, veri tabanından çekilerek kullanıcıya

görüntüleme işleminin algoritmasını kurun 4. Bu algoritmayı akış diyagramı ile gösterin.

HERKES İÇİN UNIX

Page 78: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modül 6: Karar Yapıları ve Döngüler

Konu 1: Karar Yapıları

If Then ElseIf ile akış kontrolüKoşul OperatörleriSelect CaseKarar yapılarının kullanım yerleri

Hedefler

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.

Page 79: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

2 KISIM I:

if

IfKoş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.

Page 80: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 3

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örleriAndOrNotAndAlsoOrElse

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 true

true false false

false true false

Page 81: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 true

true false true

false true true

false false 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 }

Page 82: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 5

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 ! Koşul true false

false true

if else

If Then ElseIf koşulunda sağlanmayan tüm durumlar için Else ifadesi kullanılır.

ElseIfKoşulların sağlanmadığı durumlarda, yeni kontrollerin yapılması için kullanılır.

Select CaseElseIf 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

Page 83: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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;

Page 84: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 7

if ((9 <= saat && saat < 12)) { karsilamaMesaji = karsilamaMesaji.Insert(0, "Günaydın,"); } else if (12 <= saat && saat < 16) { karsilamaMesaji = karsilamaMesaji.Insert(0, "İyi günler,"); } else if (16 <= saat && saat < 18) { karsilamaMesaji = karsilamaMesaji.Insert(0, "İyi akşamlar,"); } // 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.

Page 85: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 YerleriSelect 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) { }

Page 86: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 9

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.

Page 87: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 88: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 11

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.

Page 89: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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" ); }

Page 90: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 13

// 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( "Yazılım Uzmanlığı 1" ); lbUrunler.Items.Add( "Yazılım Uzmanlığı 2" ); lbUrunler.Items.Add( "Yazılım Mühendisliği Orta Dzey" ); lbUrunler.Items.Add( "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"; }

Page 91: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

14 KISIM I:

Konu 2: Döngüler

For Next DöngüsüWhile, Until DöngüleriDo Loop Döngüsüİç içe döngülerDöngülerin kullanım yerleri

Hedefler

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.

Page 92: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 15

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 NextSayaç, 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.

Page 93: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 94: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 17

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 Yazar 2 Yazar 3 Yazar 4 Kitap 1 Kitap 2 Kitap 3 Kitap 4

Page 95: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 Yazar 2 Yazar 3 Yazar 4 Kitap 1 X Kitap 2 X Kitap 3 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

Page 96: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 19

yazarlar kontrol edilir. Sonuçta bir kitabı birden fazla yazar yazmasına rağmen, görüntülenecek olan sadece ilk yazardır.

While

WhileVerilen 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.

Page 97: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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);

Page 98: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 21

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. i = 1; while ( x + i < tahta.GetLength( 0 ) & y - i >= 0 ) { 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.

Page 99: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 100: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 23

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.

Page 101: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

Page 102: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 25

yazılır. Exception nesnesinin Message özelliği, hatanın oluştuğu zaman üretilen mesajı tutar. Exception nesnesinin özellikleri Catch içinde

ılmayacaksa, tanımlanmasına gerek yoktur.

label1.Text = "Exception kullanılmıyor.";

bloğunda yazılan kodlar hata meydana else de gelmese de çalıştırılacaktır.

lem yapılırken meydana geldi.

Dosya kapat }

bloğu her halükarda çalışacağı için dosya kapama işlemi burada yapılır.

Lab

mış bir halidir. Şifreyi çözmek

ele sayılar kullanılarak şifrelenen bir yazıyı, tekrar rasgele sayılar kullanarak çözülemez.

Veri

• narak, 4 haneli yapılır ve sıralı halde bir String değişkeninde tutulur.

kullantry{ } Catch { }

Finally bloğunda, Try Catch içinde yapılan tüm işlemlerden sonra çalıştırılacak kodlar yazılır. Finally g try { // Dosya aç // Dosya işlemleri } catch (Exception ex) { // Dosya açılırken veya iş // hata } finally { //

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

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ış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 rasg

Şifreleme: len yazının şifrelenmesi üç etaptan oluşur: • Yazının karakterleri Ascii kodlarına çevrilir.

Kodlar, gerekiyorsa başlarına 0 ko

Page 103: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 0 2 0 2 0 0 2 0 0 0 2 0 0 9 0 2 0 0 9 1 0 2 0 0 9 1 7 0 2 0 0 9 1 7 0 0 2 0 0 9 1 7 0 0 0 2 0 0 9 1 7 0 0 9 0 2 0 0 9 1 7 0 0 9 0 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: Şifreleme algoritmasının tüm kodları btnSifrele kontrolünün Click olayına yazılacaktır.

Page 104: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 27

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++ ) {

Page 105: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 106: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 29

// 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.

Page 107: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 108: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 31

Ş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

0 0 0 2 0 0 9 1 0 2

0 0 9 7 0 1 0 2 0 0 9 7 0 9 0 1 0 2

0 0 9 7 0 0 9 9 0 1 0 2

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;

Page 109: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

Page 110: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 33

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[ 0 ] = "Enis"; dizi[ 1 ] = "Engin"; dizi[ 2 ] = "Tamer"; dizi[ 3 ] = "Kadir"; dizi[ 4 ] = "Fulya"; int i; for ( i=0; i<=dizi.Length - 1; i++ ) { ListBox1.Items.Add( dizi[ i ] ); }

Page 111: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 112: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 35

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.

Page 113: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 114: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 37

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

Page 115: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 116: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 39

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 son = dizi.Length; int bas = -1; int orta; int indis;

2. Kullanıcıdan aranacak değeri girmesini isteyin. int hedef = int.Parse(textBox1.Text);

Page 117: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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ı");

Page 118: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1: 41

Modül Sonu Soruları & Alıştırmalar

Algoritma kurmakDump Coding çözümlemesiAkış diyagramları

Özet

1. if ifadesi hangi veri tipini kontrol eder? 2. if - switch karar yapılarının farkları nelerdir? 3. true | false & false

(true | false) & false ifadeleri hangi değerleri döndürür?

4. 4 boyutlu bir dizinin tüm elemanlarını doldurmak için, dizi üzerinde kaç tane döngü kurulmalıdır?

5. Uygulamaları derledikten sonra hatalar hangi yollarla görülebilir? 6. Finally bloğundaki kodlar ne zaman çalışır? 7. Sıralı arama yönteminde (Linear Search) dizinin elemanlarının sıralı

olması gerekli midir? 8. Sıralı arama yöntemin bir dizi üzerinde uygulayın.

Page 119: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modül 7: Fonksiyonlar ve Yordamlar

Sub – Function kullanımı.NET Tarih, String, Matematik

fonksiyonlarıOnline Offline yardımın etkin kullanımı

Hedefler

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,

Page 120: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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)

VoidDö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.

Page 121: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1 3

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(); ListBox1.Items.Add("SQL Server Veritabanı Yönetimi"); 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"); Label1.Text = "Yazılım Mühendisliği dersleri yüklendi."; 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

Page 122: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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, …) {

}

Page 123: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1 5

Ö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) || y != matris2.GetLength(1))

{

MessageBox.Show("Matris boyutlarının büyüklükleri birbiriyle aynı olmalıdır.");

Page 124: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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( string sinif, params byte[] Yaslar ) {

int toplam = 0;

double ortalama = 0.0;

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 yaş ortalaması: " + ortalama);

}

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.

Page 125: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1 7

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.

Page 126: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 MainBaş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

Page 127: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1 9

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.

Page 128: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 & ComboBox1.SelectedIndex > -1) { return false; } return true; }

private void Button1_Click( System.Object sender, System.EventArgs e ) { if (! KontrolOk()) { MessageBox.Show("Seçiminizi yaptıktan sonra devam edebilirsiniz."); return;

Page 129: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1 11

} // 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 Final, float VizeKatSayisi, params int[] vizeler ) {

int vizeToplam = 0;

double vizeOrtalama = 0.0;

int i;

Page 130: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 OverLoadAynı 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.

}

Page 131: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1 13

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 yordamlarla, yordamlar da fonksiyonlarla aşırı

yüklenebilir. • Fonksiyonlar dönüş tiplerine göre aşırı yüklenemez.

Page 132: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

14 KISIM I:

Konu 3: String Fonksiyonları

String FonksiyonlarıCompareToConcatCopyToEndsWith & StartsWithToUpper & ToLowerJoinSubStringTrim, 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; switch ( yazi1.CompareTo( yazi2 ) ) { case 0: MessageBox.Show( "Yazılar birbirine eşit"); 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.

Page 133: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1 15

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.

Page 134: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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--------

Page 135: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1 17

Konu 4: Matematiksel Fonksiyonlar

Matematiksel FonksiyonlarAbsCeiling & FloorCos, Sin, TanExpLogMax & MinPowSqrt

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

Page 136: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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. Taban parametresi verilmezse sayının e tabanında logaritmasını alır.

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

Page 137: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1 19

Konu 5: Tarih ve Zaman Fonksiyonları

Tarih ve Zaman FonksiyonlarıDateAddDateDiffCompareToDaysInMonthIsLeapYearParseToLongDateString & ToLongTimeStringToShortDateString & 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

Page 138: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Application.CurrentCulture = New Globalization.CultureInfo("fr-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

Page 139: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1 21

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ımIntelliSenseIndex, 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.

Page 140: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

• Remarks 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.

• 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.

Page 141: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1 23

• 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

Page 142: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

24 KISIM I:

Online Yardım

Online YardımOnline MSDN KütüphaneleriStart Page Online ResourcesUygulama: 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,

Page 143: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1 25

• Microsoft.com genelinde filtrelenebilir. 3. 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.

4. 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.

5. 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.

6. 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.

Page 144: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 İşlev Temizle Zamanı sıfırlar ve

TextBox kontrolüne Focus verir

OyunuBaslat Başlangıç kelimesi alınarak Timer başlatılır.

OyunuBitir String neden Süreyi durdurur, puanı

Page 145: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1 27

ve bitiş nedeni kullanıcıya gösterir.

Bilgi String mesaj Label kontrolünde mesaj görüntülenir.

SonrakiKelimeBilgi Girilecek kelimenin hangi harflerle başlayacağını gösterir.

SeviyeAtla Byte seviye Oyunun seviyesini artırır.

Kontrol String kelime1, String kelime2

İkinci kelimenin, ilk kelimenin harfleriyle başladığının kontrolü yapılır.

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ı

Page 146: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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(); }

• Kontrol fonksiyonu public bool Kontrol( string kelime1, string kelime2 ) { // İ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(); }

Page 147: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

BÖLÜM 1 29

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; if ( !( Kontrol( kelime, girilen ) ) ) { string neden = null; neden = "Girilen kelime, ilk kelimenin son "; neden += OyunSeviyesi + " harfi ile başlamyor"; OyunuBitir( neden ); } else if ( tekrar > 5 * OyunSeviyesi ) { SeviyeAtla( System.Convert.ToByte( OyunSeviyesi + 1 ) ); } else { tekrar += 1; kelime = girilen; SonrakiKelimeBilgi(); Temizle(); } }

Page 148: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

30 KISIM I:

Modül Sonu Soruları & Alıştırmalar

Sub – Function kullanımı.NET Tarih, String, Matematik

fonksiyonlarıOnline Offline yardımın etkin kullanımı

Özet

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.

Page 149: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modül 8: Veri Tipleri Üzerine İleri Bakış

Değer Veri TipleriReferans Veri TipleriOrganizasyon yapısıByVal – ByRef

Hedefler

.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.

Page 150: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

User-Defined Değer TipleriStructure yapısı ile oluşturulan kullanıcıtanımlı veri tipleridir.

// Visual C# tanımı değer tipishort sayi = 10;// .NET Framework tanımı değer tipi Int16 sayi2 = 10;

public struct Ucgen { public int kenar1; public int kenar2; public int kenar3;

public Ucgen( int kenar_1, int kenar_2, int kenar_3 ) { this.kenar1 = kenar_1; this.kenar2 = kenar_2; this.kenar3 = 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 System.Boolean True / False

Byte System.Byte 8 bit uzunluğunda sayı Char System.Char 16 bit uzunluğunda

Unicode karakter Decimal System.Decimal 128 bit uzunluğunda

sayı

Page 151: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 3

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; public Ucgen( int kenar_1, int kenar_2, int kenar_3 ) { 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.

Page 152: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 TipleriClass yapısı ile oluşturulan kullanıcı tanımlıreferans tipleridir.

// Kullanıcı tanımlı referans tipipublic 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.

Page 153: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 5

// 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

Page 154: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

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);

}

Ali

Veli

ogr

Stack

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; }

Page 155: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 7

} 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

Page 156: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 157: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 9

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.

ilkSiparis

ikinciSiparis

Stack

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

Siparis

Siparis

Siparis parametreSiparis

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

Page 158: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 Adres Bilgisi

2. ilkSiparis oluşturulurken Stack Alanı

Değer = 0x00000012 ilkSiparis

Heap Alanı

Page 159: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 11

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

Page 160: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 sipariş referansı ile aynı olur) 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 gösteren referans kalmamıştır)

Siparis Tarih = 10.05.2005 AliciIsmi = Enis Günesen Urun = Visual Studio.NET 2003

0x00000012

6. ilkSiparis in gösterdiği nesnenin Ürün ismi değiştirilirken Stack Alanı

Page 161: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 13

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ı

Page 162: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 – ByRefByVal

Parametreye, değişkenin değeri geçer.

ByRefParametreye, değişkenin adresi (referansı) geçer.

public void Ekle( ref string Kelime, string eklenecek ) { Kelime = Kelime.Insert( 0, eklenecek );

}

public void ElemanDegistir( int[] dizi, int index, int yeniDeger ) {

dizi[ index ] = yeniDeger; }

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.

Page 163: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 15

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, string eklenecek ) {

Kelime = Kelime.Insert( 0, eklenecek );

} 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

Page 164: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

16 Modül 1: Programlamaya Giriş

}

Modül Sonu Soruları & Alıştırmalar

Değer Veri TipleriReferans Veri TipleriOrganizasyon yapısıByVal – ByRef

Özet

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.

Page 165: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modül 9: Windows Programlama

Listeleme KontrolleriListBox, TreeView, ComboBox

Resim KontrolleriPictureBox, ImageList

Düzenleme Kontrolleri TabControl, Panel, HScrollBar, VScrollBar

Zaman ve Tarih Kontrolleri DateTimePicker, MonthCalendar

Dinamik KontrollerÇalışma anında eklenen kontroller

Hedefler

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.

Page 166: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

2 Modül 9: Windows Programlama

Konu 1: Formlar ve Windows Forms Kontrolleri

Form Nesnesi

FormlarKullanı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

Page 167: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 3

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" ) { HataFormuYukle( "Satış departmanı parolası yanlış!" ); } else {

Page 168: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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ı)

Page 169: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 5

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, Maximize ve Minimize düğmelerinin tümünün görünürlüğü

StartPosition FormStartPosition

Form açıldığı zaman, ekran üzerindeki konumu

TopMost Boolean Formun tüm pencerelerin üzerinde 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 tuşun kaldırılması ile gerçekleşir

Form Metotları: Metot Açıklama Hide Formu Visible

Page 170: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

6 Modül 9: Windows Programlama

özelliğini False yaparak, gizler

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; } }

Page 171: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 7

Label

LabelKullanı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, etiket

üzerindeki pozisyonu 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ı

Page 172: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 173: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 9

TextBox

TextBoxKullanı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

Page 174: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 karakterleri

kopyalar Paste Hafızaya alınan

karakterleri metin

Page 175: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 11

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;

Page 176: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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(); }

Page 177: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 13

Button

ButtonKomut 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 üzerine

tıklandığı zaman gerçekleşir

Page 178: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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... }

Page 179: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 15

CheckBox

CheckBoxKullanı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 olup

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 basıldığı

Page 180: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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;

Page 181: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 17

RadioButton

RadioButtonSunulan seçeneklerin bir tanesini seçmeyi sağlar.GroupBox kontrolü ile gruplanır.

GroupBoxKontrollerin 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.

Page 182: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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:

Page 183: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 19

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 );

Page 184: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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...

Page 185: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 21

}

}

ListBox

ListBoxNesnelerin 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

Page 186: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 187: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 23

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;

Page 188: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 );

}

Page 189: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 25

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 ); }

Page 190: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

26 Modül 9: Windows Programlama

CheckedListBox

CheckedListBoxListBox 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

Page 191: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 27

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; // Listedeki seçilen öğelerin ürün adeti toplanır. for ( i=0; i<=chlistKategoriler.Items.Count - 1; i++ ) { 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 ) {

Page 192: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

28 Modül 9: Windows Programlama

case "Film": return 1100;

;

;

0;

lemi d btnKategoriEkle_Click( System.Object

ms.Add( txtKategoriAdi.Text

}

case "Mzik": return 982 case "Bilgisayar": return 302; case "Kitap": return 1222 default: return 1 } // Ekleme iş private voisender, System.EventArgs e ) { chlistKategoriler.Ite);

ComboBox

ComboBoxListelenen öğeler açılan kutuda görüntülenir.Listeden bir tane öğe seçilebilir.

ste kutusu ile aynı özelliklere sahiptir. Ancak listelenen öğeler açılan bir Li

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

Page 193: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 29

Ö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 ) {

Page 194: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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(); switch ( cmbFormat.SelectedIndex ) { case 0: cmbFormatString.Items.Add( "dd - MM - yyyy" ); cmbFormatString.Items.Add( "yyyy*MM*dd hh:mm" ); cmbFormatString.Items.Add( "dddd dd.MM.yy hh:mm:ss" ); break; case 1: cmbFormatString.Items.Add( "C" ); cmbFormatString.Items.Add( "P" ); cmbFormatString.Items.Add( "N" ); break; } }

• Format seçildikten sonra metin kutusuna girilen değer alınır ve ilgili formatta gösterilir

private void btnGoster_Click( System.Object sender, System.EventArgs e ) { switch ( cmbFormat.SelectedIndex ) { case 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; } }

Page 195: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 31

NumericUpDown

NumericUpDownSayısal değerlerin yukarı aşağı okları ile seçilmesini sağlar

DomainUpDownObject 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 gösterilen sayıların alabileceği minimum değeri

Page 196: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

32 Modül 9: Windows Programlama

belirler. ThousandSeparators Boolean k Sayıların basama

ayracını gösterilmesini belirler.

Value Decimal n gösterdiği Kontrolüsayı değerini belirler.

ReadOnly Boolean True değerini alırsakullanıcının giriş yapmasını engeller.

NumericUpDown Olayları Olay Açıklama ValueChanged sayı değeri Kontrolün

değiştiği zaman gerçekleşir

NumericUpDown Metotları Metot Açıklama DownButton esine basar Aşağı düğm

ve sayı değerini düşürür.

UpButton düğmesine Yukarı basar ve sayı değerini artırır.

rnek: Alarm kurarken, tarih ve zaman değerlerinin ayarlanması

U

ÖNumeric pDown kontrolü ile yapılabilir.

• Tarih ve zaman değerlerinin alabileceği maksimum ve minimum

orm1_Load( System.Object sender,

1;

değerler ayarlanır. private void F

System.EventArgs e ) { nYil.Minimum = 1; nAy.Minimum =

Page 197: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 33

nGun.Minimum = 1; nYil.Maximum = 2099;

y.Maximum = 12;

akika.Minimum = 0;

akika.Maximum = 59;

.Now.Year; y.Value = DateAndTime.Now.Month;

;

zaman

sender

"." + nAy.Value + "." +

( !( IsDate( tarih ) ) ) { MessageBox.Show( tarih );

ng zaman; man = nSaat.Value + ":" + nDakika.Value;

MessageBox.Show ( zaman );

Dom wn ü ile aynı yapıdadır ancak sayısal değerler yerine

Object tipinde

zellik Değer Tipi Açıklama

nA nGun.Maximum = 31; nSaat.Minimum = 0; nD nSaat.Maximum = 23; nD nYil.Value = DateAndTime nA 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 vedeğerinin girilmesi kontrol edilir

private void nGun_ValueChanged( System.Object , System.EventArgs e ) {

string tarih; tarih = nGun.Value + nYil.Value; if } stri za if ( !( IsDate( zaman ) ) ) { } }

ainUpDoNumericUpDown kontrol

değerler tutar. Bu değerler kontrolün Items koleksiyonunda tutulur. Kontrol, bu özelliği ile liste kutusuna benzemektedir.

DomainUpDown Özellikleri ÖItems DomainUpDownItemCollection

dinamik

Kontrolün öğelerinin tutulduğu bir listedir.

SelectedItem Object Kontrolde seçilen öğeyi tutar.

Page 198: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

34 Modül 9: Windows Programlama

Wrap Boolean nuna

veya

Liste sogelindiğinde baştaki sondaki öğeye geri dönülmesini belirler.

DomainUpDown Olayları Olay Açıklama SelectedItemChanged seçilen öğe Kontrolde

değiştiği zaman gerçekleşir.

Örnek: Metin kutularının istenen yazı tipleri DomainUpDown değiştirilmek kontrolünde tutulabilir.

private void Form1_Load( System.Object sender,

me );

.Wrap = true;

ivate void dFont_SelectedItemChanged(

System.EventArgs e ) { for ( i=0; i<=10; i++ ) { dFont.Items.Add( System.Drawing.FontFamily.Families[ i ].Na }

ont dF } prSystem.Object sender, System.EventArgs e ) { if ( dFont.SelectedIndex >= 0 ) { TextBox1.Font = new Font( dFont.SelectedItem.ToString, 15 ); } }

Page 199: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 35

HScrollBar / VscrollBar

HScrollBar – VScrollBarSayı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 çubuğunun

pozisyonuna göre alınan 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

Page 200: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

36 Modül 9: Windows Programlama

Maximum Integer eceği Value özelliğinin alabilminimum değeri tutar

ScrollBar Olayları klama Olay Açı

Scroll kaydırıldıkları Çubuklar zaman gerçekleşir.

ValueChanged r

tiği

Kod ile ya da çubuklakaydırılınca Value özelliği değ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,

ivate void hsGenislik_Scroll( System.Object

System.EventArgs e ) { hsGenislik.Maximum = ComboBox1.Width * 2; hsGenislik.Value = ComboBox1.Width; } prsender, System.Windows.Forms.ScrollEventArgs e ) { ComboBox1.Width = hsGenislik.Value; }

Page 201: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 37

TrackBar

TrackBarKaydı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.

Page 202: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

38 Modül 9: Windows Programlama

TabControl

TabControlSekme 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 sekme sayfasını belirler

Page 203: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 39

SelectedIndex Integer Seçilen sekme sayfasının indisini belirler

TabCount Integer Sekme sayısını belirler TabPages TabPageCollection Kontrolün içinde bulunduğu

sekme sayfalarının koleksiyonudur.

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

Page 204: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

DateTimePickerTakvimden 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.

Page 205: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 41

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 yazıların ön

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 DateTimePickerFormat

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 tarih değerini 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ı, NumericUpDown

Page 206: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

42 Modül 9: Windows Programlama

kontrolünün formatında olur.

Ö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 btnAra_Click( System.Object sender, System.EventArgs e ) { DateTime basTarih, sonTarih; basTarih = dtBaslangic.Value; sonTarih = 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 }

Page 207: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 43

MonthCalendar

MonthCalendarTakvimden 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

Page 208: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

44 Modül 9: Windows Programlama

basıldığı zaman kaç ay atlanacağını belirler

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.

Page 209: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 45

• 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; }

Page 210: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

46 Modül 9: Windows Programlama

Timer

TimerZaman 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 olup

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

Page 211: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 47

Start Sayacı başlatır Stop Sayacı durdurur

ProgressBar

ProgressBarYapı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.

Page 212: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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();

Page 213: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 49

} }

ErrorProvider

ErrorProviderHata 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 kaç

milisaniyede bir yanıp söneceğini belirler

BlinkStyle ErrorBlinkSytle Hata simgesinin yanıp sönme stilini belirler. AlwaysBlink, her zaman, 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

Page 214: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

50 Modül 9: Windows Programlama

ErrorProvider Metotları Metot Açıklama SetError Kontrollerin hata

mesajlarının belirlenmesi için kullanılır

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 hata mesajını belirler

Ö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; }

Page 215: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 51

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, "" ); } }

Page 216: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

52 Modül 9: Windows Programlama

PictureBox

PictureBoxResim 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.

Page 217: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 53

Örnek: Form üzerinde bir resmin değişik boyutlarda gösterilmesi için PictureBox kontrolü tercih edilir.

private void Form1_Load( System.Object sender, System.EventArgs e ) { ComboBox1.Items.Add( "Normal" ); ComboBox1.Items.Add( "Ortala" ); ComboBox1.Items.Add( "Sdr" ); ComboBox1.Items.Add( "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 ); }

Page 218: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

54 Modül 9: Windows Programlama

ImageList

ImageListResimleri 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.

Page 219: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 55

Ö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

LinkLabelNesnelere bağlantı kurulmasını sağlar.Metin içinde birden fazla bağlantı tutabilir.

Page 220: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 LinkVisited özelliği False olduğu zaman gösterilecek rengini belirler

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 rengini belirler

Links LinkLabel.LinkCollection Kontrolün Text özelliğinde bulunan bağlantıları tutar

LinkLabel Olayları Olay Açıklama Click Kontrolün üzerine

Page 221: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 57

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

Page 222: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

Page 223: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 59

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 en 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 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.

Page 224: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 225: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 61

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

Page 226: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 );

Page 227: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 63

}

} • 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.

Page 228: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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,

Page 229: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 65

öğenin tüm detay satırının seçilmesini belirler

GridLines Boolean Kolonlar ve satırlar arasında ayırıcı çizgilerin gözükmesini 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.

ListView Olayları Olay Açıklama AfterLabelEdit Öğenin yazısı

değiştikten sonra gerçekleşir

BeforeLabelEdit Öğenin yazısı değişmeden önce gerçekleşir

Ö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 Form1_Load( System.Object sender, System.EventArgs e ) {

Page 230: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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( "Ad", 100, HorizontalAlignment.Left );

ListView1.Columns.Add( "Boyut", 50, HorizontalAlignment.Left );

ListView1.Columns.Add( "Tür", 170, HorizontalAlignment.Left );

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 ListViewItem( "WindowsApplication1.sln" );

oge.SubItems.Add( "1 KB" );

oge.SubItems.Add( "Microsoft Visual Studio Solution Object" );

oge.ImageIndex = 1;

ListView1.Items.Add( oge );

} 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; }

Page 231: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 67

}

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)

{

}

Page 232: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 233: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 69

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

Page 234: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

Page 235: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 71

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 ) {

Page 236: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 ) ) {

Page 237: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 73

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 TextBox – txtTahmin ListBox – ListBox1 DomainUpDown – DomainUpDown1 Items Farklı Sayılar

Tekrarlı Sayılar

Page 238: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 ) {

Page 239: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 75

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(); // Rakamlar tek tek bir birleriyle kontrol edilir // 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();

Page 240: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 == 0 & eksi == 0 ) { sonuc = "0"; } else if ( arti == 4 ) { sonuc = "Tebrikler!"; } else if ( arti != 0 && eksi != 0 ) { sonuc = "+" + arti + " -" + eksi; } else if ( arti == 0 ) { sonuc = "-" + 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

Page 241: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 77

• 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;

Page 242: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

78 Modül 9: Windows Programlama

for (int i=1; i<=kartSayisi; i++ ) { // Dinamik bir düğme oluşturulur ve özellikleri // 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 ); // Bir sonraki eklenecek olan düğme // ilk kontrolün 70 piksel sağında olacaktır x += 70; // Düğme Form sınırları içinde olması gerekir. 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(); // Form iindeki Button kontrolleri bir listede tutulur 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 ); }

Page 243: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 79

} Random r = new Random(); int i = 0; // Kartlar ikişer ikişer ele alınır. İki karta da // 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; } }

Page 244: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 Button(Sayi) isminde bir düğme ekleyin. Örnek: 5 sayısı için Button5

Text Temsil ettikleri sayılar

Button – Her işlem için bir düğme ekleyin: Çarpma, bölme, toplama çıkarma, eşitlik, temizleme

Text Temsil ettikleri işlemler. * + / - = C

Page 245: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 81

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 btnEsit_Click( System.Object sender, System.EventArgs e ) { switch ( Islem ) { case "*": Sayi *= double.Parse(txtSayi.Text); break; case "/": Sayi /= double.Parse(txtSayi.Text); break; case "-": Sayi -= double.Parse(txtSayi.Text); break;

Page 246: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

Listeleme KontrolleriListBox, TreeView, ComboBox

Resim KontrolleriPictureBox, ImageList

Düzenleme Kontrolleri TabControl, Panel, HScrollBar, VScrollBar

Zaman ve Tarih Kontrolleri DateTimePicker, MonthCalendar

Dinamik KontrollerÇalışma anında eklenen kontroller

Özet

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.

Page 247: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 248: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modül 10: Menü Tasarımı ve MDI Formlar

MenülerMainMenu, ContextMenu

ToolBarToolTipStatusBarNotifyIconRichTextBox

Hedefler

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.

Page 249: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

2 Modül 1: Programlamaya Giriş

MainMenu

MainMenuFormları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.

Page 250: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 3

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 aktif durumda olup 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" );

Page 251: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 ) { }

Page 252: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 5

ContextMenu

ContextMenuKontrollerin 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.

Page 253: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

6 Modül 1: Programlamaya Giriş

ToolBar

ToolBarMenü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

Page 254: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 7

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

Page 255: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

8 Modül 1: Programlamaya Giriş

bir ayracı temsil eder. DropDownButton değeri düğmenin yanında bir menünün açılacağını belirler.

DropDownMenu Menu Kontrolün stili DropDownButton olarak seçilmişse, yanında çıkacak menüyü belirler. Bu menü sadece ContextMenu cinsinden olabilir.

Pushed Boolean Düğmenin basılı olup olmadığını belirler

Text String Düğmenin üzerinde yazan yazıyı belirler

ImageIndex Integer ToolBar kontrolüne bir ImageList bağlanmışsa, bu özellik düğmenin hangi resmi göstereceğini belirler.

ToolTipText String Düğmenin üzerinde durulduğu zaman gösterilecek ipucunu belirler.

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

Page 256: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 9

case 1: // Kes case 2: // Yapıştır case 4: // Geri Al case 6: // Yardım break; } }

ToolTip

ToolTipKontrollerin ü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,

Page 257: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 258: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 11

StatusBar

StatusBarWindows 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 StatusBar üzerinde yazan yazıyı belirler. Eğer ShowPanels özelliği True ise, bu özellikte yazılan yazı

Page 259: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 260: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 13

Text String Panel üzerinde yazan yazıyı belirler

Width Integer Panelin genişliğini belirler

MinWidth Integer Panel boyutunun minimum değerini belirler.

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 ); }

Page 261: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

14 Modül 1: Programlamaya Giriş

NotifyIcon

NotifyIconWindows 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.

Page 262: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 15

RichTextBox

RichTextBoxTextBox kontrolünden daha gelişmişözelliklere sahiptir.

Seçilen yazının rengi, yazı tipi değiştirilebilirMadde 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

Page 263: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 belirlerSelectionBullet Boolean Seçilen satırın madde

Page 264: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 17

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çıklamaFind 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 alınan 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 işlem geriye alınır

Redo Geri alınan işlem tekrar yapılır

Page 265: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

18 Modül 1: Programlamaya Giriş

RichTextBox olayları Olay AçıklamaTextChanged 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 simgesinin görev çubuğunda

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

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.

Page 266: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 19

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

OpenFileDialog -OpenFileDialog1

SaveFileDialog -SaveFileDialog1

FontDialog - FontDialog1 StatusBar - StatusBar1 ShowPanels True

Panels İki tane panel ekleyin. İlk panelin AutoSize özelliğini Contents olarak belirleyin.

NotifyIcon - NotifyIcon1 Icon Uygulamanız için bir simge seçin

Text “Notepad Uygulaması” RichTextBox – RichTextBox1 Dock True

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.

Page 267: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

Page 268: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 21

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"; } }

Page 269: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 // Dosya yoksa otomatik olarak oluşturulması sağlanır 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 {

Page 270: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 23

// 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.

public void Bul() { // Bulma formu görüntülenir, iptal tuşuna basıldıysa çıkılır frmBul bul = new frmBul(); if ( !( bul.ShowDialog() == DialogResult.OK ) ) { return; } 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.

Page 271: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

Page 272: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 25

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 ) {

Page 273: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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);

Page 274: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 27

} // 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;

Page 275: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

28 Modül 1: Programlamaya Giriş

} // Dosya bulunması private void MenuItem26_Click( System.Object sender, System.EventArgs e ) { Bul(); } }

MDI Formlar

MDI FormlarMultiple Document Interface – Bir çok alt formu barındıran formlardır.Bu formların IsMdiContainer özelliği Trueyapılır. Alt formun MdiParent özelliği, ait olduğu ana formu belirlerMdiChildren ö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.

Page 276: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 29

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

Page 277: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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; }

Page 278: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 31

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.

Page 279: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 Değer Form isMDIContainer True

ContextMenu – ContextMenu1 Alt Klasörler, Kaldır değerlerini içeren menü öğeleri ekleyin

MainMenu – MainMenu1 Yeni Konum, Dosya

Page 280: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 33

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 Değer MainMenu – MainMenu1 Yeni, Sil, Kapat

değerlerini içeren menü öğelerini ekleyin

ListBox – ListBox1 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 ) {

Page 281: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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(); }

Page 282: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 35

// 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;

Page 283: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

36 Modül 1: Programlamaya Giriş

silinecek = ListBox1.SelectedItem.ToString(); System.IO.Directory.Delete( silinecek, true ); KlasorleriListele(); }

Modül Sonu Soruları & Alıştırmalar

MenülerMainMenu, ContextMenu

ToolBarToolTipStatusBarNotifyIconRichTextBox

Özet

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.

Page 284: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modül 11: Veri Yapıları

Access ortamıVeri tipleriVeri modelleme teknikleri

Hedefler

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.

Page 285: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 AramaYeni Dosya

Tablo oluşturmak Tasarım görünümünde tabloSihirbaz ile tabloVeri 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

Page 286: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 3

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.

Page 287: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

Page 288: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 5

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ı ve görüntülenmesi için araç çubuğunda “İlişkiler” düğmesi kullanılır.

Page 289: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

6 Modül 1: Programlamaya Giriş

Konu 2: Veri Yapılarına Giriş

Veri YapılarıMetin Veri Tipleri

Text, MemoSayısal Veri Tipleri

Byte, Integer, Long IntegerSingle, Double, Decimal

Tarih Veri TipiGenel Tarih, Uzun Tarih, Kısa TarihOrta Uzunlukta Tarih, Uzun Saat, Kısa Saat

Yes/No Veri TipiOLE 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.

Page 290: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 7

• 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

Page 291: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 GereksinimleriNormalizasyon

Birinci Normal Formİkinci Normal Form Üçüncü Normal Form

Primary KeyForeign Keyİlişkiler

Bire Bir Bire SonsuzSonsuza 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.

Page 292: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 9

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 FormYatay 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.

Page 293: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

Page 294: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 11

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.

Page 295: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

12 Modül 1: Programlamaya Giriş

Birincil Anahtar (Primary Key)

Primary KeyBir ya da birden fazla alan Primary Keyyapı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.

Page 296: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 13

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 KeyBaş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 UpdateCascade 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.

Page 297: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 298: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 15

Tekil Kısıtı (Unique Constraint)

Unique ConstraintPrimary 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.

Page 299: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 300: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 17

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

Page 301: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

Page 302: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 19

İkinci Normal Form

İkinci Normal FormKolon 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

Page 303: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

20 Modül 1: Programlamaya Giriş

Üçüncü Normal Form

Üçüncü Normal FormPrimary 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.

Page 304: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 21

Ş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.

Page 305: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

Page 306: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 307: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 308: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 25

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.

Page 309: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 310: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 311: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 312: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 29

Modül Sonu Soruları & Alıştırmalar

MenülerMainMenu, ContextMenu

ToolBarToolTipStatusBarNotifyIconRichTextBox

Özet

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.

Page 313: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 314: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modül 12: SQL Giriş

Select cümlesi: SorgulamaUpdate cümlesi: GüncellemeInsert cümlesi: Veri Ekleme Delete cümlesi: Silme Join: Tabloları birleştirme

Hedefler

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 fonksiyonları kullanarak sorguları

ş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.

Page 315: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

2 Modül 1: Programlamaya Giriş

Access ile Sorgu Oluşturmak

Access ile sorgu oluşturmakTasarım görünümünde sorguSihirbaz 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.

Page 316: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 317: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

4 Modül 1: Programlamaya Giriş

Select From Where

Select SorgusuTablolardan veri çekmek için kullanılır.From ile tablolar belirtilir.Where ifadesinden sonra kriterler yazılır.

SELECT Urunler.Isim, Urunler.BirimFiyatFROM UrunlerWHERE Urunler.Isim LIKE '*Studio*'

SELECT Alanlar FROM Tablo İsmi WHERE Kriterler

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.

Page 318: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 5

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.*

Page 319: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 True değeri

döndüren örnek

False değeri döndüren örnek

Page 320: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 7

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 5,

Versiyon 1 Versiyon 10, Versiyon Üç

Karakter Aralığı [a-z] a, b, c 43, 2 Aralık Dışı [!0-9] a, b, c 1, 2, 3 Ö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

Page 321: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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;

Page 322: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 9

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;

Page 323: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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;

Page 324: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 11

Insert

Insert SorgusuTablolara 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)

Page 325: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

12 Modül 1: Programlamaya Giriş

SELECT SiparisId, KullaniciId, NakliyeUcreti, SiparisTarihi,

;

GonderilmeTarihi, Adres FROM Siparisler WHERE Odendi = -1

Update

Update SorgusuTablolarda veri güncellemek için kullanılır.

UPDATE TabloSET Alan1 = Değer1, Alan2 = Değer2, …

UPDATE KullanicilarSET ParolaSorusu = 'Yeni Soru', ParolaCevabi = 'Yeni Cevap' WHERE KullaniciId = 23

Sorgu yazılırken Where kriterinin unutulmaması gerekir.

pdate sorguları tablolarda var olan kayıtların belirli alanlarının güncellenmesi

blo SET Alan1 = Değer1, Alan2 = Değer2, …

u sorguda dikkat edilmesi gereken en önemli nokta, belli kayıtlarda

rnek: llanicilar

ni Soru', ParolaCevabi = 'Yeni Cevap'

U

işlemini yapar. Bu sorguda da tablo, alan ve yeni değerlerin belirtilmesi gerekir. Sözdizimi: UPDATE Ta

Bgüncelleme işlemi yapılıyorsa WHERE kriterinin unutulmaması gerekir. Aksi halde tablodaki tüm kayıtlar, sorguda belirlenen değerleri alacaktır. ÖUPDATE KuSET ParolaSorusu = 'YeWHERE KullaniciId = 23

Page 326: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 13

Delete

Delete SorgusuTablolardan 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

Page 327: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

14 Modül 1: Programlamaya Giriş

INNER JOIN

Inner JoinTabloları birleştirmek için kullanılır.Primary Key ve Foreign Key alanlarıüzerinden birleştirme yapılır.

SELECT AlanlarFROM Tablo1 AS isim1 INNER JOIN Tablo2 AS isim2 ON isim1.Alan = isim2.Alan

SELECT StokDurumu.Adet, Urunler.Isim

FROMUrunler 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.

Page 328: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 15

Ö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

Page 329: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

16 Modül 1: Programlamaya Giriş

Group By

Group ByAynı 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ı]

FROMUrunler u INNER JOINKategoriler 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],

Page 330: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 17

COUNT(UrunId) AS [Ürün Sayısı] FROM Urunler u INNER JOIN

riId = k.KategoriId Kategoriler k ON u.KategoGROUP BY k.KategoriId, k.Isim

Aritmetiksel İşlemler

Aritmetiksel İşlemlerToplama, Çıkarma, Bölme, Çarpma

SELECT Urunler.Isim, BirimFiyat * 1.18 AS [KDV Dahil Fiyat]

FROM Urunler

orgular sırasında, alanlar üzerinde toplama, çıkarma, çarpma, bölme gibi

rnek: Birim fiyatlarının KDV eklenmiş halini gösteren sorgu.

ELECT sim,

8 AS [KDV Dahil Fiyat]

Saritmetiksel işlemler yapılabilir. Bu işlemler sabit değerler ile yapılabildiği gibi başka alanlardaki değerler ile de yapılabilir. Ö SUrunler.IBirimFiyat * 1.1FROM Urunler

Page 331: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

18 Modül 1: Programlamaya Giriş

SELECT Fiyat) * 1.18 AS [Toplam Ürünler Fiyatı KDV Dahil]

rnek: Stoklarda, rezerve edilmemiş toplam ürün sayısı

ELECT Urunler.Isim, Sum(StokDurumu.Adet - üm Stoklar]

im;

işlemi, sayılar üzerinde yapılabildiği gibi metinsel değerler üzerinde de

rnek: Kullanıcıların isim ve soyadlarının beraber görüntülenmesi

LECT lar.Isim + ' ' + Kullanicilar.Soyad AS [İsim Soyad]

OM Kullanicilar

Sum(BirimFROM Urunler

Ö SStokDurumu.Rezerve) AS [Açık Ürün Sayısı - TFROM Urunler INNER JOIN StokDurumu ON Urunler.UrunId = StokDurumu.UrunId GROUP BY Urunler.Is

Toplamabirleştirme görevi görür. Ö SEKullanici FR

Modül Sonu Soruları & Alıştırmalar

MenülerMainMenu, ContextMenu

ToolBarToolTipStatusBarNotifyIconRichTextBox

Özet

. Select ifadesinin kullanım alanını açıklayın ve bir örnek SQL cümlesi 1

geliştirin.

Page 332: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 333: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 1:

ADO.NET

Page 334: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

yı derlemeyi öğreneceksiniz.

ra:

cek,

Çalışma zamanı hatalarını yakalayabilecek,

zamanı hatalarını yakalamayı ve uygulama Bu modül tamamlandıktan son

Proje oluşturabilecek, Projeye referans ekleyebilecek, Projeye isim alanı ekleyebile Proje özelliklerini değiştirebilecek, Dinamik yardım alabilecek,

ek Proje içerisine görevler ekleyebilec

Uygulamaları derleyebileceksiniz.

ADO.NET

Page 335: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modül 1: 3

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

Page 336: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

uşturulacağı için, başlangıç bileşenleri farklılık gösterecektir. Örneğin anılması ve bazı

referproje do ç kodlarını otomatik olarak yazıp gerekli referansları ekle

Win•

Diğer pr s kütüphaneleri sağlayan DLL (Dynamic Link Library) oluştekrar ku

• KullanıcWindow irçok formda tekrar kullanılmak üzere tasarlanır.

Mobil cih• Application

IIS (Internet Information Services) üzerinde çalışacak Web uygulamaları

olWindows tabanlı projeler için Windows formlarının kull

ansların eklenmesi gerekir. Visual Studio ortamının sağladığı şablonlar, syalarının başlangı

yerek geliştiriciye hızlı bir başlangıç sağar.

• Windows Application

dows tabanlı uygulamalar geliştirmek için kullanılır. Class Library

ojeler için clasturmak için kullanılır. Bu bileşenler projelere Reference olarak eklenerek

llanılır. Windows Control Library

ı tanımlı Windows kontrolleri oluşturmak için kullanılır. Bu kontroller s uygulamalarında, b

• Smart Device Application

azlar üzerinde uygulama geliştirmek için kullanılır. ASP.NET Web

geliştirmek için kullanılır. • ASP.NET Web Service

ADO.NET

Page 337: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modül 1: 5

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 ekle .

ışacak konsol uygulamaları geliştirmek için kullanılır.

ulamalar, kulla cı a çalışmaya devam eder.

Her g çılan Windows projelerdir. Başlangıç

şablon uygulanmadan açılan Web projelerdir. Bu proje IIS üze lenmez.

oject solution

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.

nir• Web Control Library

Web uygulamalarında, kullanıcı tanımlı kontroller oluşturmak için kullanılır. • Console Application

Komut penceresinde çal• Windows Service

Windows altında sürekli çalışan uygulamalar için kullanılır. Bu uygnı ların sisteme giriş yapmadığı durumlarda d• Other Projects

Enterprise Applications (Şirket uygulamaları), Deployment Projects (Yükleme projeleri), Database Projects (Veritabanı projeleri) gibi değişik şablonlardır.

• Empty Project

han i bir şablon uygulanmadan anesnesi ve referanslar eklenmez.

• Empty Web Project

Herhangi birrinde tanımlanır ancak form ve referans nesneleri ek• Blank Solution

Başlangıç olarak bir proje açılmaz. Boş bir solution dosyası açılır. İstenen projeler, Add New Pr komutu ile bu 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ğ

ADO.NET

Page 338: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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)

osyası otomatik olarak eklenir.

, kullanıcının solution ile çalışırken y

Bir projenin içinde bulunan bileşenlerin, eklenen referansların tutulduğu proje şturulur. Bu dosya

k r ise .cspro r.

ya r .cs dosyası

uşturulan

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 d

Solution User Option (.suo) dosyalarıaptığı ayarları tutar ve proje tekrar açıldığı zaman bu ayarları getirir.

• Project Dosyaları (.csproj, .csproj.user)

dosyasıdır. Visual C# projeleri .csproj uzantılı dosya ile oluaynı zamanda, bir solution içinde farklı dilde ve tipteki projeleri ayırt etmeiçin kullanılır. Projeye özgü ayarla j.user dosyasında tutulu

• Yerel Proje Dosyaları (.cs) Form, class gibi bileşenlerin tutulduğu dosyalardır. Bir .cs uzantılı dosiçinde birden class tutulabilir. Ancak projedeki her form için ayrı bioluşturulur.

• Web Projeleri Dosyaları (.aspx, .asmx, .asax) Web uygulamalarında ol dosyalar Web sunucusunda (ISS) tutulur. Bu dosyalar web formları için .aspx, Web Service için .asmx, global sınıfı için .asaxuzantısına sahiptir.

ADO.NET

Page 339: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modül 1: 7

Proje oluşturulduktan sonra yeni nesnelerin eklenmesi Project menüsü ile ya

roject 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?

da Solution Explorer paneli kullanımı ile gerçekleşir. P

Visual Studio .NET ortamında geliştirilen uygulamalar derlendiğinde.dll uzantılı dosyalar oluşur. .NET’in otomatik

, .exe veya olarak oluşturduğu bu dosyalara

assembly denir. Assembly içerisinde dosyaya ait başlık, açıklama ve telif hakkı

tak bir proje altında toplanabilir.

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 or

ADO.NET

Page 340: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

8

Proj emek eye Referans Ekl

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.

1. So erences menüsü seçin. References m süne sağ tıklayın.

2. Aç en Add Reference komutunu verin. 3. Aç pencere üzerinden .NET, COM, Projects sekmelerinden herhangi birini

se n.

ullanılır. rojects, proje ile aynı solution içerisinde yer alan bileşen kütüphanelerini

4. Eklenecek assembly nesnesini seçin ve Select düğmesini tıklayın. Birden fazla as m

5. Re tıklayın. Proje ş k kullanılan referans’lar şunlardır:

Projeye referans eklemek için belirtilen adımlar takip edin. lution Explorer penceresinden Ref

enüılan menüdılançi.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 kPeklemek için kullanılır.

se bly seçmek için aynı işlemi tekrar edin. ferans ekleme işlemini tamamlamak için OK düğmesine

ablonları içerisinde en ço

ADO.NET

Page 341: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modül 1: 9

Sy m: Programın çalışması için gerekli en temel referanstır. System.dll kü

Sy stır. Sy erisinde tutulur.

Sy dows.Forms: Windows form ve kontrollerini içe System.Drawing.dll ve System.Windows.Forms.dll kü çerisinde tutulur.

Sy L: XML teknolojisinin kullanılmasını sağlayan referanstır. Sy inde tutulur.

stetüphanesi içerisinde tutulur. stem.Data: Veritabanı bağlantılarının yapılması için gerekli referanstem.Data.dll kütüphanesi içstem.Drawing, System.Win

tır. ren referanstüphaneleri istem.XMstem.XML.dll kütüphanesi içeris

ADO.NET

Page 342: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

10

İsim Alanı (Namespace) Nedir?

.NET içerisindeki tüm kütüphaneler, .NET Framework ismi verilen ortak çatı ır. Bu çatı altındaki tüm kütüphaneler amaçlarına göre

u isim alanı içerisinde 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.

altında toplannamespace denilen isim alanı altında gruplandırılır. Bsını

ADO.NET

Page 343: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modül 1: 11

Yeni İsim Alanı Eklemek

Yeni isim alanı oluşturmak için namespace anahtar kelimesi kullanılır. n{amespace Isimalani_ismi

}

nı tanımlanmıştır. Bu isim alanı

geAdam isim alanında kullanılacak f, Modul ve Arayüzler tanımlanır

class Egitim

BilgeAdam isim alanı içindeki Ogrenci sınıfını kullanmak için, sınıf ismini, isim alanı ile birlikte belirtilmelidir.

...

Örnekte NSBilgeAdam isminde bir isim alaiçerisine Egitim ve Ogrenci isminde sınıflar eklenmiştir. namespace NSBilgeAdam { // Bil //Sını

{ //... } class Ogrenci { //… } // vs... }

ADO.NET

Page 344: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 {

class Bilgi {

} } namespace Egitim

{ class Grup { } } namespace Ogrenci { } } // vs... }

ADO.NET

Page 345: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modül 1: 13

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 ullanımlar, kodun okunmasını oldukça zorlaştırır. Örnekte sınıflar bu yöntemle

ilgeadam.NSbilgeadam.Idari.Personel kisi1; kisi1 = new bi .Pers ;

ullanılır. using sözcüğü ile eklenen isim alanlarının esnelerine, proje içerisinden doğrudan erişilebilir.

sing bilgeadam.Nsbilgeadam;

bir sınıfı kullanmak için sadece ismini yazmak yeterli olacaktır.

ogrenci.Bilgi();

ktanımlanmıştır. b lgeadam.NSbilgeadam.Idari onel()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üğü kn Örnekte NSBilgeAdam isim alanının projeye dâhil edilmesi gösterilmektedir.

u

NSBilgeAdam isim alanında bulunan

Ogrenci.Bilgi ogrenciBilgi = new

İç 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

Page 346: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

Öse

4. G5. Ko

içi6. Pr sonra OK butonunu tıklayın.

E

zellikler) ve Configuration Properties (Konfigürasyon Özellikleri) kmelerinden herhangi birini seçin. enel Özellikler, projenin genel davranışlarını değiştirmek için kullanılır. nfigürasyon Özellikleri, Hata ayıklama ve Derleme seçeneklerinin değiştirilmesi

n kullanılır. oje özelliğini değiştirdikten

n çok kullanılan proje özellikleri şunlardır:

ADO.NET

Page 347: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modül 1: 15

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

Page 348: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

Page 349: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modül 1: 17

şekilde listelenir. Koyu renkle gösterilen proje, solution içinde ilk çalıştırılacak projedir.

ine proje ekleme – silme, projelere yeni nesne ekleme eş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

Bu panel ile solution iç– silme işlemleri gerçekl

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 kom

se alanı Selected Com en ği ile birlikte varsayılan olarak görünür. Bu seçenek ile

utunu verin. Object Browser pencerenin sol üst köşesinde Brow

pon ts seçene

ADO.NET

Page 350: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

18

projeye dâhil edilen referanslar ve bu referanslarla ilişkili isim alanları hiyerarşik bir ş d

angi bir isim alanı genişletilirse, içindeki tüm şekilde listelenir. Bu öğelerin herhangi biri seçildiğinde, o

Objects penceresinin sağ alt köşesinde ise, seçilen öğenin tanımını ve hangi

Server ullanmak

ekil e listelenir. Objects paneli içerisinden seçilen herh

öğeler hiyerarşiköğeye ait tüm alt öğeler Members penceresinde listelenir.

isim alanının altında olduğu gösterilir.

Explorer K

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

Page 351: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modül 1: 19

Servers sekmesinin altındaki SQL Servers menüsünü kullanarişlemleri yerine getirilebilir ve veritabanı nesneleri, sürekle bırak m

ak, veritabanı etodu 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

mik yardım kütüphanesi oluş ardım, uygulama geliştirirken yazılan koda göre tüm yard İP f hale getirmek için, “Help” menüsünden “Dynamic Help” ko

kolaylaştırmak için, Visual Studio .NET içerisinde dinaturulmuştur. Dinamik yım konularını listeler.

UCU: Dinamik yardımı aktimutunu tıklayın.

ADO.NET

Page 352: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

Page 353: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modül 1: 21

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 nı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 ullanılır.

• Kodlar arasına BreakPoint konarak, çalışmanın istenen satırda

Command paneli ile çalışma anında komut çalıştırılmasını,

çalışma zama

anlamak için Visual Studio Debug (Hata ayıklama) aracı k Visual Studio Debug aracı

durmasını, • Kodlar arasında ilerlerken Debug panelleri ile değişkenlerin

değerlerinin gözlenmesini, •

değişkenlerin değerlerinin değiştirilmesini sağlar.

ADO.NET

Page 354: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

22

BreakPoint

BreakPoint kullanımı, uygulamanın çalışmasının istenen kod satırında Çalışma, bir şartın gerçekleştiği durumda da

durduygulam

una basılır.

niyorsa, oint üzerine sağ tıklanıp BreakPoint Properties komutu verilmelidir.

Çıkan pe e bas oint

pençalışman

durdurulmasını sağlar. urulabilir. Örneğin bir değişkenin, belli bir değeri aldığı kod satırında

anın durması istenebilir. İstenen bir kod satırına BreakPoint koymak için, kod sayfasının sol tarafındabulunan panele tıklanır ya da F9 tuş Belirtilen bir şart gerçekleştikten sonra çalışmanın durması isteBreakp

ncerede Condition düğmesin ılarak BreakP Condition ceresi açılır. Bu pencerede bir değişkenin istenen bir değeri aldıktan sonra

ın durması belirtilir.

ADO.NET

Page 355: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modül 1: 23

Çalışmanın, şartın belli bir sayı kadar sağlandığı zaman durdurulması için, operties penceresinde Hit Count düğmesine basılır.

BreakPoint Hit Count penceresinde, şartın gerçekleşme sayısı girilir. nt beş defa veya daha fazla ulaşıldığı zaman durulması

belir

BreakPoint Pr

Örnekte, BreakPoitilir.

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

Page 356: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

24

Çalı kta 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ğ ri incelenmek istenen değişken veya özellikler, bu panele yazılarak ekle r. Çalı durdurulduktan sonra kodlar arasında ilerlemek gerekir. Kodlar aras emenin, yordamların içine girilmesi, üzerinden atlanması gibi birç yol vardır.

. Step Into Çalı ırılan kod eğer bir yordam veya fonksiyon ise bu yordam veya fonksiyonun içine girilir ve hata ayıklamaya devam edilir.

. Step Over Bir yordam veya fonksiyon içine girilmeden ilerlenir.

. Step Out Bir yordam veya fonksiyon içinde ilerleniyorsa, buradan çıkılarak yordam veya fonksiyonun çağırıldığı yere dönülür.

. Continue Bir sonraki BreakPoint satırına gidilir. Eğer başka bir BreakPoint kon amışsa, uygulama normal çalışmasına devam eder.

şma

• şı

• eni

şma ında ilerl

ok

1şt

2

3

4

m

ADO.NET

Page 357: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modül 1: 25

Command Panelini Kullanmak

Command paneli iki farklı modda kullanılır.

çalıştırılabilir. Immediate moduna ılır.

m ile öğrenebilir ve yeni değer

?sa40 sayi =?sa 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

• Immediate Bu modda, değişken değerleri değiştirebilir, .NET Framework sınıflarındaki metotlar veya kullanıcı tanımlı metotlar geçmek için immed komutu kullanIm ediate modunda bir değişkenin değeri ?atanabilir.

yi

50 yi

ADO.NET

Page 358: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

26

Konu 4: Uygulamanın Derlenmesi

Derleme Seçeneklerine Bakış

C# . ETgeçkontrol e

N ile geliştirilen uygulamalar çalıştırılmadan önce derleme işleminden er. Derleme işlemi ile kodun C# söz dizimine uygun yazılıp yazılmadığı

dilir ve kod çalıştırılmak üzere makine diline çevrilir.

ADO.NET

Page 359: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modül 1: 27

Uygulam• Sol sonra değişen projelerin derlenmesini sağlar.

Solution içindeki tüm projelerin tekrar derlenmesini sağlar.

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.

aları derlenmesi Build menüsünden yapılır. Build Solution ution içindeki, son derleme işleminden

• Rebuild Solution

• Build “Proje İsmi”

NOT: C# .NET ile uygulama geliştirirken yapılan söz dizimi hataları hemenTask List

paneline yansır. Buna Background Compiling denir.

ADO.NET

Page 360: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

28

Modül Özeti

1. Assembly nedir? İsim Alanı nedir? 2.

3. Object Browser niçin kullanılır? 4. rer ne işe yarar? 5. anı hatalarını yakalamak için neler yapılır? 6. Pr n

Server Explo Çalışma zam

oje asıl derlenir?

ADO.NET

Page 361: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modül 1: 29

LAB1 : Geliştirme Ortamını Tanımak

Uyg

1. Fi

tık Ne ileti kutusundan “Windows Application” şablonunu seçin. Na

Lo

2. Pr 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.

ulama1

Windows Uygulaması Oluşturmak u uygulamada “Windows Application” kullanarak Çağrı Merkezi (Call Center) B

isminde bir uygulaması oluşturacağız.

Çağrı Merkezi uygulasını oluşturmak Visual Studio .Net’i kullanarak Çağrı Merkezi isminde uygulama oluşturmak.

le menüsü altından New alt menüsünü işaret edin ve Project komutunu layın. w Project

me metin kutusuna “CagriMerkezi” yazın. cation metin kutusuna “C:\Proje” yazın ve OK butonunu tıklayın

Uygulamanın Assembly Name “Cagri” adı ile değiştirmek. oje isminin üzerinde farenin sağ butonunu

ADO.NET

Page 362: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

30

Uygulam

Ob cBu g a kütüphanesini ince

“Syste1. View m2. ütüphanesini genişletin. 3. b isim alanını

genişletin. 4.

DbCommand, OleDbDataReader, OleDbDataAdapter sınıflarını inceleyin.

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.

a 2

je t Browser Kullanmak ulamada Object Browuy ser’ı kullanarak System.Dat

leyeceğiz.

m.Data” kütüphanesini açmak enüsü içerisinden Object Browser alt menüsünü seçin. t paneli içerisindeki System.Data kObjec

System.Data Kütüphanesi içerisindeki System.Data.OleD

System.Data.OleDb isim alanını içerisindeki OleDbConnection, Ole

ADO.NET

Page 363: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modül 1: 31

private System.Data.OleDb.OleDbConnecti(string connectionString) {

on ConnectionOlustur

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=Microsoft.Jet.OleDB.4.0"); con.Open(); // Veritabanı işlemleri ilerleyen modüllerde // anlatılacaktır. Bu kısmı boş bırakın. con.Close();

d içersinde ilerleyin. ConnectionOlustur isimli metodun içine girildiği görülür.

nesnesinin State özelliğini öğrenin.

ak çalışmanın ilerlemesini sağlayın. 8. Formu kapatarak uygulamayı sonlandırın.

erties komutunu verin.

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 ko

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

7. Debug menüsünden Continue komutunu vererek ya da F5 tuşuna basar

9. con.Open() kodunun bulunduğu satıra BreakPoint koyun ve sağ tıklayarak BreakPoint Prop

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

Page 364: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

ı sonlandırın ve Visual Studio ortamından çıkın.

sağlanmamasıdır. 12. Formu kapatarak uygulamay

ADO.NET

Page 365: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 1:

ADO.NET

Page 366: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

34

ModADO.NET’e Giri

ül 2: Veri Merkezli Uygulamalar ve ş

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

Page 367: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 2: 35

• Veri depola• Bağlantılı v

ma yöntemlerini öğrenecek, e 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

Page 368: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

Page 369: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 2: 37

süre nin 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.

si

ADO.NET

Page 370: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

38

Bağlantılı (Connected) Veri Ortamları

B lantılı veri ortamları, uygulamaların veri kaynağına sürekli bağlı kaldığı

n bugüne en çok tercih edilen yöntem bağlantılı veri orta antaj sağlar. Ava

• 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 bağlantıyı 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.

Ö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.

ağ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 üretiminde

mları olmuştur. Bağlantılı ortamlar veriye erişmek için birçok av

ntajları:

ADO.NET

Page 371: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 2: 39

Bağlantısız (Disconnected) Veri Ortamları

Bağlantısız veri ortamı, uygulamanın veri kaynağına sürekli bağlı kalmadığı ri kaynağı arasında bağlantı, veri alış verişi

ra kapatılır. Bu veri ortamları çevrimdışı

,

edilebilir. Ava

ook 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

veri ortamıdır. Uygulama ile veyapılırken açılır ve işlem bittikten sonç ışmak için kullanılır. Teknolojinin ilerlemesi ve veri depolayan araçların taşınabilirliğinin sağlanması

tüm dünyada çevrimdışı ortamlara duyulan ihtiyaç artmıştır. Laptop

al

ileNotebook 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

ntajları: • Laptop, Noteb

ADO.NET

Page 372: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

40

gerçekleştirilebilir. Veri kullanıcılara gösterilebilm

üzerinde yapılan bu değişimlerin, diğer esi 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

Page 373: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 2: 41

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.

laşmak olduğu durumda Amacın veriyi saklamak olduğu durumlarda paylaşım konusunda çözüm aranmış, amacın veriyi birçok kullanıcı arasında payise ana verinin nerede saklanacağı konusunda çözüm yolları aranmıştır.

ADO.NET

Page 374: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

42

Kullanıcı sayısının ve verinin boyutunun artmasıyla, veri erişimi için bilinen

n nokta ise, her an her yerden veriye kolayca erişmemizi sağlayan ML Web Servis modelidir.

lamalar geliştirmek için veri erişim modelleri kullanılır. Bir veri

deki düzeyler belirler.

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 soX Veri merkezli uygueriş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 modelin

• İstemci Katmanı (Client tier): ı servis katmanı

Katmanı (Interoperability tier):dilden bağımsız, her tür veriye etkileşim sağlayan katmandır. Bu katmana herhangi bir işletim sistemi üzerinde bulundurulabilen XML

Sunum ya da kullanıcolarak 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 Platform ve

Web Servislerini örnek verebiliriz.

ADO.NET

Page 375: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 2: 43

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

Page 376: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

Page 377: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 2: 45

kullanmamakla birlikte, ADO modelinden gelen pek çok çözüm yolunu da

ğ bağlantıları

DO.NET modelinin diğer veri erişim modellerine göre üstünlüklerini şöyle

• ADO.NET, veritabanından çekilen verilerin kopyasını XML formatını

ıcı sayısı arttıkça kaynak kullanımı da artmaktadır. N-Katmanlı (N-tier) uygulama yapısı kullanılarak, uygulamaların

mları için uygulama geliştirilebilir.

ADO.NET Nesne Modeli:

beraberinde getirir. Uygulama gelişim ihtiyacı arttıkça, yeni uygulamalarda Web uygulama

odeline olan bağlılık gittikçe azalmaktadır. Şimdilerde ise amü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. Asıralayabiliriz:

kullanarak belleğe aktarır. • Uygulamanın kullan

katmanlar üzerinden dağıtılması sağlanır. Böylece uygulamaların ölçeklenirliği artar.

• ADO.NET ile bağlantısız veri orta• ADO.NET gelişmiş XML desteği verir.

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

Page 378: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

46

DataSet sınıfları, çevrimdışı ortamlar için veri depolama ve yönetme işlemlerini ağlar. DataSet sınıfları veri kaynağından bağımsız her tür uygulama ve

n kuServisleri üzerinden veri çekmek için kullanılır.

sağlay çin ınıflar sayesinde istenilen türdeki veri kaynağına kolayca bağlantı çekil

nesne modeli, aşağıdaki veri sağlayıcı sınıflarını içerir:

• SQL Serv ağlayıcısı E

e ona uygun veri sağlayıcı sınıfı

ADO.NET Veri Sağlayıcıları:

sveritabanı içi llanılabilir. Özellikle İlişkisel Veritabanı, XML ve XML Web

.NET verikullanılır. Bu s

ıcı sınıfları, farklı türdeki veritabanlarına bağlanmak i

kurulabilir, veri ebilir ve gerekli güncelleme işlemleri yapılabilir. ADO.NET

er .NET Veri S

• OLE DB• Diğer .N

.NET Veri Sağlayıcısı T Veri Sağlayıcıları

DİKKAT: Hangi veri kaynağı kullanılacaksa, sadeckullanılmalıdır.

NET veri sağlayıcıları, ADO.NET mimarisinin veritabanı ile uygulama indows, Web) veya XML Web Servis arasında bağlantı kurmak için her tür

n ç ğlayıcıları, System.Data anım

(Walt yapıyı barındıraisim alanı içinde t

ekirdek bileşendir. Tüm veri salanmıştır.

ADO.NET

Page 379: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 2: 47

NET Framework 1.sağlayıcı sınıfları gelm

0 s

ver 2000 veritabanlarına hızlı ient isim

ss veri tabanlarına bağlantı kurmayı sağlar. OLE B bağlantı nesneleri System.Data.OleDb isim alanında bulunur.

1.1 s ılarına Oracle .NET ve ODBC .NET veri sağlayıcıları da eklenmiştir.

E .NET: Oracle veritabanlarına bağlantı için tasarlanmış veri em.Data.OracleClient isim

ojeye “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.

ürümü ile birlikte SQL Server .NET ve OLE DB .NET veri iştir.

SQL Server .NET: SQL Server 7.0 ve SQL Serbağlantı sağlar. SQL Server bağlantı nesneleri System.Data.SqlClalanında bulunur.

OLE DB .NET: SQL Server 6.5 ve daha öncesi sürümlerine, Oracle, Sybase, DB2/400 ve Microsoft AcceD NET Framework sağlayıc

ürümü ile birlikte SQL Server .NET ve OLE DB .NET veri

ORACLsağlayıcısıdır. Oracle bağlantı nesneleri Systalanında bulunur.

NOT: System.Data.OracleClient isim alanını kullanmak için, pr

ADO.NET

Page 380: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

48

Her bir veri sağlayıcısı içerisinde, birço si bulunur.

• Command

k bağlantı nesne• Connection

• DataReader

• DataAdapter

XxxConnection: : Veri kaynağına bağlantı için kullanılan sınıftır.

ADO.NET

Page 381: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 2: 49

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ğ re aktarılır. Xxx Çevrimiçi bağlantılarda sadece veri okumak için kullanılan

NOT: Xxx yerine seçilen veri sağlayıcısına göre SQL, OLEDB, Oracle ve ODBC

Mo

lantılı kontrolleDataReader:

sınıftır. XxxDataAdapter: Çevrimdışı bağlantılarda kullanılan veri işleme nesnesidir.

eklerinden biri kullanılır.

dül Özeti

1. Veri depolama yöntemleri nelerdir?

i nelerdir? 4. ADO.NET veri sağlayıcıları nelerdir?

2. Bağlantılı ve Bağlantısız Veri ortamları nelerdir? 3. Veri erişim yöntemler

ADO.NET

Page 382: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

50

LabADO

2: Veri Merkezli Uygulamalar ve .NET’e Giriş

Uygulama 1

eni bağlantı oluşturmak. orer’ı kullanarak Çağrı Merkezi uygulaması için

i bir bağlantı oluşturulur.

lantı oluşturmak.

YBu uygulamada Server Explyen

Çağrı Merkezi Uygulaması için yeni bağ

ADO.NET

Page 383: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 2: 51

3. Vis .Net’i k File menüsü altından O enüsü içerisinden Project komutunu tıklayın. Look i kutusundan “C:\Proje\ CagriMerkezi” klasörünü seçin. Açılan t syasını seç k

Open b yın. 4. Uy agriM Proje isminin üzerinde fareni nunu tıklayın. Açılan menüd n. Aç eritabanı”

kl Aç i.mdb” veritabanını

se5. erkezi” uygulaması için yeni bağlantı oluşturmak. Se i üzerinde farenin sağ butonunu tıklayın. Açılan

menüden Add Connection komutunu tıklayın. Aç Pr rek Next

bu

ual Studio ullanarak Çağrı Merkezi uygulamasını açmak. pen alt m

n açılanOpen Projec penceresinden “CagriMerkezi.sln” do ereutonunu tıklagulamaya C erkezi veritabanını eklemek.

n sağ butoen Add menüsünden Add Existing Item komutunu veri

cere üzerindeki Look in açılan kutusundan “CD Sürücüsü\Vılan penasörünü seçin. ılan Add Existing Item penceresinden “CagriMerkezçerek Open butonunu tıklayın.

“CagriMrver Explorer penceres

ılan Data Link Properties penceresinin Provider sekmesini tıklayın. ovider sekmesinden Microsoft.Jet.OLEDB.4.0 Provider ‘i seçetonunu tıklayın.

ılan Connectio Aç n sekmesinin görüntüsünü resimdeki gibi düzenleyerek OK

butonunu tıklayın.

ADO.NET

Page 384: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 4:

ADO.NET

Page 385: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 3 53

Mod aynak a Bağlanül 3: Veri K ların mak

Veriyi yöneten uygulamalar, duyar. Visual Basic .NET ile

bu verilerin bulunduğu kaynağa bağlanma ihtiyacı veri kaynağına bağlanmak için, kaynağın tipine,

u modülün sonunda:

yapısına göre farklı nesneler ve farklı veri sağlayıcıları kullanılır. B

ADO.NET

Page 386: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

Page 387: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 3 55

Kon ek u 1: Veri Sağlayıcı Seçm

Veri Sağlayıcı Nedir?

ADO.NET mimarisi, uygulama ile veritabanı arasında bağlantı kurmak ve

eğiştirmek ve silmek için veri llanılır.

kurulan bağlantı üzerinden kayıtları almak, dsağlayıcılarını kullanır. Farklı veritabanları için farklı veri sağlayıcıları ku

ADO.NET

Page 388: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

56

Uygun veri sağlayıcı seçiminde en önemli kriter “Hangi sağlayıcı en iyi

ir?” sorusunun cevabıdır. Çünkü Sql Server, Oracle, Access sağlayıcıları ile erişilebilir.

antı kurmak için farklı veri ılarını destekler.

• SQL Server .NET

Veri

performansı vergibi veritabanlarına farklı veri Microsoft .NET Framework, veritabanları ile bağlsağlayıc

• OLEDB .NET • ODBC .NET

Sağlayıcı Sınıfları

.NET Framework içindeki veri sağlayıcıları, System.Data.dll içerisinde ki

ında yer alır. Tablo 1.1 de hangi sağlayıcı isim alanı ile abanına bağlanılabileceği gösterilmektedir.

System.Data isim alanhangi verit

ADO.NET

Page 389: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 3 57

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

Page 390: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

58

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.

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

ADO.NET

Page 391: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 3 59

SqlConnection; MS SQL Server üzerinde bağlantı açmak ve kakullanılan sını

patmak için fdır.

SqlCommand; MS SQL Server üzerinde Stored Procedure (Saklı Yordamlar)

ırılan SELECT sonuçlarını geri döndürmek için kullanılan sınıftır.

System.Data.SqlClient isim alanı içerisinden çevrimdışı bağlantılar geliştirmek için SqlConnection, SqlDataAdapter, DataSet sınıfları kullanılır. 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.

Stored Procedure

n SELECT sorguların sonuçlarını geri döndürmek için kullanılan sını Sys im alanı içerisinden çevrimdışı bağlantılar geliştirmek için , OleDbDataAdapter sınıfları kullanılır.

leDbConnection; Access veya diğer veritabanları üzerinde bağlantı açmak vOleDbDataAdapter; 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.

veya SQL Cümleleri çalıştırmak için kullanılan sınıftır. SqlDataReader; MS SQL Server üzerinde SqlCommand ile çalıştsorguların

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 (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ıla

ftır.

tem.Data.OleDb isOleDbConnection

Oe kapatmak için kullanılan sınıftır.

ADO.NET

Page 392: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

60

Konu 2: Bağlan turmak tı Oluş

Bağlantı Cümlesi (Connection String) Oluşturmak

ADO.NET

Page 393: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 3 61

Bağlantı cümlecümle, veri birleşiminde

si, veri kaynağına bağlanmak için gerekli bilgileri tutar.. Bu ka bağlantı kurmak için gerekli etrelerin

n o 2.

Par

ynağına bağlantı paramluşur. Bu parametrelerin listesi Tablo 1’de gösterilmiştir.

ametre 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.

Con out veya Connect Tim out

Veritabanı bağlantı için beklenmesi gereken maksimum saniye sayısıdır. Varsayılan deger 15 saniye dir.

neectionTime

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

modunu belirtir. SQL Veritabanını Read-only(Sadece okunur) ya da Write(Yazılabilir)Server bağlantılarında kullanılmaz.

Tab 2 Provide

alacağı de

Tür

lo .1: Bağlantı cümlesinin parametreleri

r parametresinin Access, SQL Server ve Oracle veri tabanlarına göre ğerler Tablo 2.2 de gösterilmiştir

Açıklama

SQLOLEDB SQL Server için Microsoft OLE DB Provider

MSDAORA osoft OLE DB Provider ORACLE için Micr

Micro oft.Jet.OLEDB.4.0 Microsoft Jet için OLE DB Provider

Tablo 2.2: Bağlantı cümlesinin parametreleri s

ADO.NET

Page 394: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

62

Bağ ntı Cümlesini (Connection String) Kullanmak

la

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";

kir. Bağlantının yapılacağı Northwind veritabanının local akinede C:\Samples dizini altında bulunduğu belirtiliyor.

Northwind = new System.Data.OleDb.OleDbConnection();

Ö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 gerem System.Data.OleDb.OleDbConnection cnNorthwind; cn

ADO.NET

Page 395: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 3 63

cnNorthwind.ConnectionString=@"Provider=Microsoft.Jet.OLEDB.

QL rver 7.0 sürümünden eski bir veritabanı sunucuna bağlantı yapıldığı için ovider özelliği SQLOLEDB olarak belirtiliyor. ProdServ isimli sunucudaki

.OleDbConnection();

ity=SSPI”;

D QL Server veri ka ğ yüzden SQL Server veritabanı bağlantı c

Bağl i

4.0;Data Source=C:\Samples\Northwind.mdb";

Örnekte Sql Server 6.5 veri tabanı için bağlantı cümlesi oluşturulmuştur. SSePr

Pubs veritabanına, Windows hesabı (SSPI) ile bağlanılıyor. System.Data.OleDb.OleDbConnection cnNorthwind; cnNorthwind = new System.Data.OleDb cnNorthwind.ConnectionString = “Provider=SQLOLEDB;Data Source=ProdServ;Initial Catalog=Pubs;Integrated secur

İKKAT: Microsoft Access veri kaynağı, tek veri tabanından oluşur. Syna ı ise birden fazla veri tabanından oluşur. Bu

ümlesinde Initial Catalog parametresi kullanılır.

antı Cümlesi(Connection String) Örnekler

ADO.NET

Page 396: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

64

Ms Access ile OLEDB Bağlantı Cümleleri

Tablo 3 ı Cüml ri

Acce rovider=Microsoft.Jet.OLEDB.4.0; Data Source=DB_Name.mdb;

2. de OLEDB ile Access’e bağlanmak için gerekli, örnek Bağlantgösterilmektedir. ele

ss’e Bağlantı "P

"

AccesGrubuüze

" s’e Çalışma "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=Db dosyası den Bağlantı

_Name.mdb; Jet OLEDB:System Database=Db _Name.mdwrin

Ac Koruma ntı

"Provider=Microso 4.0; Data Source=Db _Name.mdb; Jet OLE ase Password=sifreniz"

cess’e Parolalı Bağla

ft.Jet.OLEDB.DB:Datab

NeBa

"Provider=Microso

_Name.mdb"

twork’teki Access’e ğlantı Source=\\Server_

ft.Jet.OLEDB.4.0; Data Name\Share_Name\Share_Path\Db

Remote Server(Uzak Server) üzerindeki bir Access’e Bağlantı

"Provider=MS Rem /Your-Remote-Server-IP; RemotSource=Db_Name

ote; Remote Server=http:/e Provider=Microsoft.Jet.OLEDB.4.0; Data .mdb"

Tabl ess ile OLEDB Bağlao 2.3: Ms Acc ntı Cümleleri

ADO.NET

Page 397: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 3 65

S LQ 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 Au ile bağ

"Driver={SQL Server};Server= Server_Na Username;Pwd= thentication

lanmak me;Database=Db_Name;Uid=

sifreniz;"

SQL Server sunucusuna Windowsbağlanmak

"Driver={SQL Server}; Server= Server_Name; Database=DB _Name;Trusted_Con s;" Authentication ile nection=ye

Tablo 2.4: SQL er ile ODBC Bağlantı Cümleleri Serv

ADO.NET

Page 398: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

SQLSQLbağ

Server sunucusuna Authentication ile lanmak

"Provider=SQLOLEDB;Data Source= Server_Name;Initial Catalog=Db_Name;User Id= Username;Password=sifreniz;"

SQL Serv sWindows tbağlanm

ial er unucusuna "Provider=SQLOLEDB;Data Source= Server_Name;Init Au hentication ile Catalog=DB_Name;Integrated Security=SSPI;" ak

Tablo 2.5: SQL Server ile OLEDB Bağlatı Cümleleri

ADO.NET

Page 399: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 3 67

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_Connection=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

Page 400: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

68

Tablo 2.7: Ol Eşdeğerleri

OLEDB v qe S lServer Parametreleri Eşdeğerleri

Data Sou erc Server

User ID UID

Pass rd PWD wo

Init

eDb ve Sql Server Parametre

ial Catalog Database

ADO.NET

Page 401: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 3 69

Konu 3: Bağlantı Yönetimi

Bağlantıyı Açmak ve K ak apatm

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

Page 402: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 metotl nımı gösteri cnNorthwind.ConnectionOLEDB ;Data Source= //Bağ k

/Veritabanı işlemleri bu arada gerçekleştirillir. //Bc

O atalarından d amanı h

ımdan kaynaklanabilir.

y 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.

arının kulla lmektedir.

String = @"Provider=Microsoft.Jet. .4.0 C:\Samples\Northwind.mdb";

lantıyı açmacnNorthwind.Open(); /

ağlantıyı kapatmak nNorthwind.Close();

pen metodu ile veri kaynağı açılırken, çeşitli çalışma zamanı holayı bağlantı açılmayabilir ve uygulama hata üretebilir. Bu çalışma zataları

• Sunucunun bulunamamasından, Veritabanının bulunamamasından, • Hatalı kullanıcı adı veya parola girilmesinden, • Donanım veya yazıl

Try, Catch, Finally deyimlerini kullanarak bir bloğu oluşabilecek potansiyel hatalardan korunur. Tr

ADO.NET

Page 403: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 3 71

Catch blokları, uygulamanın ürettiği hataları, tiplerine göişler. Bu blok içersine, yakalanan hataya göre yapılacak işlemler yazılmalıdır.

re sıralı bir şekilde

ı bir durumda veritabanı işlemleri ın açılmasını bildiren

çıkarılabilir. ra

iği veya üretilmediği iki durumda da yapılması ken işlemler yazılır. Örneğin, bağlantının kapatılması her iki durumda da

Db.OleDbConnection cnNorthwind;

em.Data.OleDb.OleDbConnection(); ring = @"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();

}

Örneğin bağlantının açılmadığgerçekleştirilmeye çalışıldığı zaman, kullanıcıya bağlantınmesaj kutusu

lly bloğunda, Try ve Catch bloklarından herhangi biri işlendikten sonFina

çalışır. Bu blokta, hatanın üretildgereyapılması gereken bir işlemdir.

System.Data.Oletry { cnNorthwind = new Syst cnNorthwind.ConnectionSt

ADO.NET

Page 404: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

72

Bağlantı Durumlarını Kontrol Etmek

Bağla s State

e belirtilmiştir.

İsim

ntı ınıfının durumu hakkında bilgi almak için, bağlantı sınıfının özelliği kullanılır.

State özelliğinin alabileceği değerler tablo 3.1.1’d

Açıklama Değeri

Broken Yalnızca, açık bi ı durum

16 r bağlantının kopup tekrar bağlanıldığ

Closed Bağlantı kapalı 0

Connecting Veri kaynağına bağlanma aşamasında 2

Executing Bağlantı üzerind 4 en bir komutu çalıştırılıyor

Fetching Bağlantı üzerinden veri çekiliyor 8

O 1 pen Bağlantı açık

Tablo 3.1.1: Connection nesnesinin State Property değerleri private void ConnectionAc(OleDb.OleDbConnection con)

onnection, sadece kap ılacak If (con.State == ConnectionState.Closed)

{ con.Open(); }

} ğlantı nesnelerinin durumu değiştiğ StateChange

rumlarda açılıp kapandığı öğrenilebilir.

{ //C alı ise aç

Ba i zaman olayı tetiklenir. Bu olay ile bağlantının hangi du

ADO.NET

Page 405: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 3 73

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

Bağlantın kkında bilgi ın yeni durumu haverir.

CurrentState

Bağlantının değişmeden önceki durumu OriginalState

hakkında bilgi verir. Tablo 3.1.2: StateChangeEventArgs parametresinin özellikleri

eDb.OleDbConnection conn;

. olayı gerçekleştiği zaman ağırılması ayarlanır

c

(Object sender,StateChangeEventArgs e)

tring() + umu olarak

.");

public void ConnectionOlustur() { System.Data.Ol

conn = new System.Data.OleDb.OleDbConnection(); / Bağlantı ayarları yapılır. /

// .. // Bağlantının StateChange / ının ç/ DurumRapor yordam

onn.StateChange += new por); StateChangeEventHandler(DurumRa

} public void DurumRapor{ MessageBox.Show("Bağlantı " +e.OriginalState.ToS" durumundan " + e.CurrentState.ToString() + " durdeğişti}

ADO.NET

Page 406: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

74

Modül Özeti:

1. Veri sağlayıcılar ne işe yarar? SQL Server 6.5 veri tabanına

ngi veri sağlayıcının kullanılması gerekir. . Connection nesnelerinin kullanılması için gereken temel özellik

3. Bağlantı açıkken tekrar açılmaya çalışıldığında ne olur? Bu durum llenir? h bloğu ne için kullanılır? Finally bloğunda hangi kodlar

yazılır? nlaşılır?

bağlanmak için ha2

hangisidir?

nasıl enge4. Try Catc

5. Bağlantı durumu Connection nesnesinin hangi özelliği ile aDurum değiştiği zaman hangi olay tetiklenir?

ADO.NET

Page 407: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 3 75

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:

öre bağlantı cümlesi oluşturabilecek,

Kontro eVeriT ndows proj Form üzerine, tablodaki kontrolleri ekleyin belirtilen özelliklerini ayarlayın.

• Farklı veritabanlarına g• Veritabanına bağlantı açıp kapayabilecek, • Bağlantıların State özelliği ile durumunu gözlemleyebileceksiniz.

ll rin eklenmesi abaniBaglantisi isminde yeni bir Wi esi açın.

Kontrol – Kontrol İsmi Özellik Değer

TextBox – txtVeriTabani Text TextBox – txtSunucu Text

TextBox – txtKullaniciAdi Text Tex Text tBox – txtParola TextBox – txtTimeOut Text Label – lblConnectionString Text Label – lblConnectionState Text Closed

ADO.NET

Page 408: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

76

GroupBox Text Bağlantı İşlemleri: ComboBox – ComboBox1 DropDownStyle DropDownList

Button – Button1 Connection String Oluştur

Text

Button – Button2 Connection Oluştur Text

Button – Button3 Connection Aç Text

Button – Button4 Connection Kapat Text

Kod ası ı oluşturmak için öncelikle bağlan lesi oluşturulması

kullan ın gireceği bilgil re oluşturulur.

ümlesi için gerekli bilgileri tutan değ nleri tanımlayın. rivate string ConnectionString; private string Provider; private string Database; private string Server; private string KullaniciAdi;

;

on;

nı seçeneklerini

ct sender,

comboBox1.Items.Add("Microsoft Access");

ların yazılmVeritabanı bağlantıs tı cümgerekir. Bu bağlantı cümlesi, ıcın ere gö

1. Bağlantı c işkep

private string Parola;private String 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 oleDbC

2. Formun Load anında, ComboBox kontrolüne veritabaekleyin.

private void Form1_Load(System.ObjeSystem.EventArgs e) {

ADO.NET

Page 409: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 3 77

comboBox1.Items.Add("Microsoft comboBox1.Items.Add("Microsoft

SQL Server 2000"); SQL Server 6.5");

dIndex = 1;

3. ider ismini ıcı adı, parola, sunucu

pri a d(System.Object

iklenir.

.4.0";

case 1: "";

e);

break; }

private void EnableTextBoxes(bool SQLVeriTabaniSecili) {

VeriTabaniSecili; txtSunucu.Enabled = SQLVeriTabaniSecili;

ili ise

txtParola.Text = "";

n

utton1_Click(System.Object EventArgs e)

i ise == 0)

Database = txtVeritabani.Text;

// Varsayilan olarak Sql Server 2000 seçili olur

comboBox1.Selecte}

ComboBox kontrolünden veritabanı seçildiği zaman, Provdeğiştirin. Seçilen veritabanı Access ise, kullanve timeout TextBox kontrollerini pasif duruma getirin.

vnder, System.EventArgs e)

te void comboBox1_SelectedIndexChangese{ // Farkli Veritabani seçildigi zaman tet switch (comboBox1.SelectedIndex) { case 0: Provider = "Microsoft.Jet.OleDB EnableTextBoxes(false); break;

Provider = EnableTextBoxes(tru break; case 2: Provider = "SQLOLEDB"; EnableTextBoxes(true); }

txtKullaniciAdi.Enabled = SQLVeriTabaniSecili; txtParola.Enabled = SQLVeriTabaniSecili;

txtTimeOut.Enabled = SQL

ss veritabani seç // Acce if (! SQLVeriTabaniSecili) { txtKullaniciAdi.Text = ""; txtTimeOut.Text = ""; txtSunucu.Text = ""; } }

4. Connection String oluşturma düğmesine basıldığı zaman, giriledeğerleri alın ve bağlantı cümlesi oluşturun.

private void Bm.sender,Syste

{ ConnectionString = ""; // Access Veritabani seçil

oBox1.SelectedIndex if (comb {

ADO.NET

Page 410: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

78

ConnectionString = "Provider= " + Provider + Data Source= " + Database ;

aniciAdi = txtKullaniciAdi.Text; rola = txtParola.Text;

TimeOut = txtTimeOut.Text;

ConnectionString = "Provider=" + Provider + ";";

a Source=" + Server; nitial Catalog=" + Database;

TimeOut;

nectionString;

leyi kullanarak on nesnesi oluşturun. Burada dikkat edilmesi gereken

kullanıcının seçtiği veritabanı tipine göre farklı bağlantı nesnesi

on2_Click(System.Object sender,

s veritabani seçili ise x == 0)

OleDb.OleDbConnection(ConnectionString); tateChange+= new

ventHandler(DurumDegisti);

{ on = new

.SqlClient.SqlConnection(ConnectionString);

r.

"; } else { Kull Pa

Server = txtSunucu.Text; Database = txtVeritabani.Text; if (Provider != "")

{ } ConnectionString += "Dat ConnectionString += ";I ConnectionString += ";User ID=" + KullaniciAdi; ConnectionString += ";Password=" + Parola; ConnectionString += ";Connection TimeOut=" + } lblConnectionString.Text = Con}

5. Bağlantı cümlesi oluşturulduktan sonra, bu cüm

Connecti

nokta, oluşturulmasıdır.

private void ButtSystem.EventArgs e) { // Acces if (comboBox1.SelectedInde { oleDbCon = new System.Data. oleDbCon.SStateChangeE } else sqlCSystem.Data 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 bildirili lblConnectionState.Text = e.CurrentState.ToString(); }

ADO.NET

Page 411: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 3 79

6. Bağlantı nesnesi oluşturulduktan sonra, Connection Aç düğmesine ullanıcının bazı

ri yanlış girmesi durumu göz önüne alınarak Try Catch

on3_Click(System.Object sender,

h (InvalidOperationException ex)

MessageBox.Show(ex.Message.ToString());

OleDb.OleDbException ex)

MessageBox.Show(ex.Message.ToString());

}

sqlCon.Open();

x)

MessageBox.Show(ex.Message.ToString());

h (System.Data.SqlClient.SqlException ex)

ow(ex.Message.ToString());

}

sine basılınca oluşturulan bağlantıyı bularak

nder,

bCon != null)

leDB baglantisi olusturulduysa

a on.Close();

}

basılınca bağlantı Open metodu ile açın. Ancak kdeğerleblokları kullanılmalıdır.

private void ButtSystem.EventArgs e) { if (oleDbCon != null) { // OleDB baglantisi olusturulduysa try { oleDbCon.Open(); } catc { } catch (System.Data. { }

else { // Sql baglantisi olusturulduysa try { } catch (InvalidOperationException e { } catc { MessageBox.Sh } }

}

nection Kapat düğme7. Conkapatın.

private void Button4_Click(System.Object seSystem.EventArgs e) { if (oleD { // O oleDbCon.Close(); } else { // Sql baglantisi olusturulduys sqlC }

ADO.NET

Page 412: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 5:

Modİşle

ül 4: Bağlantılı (Connected) Veritabanı mleri

Bu ile bağlantılı veritabanı işlemlerin nasıl yapıldığını r

modülde ADO.NET öğ eneceksiniz.

Page 413: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 4 81

Bu modülün sonunda: • Bağlantılı veri ortamlarıyla çalışmayı öğrenecek,

e INSERT, UPDATE ve DELETE sorgularını

• Command oluşturabilecek, • Command ile geriye tek değer veya kayıt kümesi döndürebilecek, • Command il

çalıştırabilecek,

Page 414: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

82 Modül 4: Connected Veritabanı İşlemleri

Konu 1: Bağlantılı Veri Ortamlarıyla Çalışmak

Bağlantılı Uygulamalar İçin Veritabanı Mimarisi

Page 415: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 4 83

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ğ tı Tablo 4.1 de belirtilmiştir.

Tablo 4.1. Bağlantılı Veri Ortamı Sınıfları

Sınıf

lan lı veri ortamları içerisinde kullanılan sınıflar

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.

Page 416: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

84 Modül 4: Connected Veritabanı İşlemleri

Konu 2: Command ile Çalışmak

Commmand Nedir?

Command, veritabanı üzerinde Stored Procedure (Saklı Yordam) ve Sorgu

Page 417: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 4 85

çalıştırmak için kullanılı Nesneleri ile veritabanı tablolarında; sorgu, ekleme, silme ve güncelleme işlemleri yapılabilir.

Tablo 4.2 de hangi veri anıldığı gösterilmektedir.

Command

Veritabanı üzerinde

dure ve Sorg nin belirli özelliklerini kullanmak ğıda belirtilmiştir.

r. Command

sağlayıcı için hangi Command Nesnesinin kull

Tablo 4.2.

Nesnelerı

Stored Proce u çalıştırmak için Command Nesnelerigerekir. Command Nesnelerinin bu özellikleri aşa

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.

Nesne Veri Sağlayıcıları

System. i Sağlayıcısı Data.SqlClient.SqlCommand SQL Server .NET Ver

System. Veri Sağlayıcısı Data.OleDb.OleDbCommand OLE DB .NET

System. ıcısı Data.OleDb.ODBCCommand ODBC .NET Veri Sağlay

• CommandText: Stored Procedure adını veya Sorgu cümlesini tutar.

Page 418: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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ı

Page 419: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 4 87

Command Oluşturmak

Command, kod içerisinden veya ToolBox üzerinden oluşturulabilir. Bu öntemler ile kullanılan veritabanına göre, OleDbCommand veya SqlCommand

rnekte Access veritabanına bağlanmak için, OleDbCommand sınıfı mmand sınıfının gerekli özelliklerine değer atanmıştır.

/Access Veritabanına bağlanmak için Command tanımlanır.

ne universiteler md.CommandText="select * from universiteler";

ction özelliğine aktif connection /aktarılır

mmandType.Text;

ı takip

onnection tanımlanır. 2- ToolBox içinden Data paneli seçilir.

esi form üzerine

ynesneleri oluşturulur. Ötanımlanmış ve bu Co /System.Data.OleDb.OleDbCommand cmd = new System.Data.OleDb.OleDbCommand(); //Command Sınıfının CommandText özelliğic //Command Sınıfının Conne/cmd.Connection=conn; //Command Sınıfına, sorgu cümlesi yazılacağını belirler. cmd.CommandType=Co

nden Command nesnesi oluşturmak için belirtilen adımlarToolBox üzeriedin.

1- Veri kaynağına bağlantı kurmak için C

3- Data panelindeki OleDbCommand veya SqlCommand nesnsürüklenir.

Page 420: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

88 Modül 4: Connected Veritabanı İşlemleri

4- Eklenen Command nesnesinin özellikleri Tablo 4.4’e göre ayarlanır.

Ö

zellik Açıklama

N snesinin kod içerisinde kullanılan ismidir.

ame Command ne

C hangi Connection üzerinde çalışacağını belirler. Bu özellik ile yeni Connection oluşturabilir veya var olan

ağlanılabilir.

onnection Command nesnesinin

Connection nesnesine b

C mandType Command nesnesinin tipini belirler.

seçilir.

Text: SQL Cümlesi

StoredProcedure: Kayıtlı Yordam

om

Çalıştırılacak Command’a göre Text, StoredProcedure ve TableDirect

TableDirect: Tablo kayıtları

TableDirect sadece OleDbCommandnesnesi tarafından kullanılır.

Co

komutudur. Seçilen CommandType’a göre

TableDirect: Veritabanındaki Tablo adı

mmandText Command nesnesinin çalıştırılacak

CommandText belirlenir.

Text: Çalıştırılacak SQL Cümlesi.

StoredProcedure: Çalıştırılacak StoredProcedure adı.

P in CommandText ardan değer almak veya

ğer döndürmek için rs özelliği Collection

olduğu için bir veya birden çok değer alabilir veya gönderebilir.

arameters Command nesnesinkomutuna dışkomuttan geriye de

ılır. Parametekullan

Tablo 4.4: Command Özellikleri

Page 421: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 4 89

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.

rs nesnesinin koleksiyonudur.

nra, sonuç p

leri oluşturulur ve Command nesnesinin bu nesneler eklenir. nılarak Command nesnesinin

asarım aşamasında parametreler eklenir.

X k için aşağıdaki

Stored Procedure ve SQL Cümlelerinin parametre değerlerini saklamak için, XXXCommand nesnesinin Parameters özelliği kullanılır. Aynı zamanda bu özellik XXXParamete 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 soarametrelerinin değerleri geriye döndürülebilir.

Command nesnesine parametre eklemek için aşağıdaki yöntemler kullanılır. • XxxParameter nesne

Parameters koleksiyonuna • Properties penceresi kulla

Parameters özelliğine t

XXParameter nesnesini kullanarak, parametre eklemeadımlar takip edilir.

1- Yeni bir OleDbParameter veya SqlParameter nesnesi oluşturulur. 2- Eklenen Parameter nesnesinin özellikleri Tablo 4.5 göre ayarlanır.

Page 422: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

90 Modül 4: Connected Veritabanı İşlemleri

Property Açıklama

ParameterName Parametrenin ismi, @Ad gibi

D veri türü. Kullanılan veri tabanına göre SqlDbType veya OleDbType

bType ,SqlDbType, OleDbType Parametrenin

enumeratorlerinden seçilir.

S um boyutu.

ize Parametredeki verinin byte olarak maksim

D Parametrenin türü. ParameterDirection biri ile belirtilir. Bu özelliğin

alabileceği değerler:

(varsayılan ğer)

ParameterDirection.InputOutput ParameterDirection.Output

turnValue

irection

değerlerinden

ParameterDirection.Input

de

ParameterDirection.Re

Tablo 4.5: XxxParameter Özellikleri 3- XxxParameter nesnelerini Command nesnesine eklemek için,

Command nesnesinin Parameters koleksiyonmetodu kullanılır. Eğer bu komut sonuç döndü

unu içerisindeki Add recek bir stored procedure

çağırıyorsa, herhangi bir parametre eklemeden önce urnValue parametresini eklenmelidir.

Parametrelerin eklenme sırası önemli değildir. ParameterDirection.Ret

Tablo 4.6 da Direction özelliğinin değerleri listelenmiştir.

Page 423: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 4 91

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);

n, bu Command nesnesinin Connection, CommandType ve CommandText özelliklerine değerler atanır.

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 penceresinde

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.

Page 424: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 nesnesi

• losundaki toplam stok miktarını geriye döndürmek için k için

m ürün sayısını geriye döndürmek için

uteScalar metodu kullanılır. rnekte nesnesinin ExecuteScalar metodu ile Universiteler

dürülmektedir.

eDb.OleDbConnection(@"provider = crosoft.JET.OLEDB.4.0; Data source=..\universiteler.mdb"); tem.Data.OleDb.OleDbCommand cmd = new tem.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

döndürülebilir. Bu tür durumlar için DataSet yerine Commandkullanılmalıdır. Command ile geriye tek değer döndüren senaryolara, aşağıdaki örnekler verilebilir.

Stok tab• Ürün tablosundaki toplam kayıt sayısını geriye döndürme• Ürün kategorisine göre topla

OleDbCommand veya SqlCommand nesnesi ile geriye değer döndürmek için, Exec

Ö OleDbCommand

osundaki toplam kayıt sayısı geri döntablSystem.Data.OleDb.OleDbConnection conn = new System.Data.OlMiSysSys

Page 425: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 4 93

Procedure ile geriye tek değer döndürülebilir. Örnekte Ürün TabloMiktarı SqlCommand nesnesi ile geriye döndürülmektedir.

sundaki Stok

s

.SqlCommand(sql,cnAlisveris);

ystem.Data.SqlClient.SqlParameter prmID = new

.Value = 42;

Kon 4Döndü

tring sql ="SELECT StokMiktari FROM Urun WHERE UrunID=" + "@UrunID"; System.Data.SqlClient.SqlCommand cmUrun = new System.Data.SqlClient SSystem.Data.SqlClient.SqlParameter("@UrunID",System.Data.SqlDbType.Int, 4); cmUrun.Parameters["@UrunID"] cnAlisveris.Open(); int adet = Convert.ToInt32(cmUrun.ExecuteScalar()); cnAlisveris.Close(); MessageBox.Show("Quantity in stock: " + adet.ToString());

u : Command ile Geriye Kayıt 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.

Page 426: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

94 Modül 4: Connected Veritabanı İşlemleri

• Tablodan tek kayıt döndürmek.(Müsteri tablosundan Müsgöre kayıt döndürmek)

• Sadece oku

teriID ye

nur 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.

Page 427: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 4 95

Metot Açıklama

Close 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 olarak geri döndürür. tamsayı(Integer)

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. i detay bilgilerini gösterir. Tablo hakkındak

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

Page 428: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

Page 429: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 4 97

DataReader kullanarak kayıt çekmek için aşağıdaki adımları takip edin.

5- DataReader nesnesinin Read metodu False oluncaya kadar, kayıtlar kontrollerine aktarılır.

6- Örn eader ile form üzerindeki Lis x

SysSys+"FROM is); c Sy e

.CloseConnection);

rdr

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.

döngü ile okunur ve FormDataReader kapatılır.

ekte Ürün Tablosundaki tüm ürünler, OleDbDataRtBo kontrolüne eklenir.

tem.Data.OleDb.OleDbCommand cmUrun = new tem.Data.OleDb.OleDbCommand("SELECT UrunAdi, StokMiktari"

Urun", cnAlisvernAlisveris.Open();

st m.Data.OleDb.OleDbDataReader rdrUrun;

rdrUrun = cmUrun.ExecuteReader(CommandBehavior while (rdrUrun.Read()) { listBox1.Items.Add(rdrUrun.GetString(0)+" - "+ rdrUrun.GetInt16(1)); }

Urun.Close();

Page 430: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

98 Modül 4: Connected Veritabanı İşlemleri

Konu 5: Command ile Döndürmeyen Sor Çalıştırmak

Kayıt gular

Command ile veritabanı yapısı apılabili e Stored

ak, değ ilmek), çenekleri yarlanabilir (Tablo ve View izin ı içeri veri değiştirilebilir ayıt ekleme, silme ve gü eDbComm SqlCommand

işlemlerin ilmesi için, Ex NonQuery metodu

y Metodu ile Select hariç SQL (Stru d Query Language) ve T-SQL ructured Que guage) komutl

guag apılandırılmış Sorgulam ı abanına kayıt ekleme, var olan kaydı

ü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)

nda değişiklik y r (Tablo, View vProcedure oluşturm iştirmek ve s güvenlik sea leri) ve veritaban sindeki(K ncelleme). Ol and veya nesnesi ile bu tür yapılab ecute

kullanılır.

ctureExecuteNonQuer

(Transact- St

ry Lan arı kullanılır.

SQL "Structu ry Lanred Quesorgu dilidir. SQL ile verit

e" (Y a Dili) veritabansilme,

d

Page 431: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 4 99

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ı nesnelerindÖrnek ALTER TABLE, A

e değişiklik yapmak. LTER TRIGGER

DROE TRIGGER

P Veritabanı nesnelerini silmek. Örnek DELETE TABLE, DELET

Tablo 4.10 DDL Komutları • SQL Veri Kontrol Dili (Data Control Language-DCL)

Veri Kontrol Dili; biSQL r 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 Kullaniçin e

ıcı, grup veya rolü herhangi bir eylem ngeller.

REVOKE tanmış olan yetki veya engeli kaldırır. Daha a

Tablo 4.11 DCL Komutları

çin aşağıdaki

ExecuteNonQuery metodu ile DDL ve DCL komutları çalıştırmak iadı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

nir ve gerekli özellikleri ayarlanır. nesnesi ekle3- Veritabanı bağlantısı açılır. 4- Comm nesnesinin and ExecuteNonQuery metodu kullanılır. 5- Veritabanı bağlantısı kapatılır.

Page 432: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

100 Modül 4: Connected Veritabanı İşlemleri

Örnekte SqlCommand nesnesinin ExecuteNonQuery metodu çalıştırılarak, Ürün minde tablo oluşturulmaktadır. is

S ,

cmU ommandType = CommandType.Text;

.ExecuteNonQuery();

c eption ex)

MessageBox.Show(ex.Message.ToString());

ELETE sorguları

" StokMiktari) VALUES" + "(@ i,@StokMiktari)", connAlisveris);

}

metodu çalıştırılarak, Ürün tablosunda kayıt

Comman"St ktari Where UrunID = @UrunID",

lisveris); cmd.Parameters.Add("@UrunID", 1);

dd("@StokMiktari", 30);

{ n();

int kayitSayisi = cmd.ExecuteNonQuery();

MessageBox.Show(kayitSayisi+" kayıt değiştirildi.");

System.Data.SqlClient.SqlCommand cmUrunTabloOlustur = new ystem.Data.SqlClient.SqlCommand("CREATE TABLE Urun (UrunID" + "int, UrunAdi varchar(50), StokMiktari int) "connAlisveris);

runTabloOlustur.Ctry { connAlisveris.Open();

int kayitSayisi; kayitSayisi=cmUrunTabloOlustur

e(); connAlisveris.Clos MessageBox.S ishow(kayitSay i+" "+"kayıt eklendi."); } atch(Exc {

}

ExecuteNonQuery metodu ile INSERT, UPDATE ve Dç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,

UrunID,@UrunAd 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

güncellenmiştir.

System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.Sql d("Update Urun Set" +

okMiktari = @StokMiconnA cmd.Parameters.Atry connAlisveris.Ope connAlisveris.Close();

Page 433: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 4 101

} catch(Exception ex)

MessageBox.Show(ex.Message); }

ystem ystem.Data.SqlClient.SqlCommand("Delete Urun Where"+

ID= @UrunID", connAlisveris); .Parameters.Add("@UrunID", 1);

); int kayitSayisi=cmd.ExecuteNonQuery();

MessageBox.Show(kayitSayisi+" kayıt silindi.");

ch(Exception ex)

MessageBox.Show(ex.Message); }

Modü

{

Örnekte ExecuteNonQuery metodu çalıştırılarak, Ürün tablosundan kayıt silinmiştir.

.Data.SqlClient.SqlCommand cmd = newSS"Uruncmd try { connAlisveris.Open( connAlisveris.Close(); } cat {

l Özeti

1. Bağlantılı veri ortamı hangi .NET nesneleri ile gerçekleştirilir?

anılır? nesin n.

2. Command nesnesinin kaç farklı çalıştırılma biçimi vardır? Açıklayın. 3. Command nesnesinin Parameters özelliği ne için kull4. DataReader nes in çalışma modelini bir örnekle açıklayı5. Kaç farklı SQL sorgu türü vardır?

Page 434: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

102 Modül 4: Connected Veritabanı İşlemleri

Lab 1: Veritabanı İşlemleri

Bu uygulamada, veritabanındaki Personel tablosu üzerinde kayıt işlemleri

• Command nesnesinin ExecuteNonQuery metodu ile INSERT,

• Command nesnesinin ExecuteReader metodu ile DataReader

Veri ı u için bir veritabanı oluşturulması

ekir. abanı oluşturun.

Veritabanına Personel isminde bir tablo ekleyin ve tabloda belirtilen

gerçekleştirilir. Personel kayıtlarının okunup TextBox kontrollerine doldurulması, yeni personel kaydının eklenmesi, bir personelin bilgilerinin

veya silinmesi işlemleri yapılır. güncellenmesi Bu lab tamamlandıktan sonra:

• Access veritabanına bağlantı oluşturabilecek,

DELETE sorgusu çalıştırabilecek, • Sorgulara parametre ekleyebilecek,

oluşturabilecek, • DataReader nesnesi ile kayıt okuyabileceksiniz.

tabanının oluşturulmasBu uygulamada kullanılacak Personel tablosger1. Microsoft Access ile “kisi” isminde bir verit2.

kolonları ekleyin.

Page 435: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 4 103

Alan Adı Veri Türü

Numara AutoNumber

Ad Text

Soyad Text

DogumTarihi Date/Time

Adres Text

Sehir Text

Kontrollerin eklenmesi

ın.

Personel isminde yeni bir Windows projesi açın. Form üzerine, tablodaki kontrolleri ekleyin belirtilen özelliklerini ayarlay Kontrol – Kontrol İsmi Özellik Değer

TextBox – txtAd BorderStyle FixedSingle

TextBox – txtSoyad BorderStyle FixedSingle

TextBox – txtDTarihi Style FixedSingle Border

TextBox – txtSehir BorderStyle FixedSingle

TextBox – txtAdres BorderStyle FixedSingle

Multiline True

ScrollBars Vertical

ComboBox – cbNo DropDownStyle DropDownList

Button – btnYeni Text Yeni Button – btnIptal İptal Text

Button – btnKaydet Text Kaydet Button – btnSil Text Sil

Page 436: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

104 Modül 4: Connected Veritabanı İşlemleri

Kod arın yazılması su üzerinde işlem yapılması için veritabanına bağlantı açılması

. Bu bağlantı için gereken Connection String ifadesinin merkezi bir den alınması, değişiklik durumunda kolaylık sağlayacaktır.

tanımlayın. p

xecuteNonQuery metodu

public void Kaydet()

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); }

lPersonel tabloerekirg

yer 1. Projeye bir modül ekleyin ve bağlantı dizisiniublic 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.

E2. Veritabanına yeni bir Personel kaydı eklemek için gereken kodları bir

yordam altında yazın. {

System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection();

conn.ConnectionString = Module1.connStr;

System.Data.OleDb.OleDbCommand comm = new

Page 437: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 4 105

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();

(ex.Message); }

}

. ComboBox kontrolüne personel numaralarını dolduran kodları yazın. Bu

caktır.

{

ata.OleDb.OleDbConnection conn = new .OleDbConnection();

conn.ConnectionString = Module1.connStr;

ystem.Data.OleDb.OleDbCommand();

comm.CommandText = "Select Numara from Personel"; dr;

try

ExecuteReader();

} catch(Exception ex) {

MessageBox.Show finally { conn.Close(); }

ExecuteReader ve DataReader4

ComboBox, personel kayıtlarını numaraya göre seçmek için kullanıla public void IDDoldur() cbNo.Items.Clear(); System.Dystem.Data.OleDbS System.Data.OleDb.OleDbCommand comm = newS comm.Connection = conn; comm.CommandType = CommandType.Text; System.Data.OleDb.OleDbDataReader { conn.Open(); dr = comm.

Page 438: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

106 Modül 4: Connected Veritabanı İşlemleri

while(dr.Read())

} }

eption ex)

eBox.Show(ex.Message); }

5. ComboBox kontrolünden seçilen personel numarasına göre formdaki

{ 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) {

TextBox sıfırlayan kodları yazın.

{ cbNo.Items.Add(dr.GetInt32(0));

catch(Exc { Messag

finally { dr.Close(); conn.Close();

} }

kontrollerin doldurulmasını sağlayan kodları yazın. public void IDyeGoreFormDoldur(int ID)

MessageBox.Show(ex.Message); } finally { dr.Close(); conn.Close(); } }

Form Kontrolleri işlemleri . Formdaki kontrollerinin değerlerini6public void Temizle() {

Page 439: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 4 107

txtAd.Focus();

}

girilmesini kontrol eden

MessageBox.Show("Adı Giriniz"); txtAd.Focus(); return false; }

t == "")

niz");

return false;

{

MessageBox.Show("Doğum Tarihini Giriniz"); i.Folse;

Adres.

sageBox.Sh resi GirinizAdres.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)

Control kontrol = new Control();

foreach(TextBox kontrol in this.Controls) { kontrol.Text="";

}

7. Kayıt eklenmeden önce, tüm değerlerin doğru kodları yazın. pu blic bool Kontrol()

{ if(txtAd.Text == "")

{

else if(txtSoyad.Tex { MessageBox.Show("Soyadı Giri

txtSoyad.Focus(); }

else if(txtDTarihi.Text = "")

txtDTarih return fa

cus();

} else if(txt Tex = "") t { Mes txt

ow("Ad();

");

Page 440: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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;

dönen kodları yazın. m.Object sender,

Index = 0;

11. btnSil düğmesine basıldığı zaman kayıt silme işlemleri gerçekleştiren

tnSil_Click(System.Object sender, System.EventArgs e)

SelectedItem + " nolu kaydı Text,

cbNo.SelectedIndex = cbNo.Items.Count - 1;

cbNo.SelectedIndex = 0;

eçildiğinde, bu personele ait bilgileri forma yükleyen kodları yazın.

btnIptal.Enabled = true; cbNo.SelectedIndex = - 1; }

10. btnIptal düğmesine basıldığı zaman kontrolleri temizleyen ve ilk kayıta

private void btnIptal_Click(SysteSystem.EventArgs e) {

Temizle(); btnYeni.Enabled = true; btnKaydet.Enabled = false; btnIptal.Enabled = false;

cbNo.Selected }

yordamı kullanın. private void b

{ if(MessageBox.Show[cbNo.silmek istiyor musunuz?", this.MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2] == DialogResult.Yes) { Sil(cbNo.SelectedItem);

IDDoldur();

} }

12. Formun olayında ComboBox kontrolünü personel numaralarLoad ı ile amı kullandolduran yord ın.

private void frmPersonel_Load(System.Object sender, ystem.EventArgs e) S {

IDDoldur();

}

13. ComboBox kontrolünde bir personel numarası s

Page 441: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 4 109

void cbNo_SelectedIndexChanged(System.Object sender, EventArgs e)

privateSystem.{ }

IDyeGoreFormDoldur(cbNo.SelectedItem);

Page 442: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 6:

Mo itabanı dül 5: Bağlantısız (Disconnected) Verİşlemleri

Bağlantısız veri ortamları, uygulamaların veritabanından bağımsız çalıştığı mlardır. Veritabanı sunucusunun uzak olması, veri işlemlerinin uzun orta

Page 443: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 5 111

sürmesi ve mobil çalışma ihtiyacı, bağlantısız veri ortamlarına olan ihtiyacı ırmıştır.

cek, ıyacak

• DataSet nesne modelini öğrenecek

neceksiniz.

KonVer banı Mimarisi

art Bu modül tamamlandıktan sonra:

• Bağlantısız veritabanı mimarisini öğrene• DataAdapter nesnesinin yapısını tan

• DataTable nesne modelini öğrenecek • Veri arama ve sıralama işlemlerini öğre

u 1: Disconnected Uygulamalar İçin ita

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.

Page 444: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Tablo 5.1. Bağlantısız Veri Ortamı Sınıfları

Sınıf Açıklama

XXXDataAdapter Connection, Command ve DataReader sınıflarını erilerin DataSet’e doldurulmasını ve apılan değişikliklerin veri tabanına

ğin SqlDataAdapter sınıfı

kullanarak, vDataSet de ykaydedilmesini sağlar. ÖrneSQL 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.

Page 445: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 5 113

Konu 2: DataSet ve DataTable Oluşturmak

Veri kaynağından DataAdapter ile çekilen verilerin, çekirdek belleğe atılan

ataSet’in temel özellikleri aşağıda listelenmiştir:

Set içerisine kaydedilir. Bu durum uygulamanın çevrimdışı çalışmasını sağlar.

kullanmaktır.

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. D• 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 Data

• 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

Page 446: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 •

Page 447: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 5 115

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.

eme, veri güncellemeleri işlemleri

Ö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.

• DataView zerinde filtrelDataTable nesneleri ü

yapmak için kullanılır.

Page 448: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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”);

erisine bir veya birden çok D

tadı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");

Da.Fill(ds,”Kitaplar”) DataGrig1.DataSource = ds.Tables[“Kitaplar”];

DataSet sınıfının Tables koleksiyonu ile DataSet içataTable 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şturulmak

Page 449: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 5 117

Örnekte DataTable nesnesi için Ucret, KDV ve Tutar isminde 3oluşturulmuştur. Örnekteki KDV kolonu, Ucret kolonun %17 değer

adet kolon i üzerinden

hesaplanır. Tutar kolonu ise Ucret ve KDV değerinin toplamı ile hesaplanır. DataColumn colUcret = new DataColumn("Ucret"); DataColumn colKdv = new DataColumn("KDV"); colKdv.Expression = "Ucret * 0.17"; DataColumn colTutar = new DataColumn("Tutar"); colTutar.Expression = "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 a arılmasını sağlar. kt Örnekte OleDbDataAdapter ile çekilen veriler, ds ismindeki DataSet nesnesine a arılır. DataSet içeris aGrid ile ekranda göstekt indeki veriler, Dat rilir.

source=C:\Stok.mdb");

OleDbDataAdapter da = new OleDbDataAdapter("select * from kitaplar", conn); DataSet ds = new DataSet(); da.Fill(ds,”Kitaplar”);

OleDbConnection conn = new OleDbConnection ("provider = " + "microsoft.jet.oledb.4.0; data

Page 450: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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);

.t

Data r nesnesinin Fill metodu veri kaynağındaki veriyi DataSet veya

çeki ablosuna doldurulmaktadır.

da.

ir DataSet içinde birden fazla tablo bulunabilir. Bu durumda DataAdapter

nesnesinin Fill metodunu birden çok kez çağrılır.

Fill m et içerisine aktarılabilir. Örnekte da isimli

.

DataData todu 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");

DataSet ds = new DataSet(); da Fill(ds, "kitaplar"); Da aGrid1.DataSource = ds.Tables["kitaplar"];

Adapte

DataTable nesnesini doldurmak için kullanılır. Örnekte da isimli DataAdapter ile len veriler, Kitaplar t

Fill(ds, "kitaplar");

B

etodu ile belirli kayıt aralığı DataS

DataAdapter ile çekilen ilk altı kayıt, Kitaplar tablosuna aktarılır.

da Fill(ds, 0, 5, "kitaplar");

Set üzerinde yapılan değişiklikleri veri kaynağına aktarmak için, Adapter sınıfının Update me

Page 451: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 5 119

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.

Page 452: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 ağlanabilir.

DataSetBu yöntveri bağl Basit vkolonun s kontrolere bağlama işlemidir. TextBox, Label, RadioButton gibi kolonu T Karmaş eri elamanını Win Grid, ListBox, ErrorProvider gibi kont le Örnekte Dataset içerisindeki kitap_baslik kolonun değeri, TextBox ve Label kontrollerin Text özelliğine aktarılır.

b

içerisindeki veriyi Windows kontrollere bağlamanın iki yöntemi vardır. emler basit (simple data binding) ve karmaşık (complex data binding) ama olarak adlandırılır.

eri bağlama; DataSet içerisindeki bir veri elemanını (DataTable u) Window

kontroller bu gruba girer. Örneğin DataSet tablosundaki herhangi bir extBox, Label gibi Windows kontrollere bağlamak.

ık veri bağlama; DataSet içersindeki birden fazla vdows kontrollere bağlama işlemidir. Datarol r bu gruba girer.

Page 453: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 5 121

TextBox1.Text = ds.Tables["kitaplar"].Rows[2].Item["kitap_ Label1.Text =

baslik"];

ember ise Tablo kolonunu belirtir.

mboBox 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();

. ToString()); } for (int i=0;i<count;i++) { CheckedListBox1.Items.Add(ds.Tables["kitaplar"].Rows[i][0]. ToString()); }

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 DisplayM Örnekte Co

for (int i=0;i< count;i++) { ListView1.Items.Add(ds.Tables["kitaplar"].Rows[i][0]

Page 454: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

durumda istenilen tabloya ataGrid üzerindeki gezinti köprülerinden erişilebilir.

yön eridir.

Gra r takip edin.

• den oluşturulmuş DataSet nesnesine bağlayın.

d kontrolünün DataMember özelliğini , DataSet tablolarının

Programlama yöntemi ile bağlantı sağlamak için DataGrid nesnesinin

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 D DataSet tablolarını DataGrid kontrolune bağlamak için iki yöntem kullanılır. Bu

temler grafiksel ve programlama yönteml

fiksel yöntem ile bağlantı sağlamak için aşağıdaki adımla• Araç kutusu üzerindeki DataGrid kontrolu form üzerine sürükleyin.

DataGrid kontrolünün DataSource özelliğini, önce

• DataGriherhangi biri ile bağlayın.

DataSource özelliği kullanılır. Örnekte, DataSet içerisindeki Kitaplar tablosu DataGrid kontrolune bağlanır. DataGrid1.DataSource = ds.Tables["Kitaplar"];

Page 455: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 5 123

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

ataTable nesnesine, yeni bir satır eklemek için DataRow nesnesi kullanılır. ni satır, DataRow

Dat = d

kolokolona ise yazar adi bilgileri girilmiştir.

olanağı sunar. DDataTable nesnesinin NewRow metodu ile oluşturulan yenesnesinin değişkenine atanır. Örnekte dtKitaplar tablosuna drNew isminde yeni bir kolon eklenmiştir.

aRow drNew tKitaplar.NewRow();

DataRow nesnesi tanımlandıktan sonra, index veya kolon isimleri üzerinden nlara değer girilir. Örnekte birinci kolona kitabın ISBN numarası, ikinci

drNew[0] = “975-8725-14-9”; drNew[1] = “Tamer Şahiner”;

veya drNew[“kitap_ISBN”] = “975-8725-14-9”;

Page 456: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

124 Modül 5: Disconnected Veritabanı İşlemleri

drNew[“kitap_yazar”] = “Tamer Şahiner”;

aplar esnesinin Rows koleksiyonuna eklenir.

Kolanlara bilgi girildikten sonra, tanımlanan DataRow nesnesi DataTable nesnesinin Rows koleksiyonuna eklenir. Örnekte drNew nesnesi, dtKitn

dtK pla

aTab kullanmadan kayıt eklenebilir. Örnekte

tKitaplar ismindeki DataTable nesnesine bu yöntem ile kayıt eklenmiştir.

er”});

ita r.Rows.Add(drNew);

le nesnesine DataRow Datd dtKitaplar.Rows.Add(New Object[] {“975-8725-14-9”, “Tamer Şahin

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

Edit 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.

alınan olaylar yeniden aktif edilir. Cancel

Page 457: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 5 125

DataRow drNew = dtKitaplar.Rows[3]; drNew.BeginEdit(); drNew["kitap_baslik"] = "yeni hayat"; drNew["kitap_yazar"] = "can dündar"; drNew.EndEdit();

taTable

ataRow drSil = dtKitaplar.Rows[3];

Dat w aktif kayıt silinebilir. DrSil.

Windows Form ile Kayıt Üzerinde Hareket Sağ

DataRow ile DataTable içerisindeki belirli bir satır silinebilir. Örnekte Daiçerisindeki dördüncü kayıt silinmiştir. DdtKitaplar.Rows.Remove(drSil);

aRo nesnesinin Delete metodu kullanılarak

Delete();

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 Cur ir. Dat birden fazla Cur esnesi içerebilir.

rencyManager den

aSet içinde çoklu veri kaynağı tutulabildiği için, rencyManager n

Page 458: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

126 Modül 5: Disconnected Veritabanı İşlemleri

Belirli bir satıra gidebilmek için, CurrencyManager nesnesinin Pkullanılır.

osition özelliği

Örnekte dtKitaplar tablosunun kayıtları arasınad ilk, son, önceki ve sonraki

private void Form1_Load()

_

lar.Position != cmKitaplar.Count)

cmKitaplar.Position += 1; } }

)

{ cmKitaplar.Position = cmKitaplar.Count-1;

satıra hareket sağlanmıştır. CurrencyManager cmKitaplar = new CurrencyManager();

{ txtKitapAdi.DataBindings.Add("Text", dtKitaplar, "kitap_baslik"); cmKitaplar = (CurrencyManager)BindingContext[dtKitaplar]; cmKitaplar.Position = 0; }

private void btnMoveNext() { If (cmKitap {

private void btnMoveFirst({ cmKitaplar.Position = 0; } private void btnMovePrevious() { If (cmKitaplar.Position != 0) {

ar.Position - cmKitapl = 1; }

} private void btnMoveLast()

}

Page 459: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 5 127

Lab 1: a Veritabanı İşlemleri B ğlantısız

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.

Page 460: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

128 Modül 5: Disconnected Veritabanı İşlemleri

Alan Adı Veri Türü

Num ra AutoNumber aAd Text

Soyad Text

DogumTarihi Date/Time

Adres Text

Sehir Text

Kontro erin eklenmesi Baglantısız_Personel isminde yeni bir Windows projesi açın. Form üzerine, tablodaki kontrolleri ekleyin belirtilen özelliklerini ayarlayın. Kontrol – Kontrol İsmi

ll

Özellik Değer

Dat id – dgPersonel ReadOnly True aGr

Tex x – txtAd BorderStyle FixedSingle tBo

Tex x – txtSoyad BorderStyle FixedSingle tBo

Tex x – txtDogumTarihi BorderStyle FixedSingle tBo

Tex x – txtSehir BorderStyle FixedSingle tBo

Tex x – txtAdres BorderStyle FixedSingle tBo

Multiline True

ScrollBars Vertical

But – btnYeni Text Yeni ton

But – btnIptal Text İptal ton

But – btnKaydet Text Kaydet ton

But – btnSil Text Sil ton

But – btnVDoldur Text Veritabanindan Getir ton

But – btnVKaydet Text Veritabanina Kaydet ton

But – btnCikis Text Çıkıs ton

Page 461: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 5 129

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.

ılan Add Connection komutunu tıklayın.

3.

Baglantısız_Personel uygulaması için yeni bağlantı oluşturmak. 1. Server Explorer penceresi üzerinde farenin sağ butonunu tıklayın. Aç

menüden2. 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.

Page 462: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

130 Modül 5: Disconnected Veritabanı İşlemleri

4. Açılan Connection sekmesinin görüntüsünü resimdeki gibi düzenleyerek OK

Bağ uşturulması Kisi verit ına bağlantı sağlamak için OleDbConnection oluşturun.

1.2.

DatPerson

1. deki OleDbDataAdapter kontrolu form üzerine sürükleyin. 2. Karşınıza çıkan “Data Adapter Configuration Wizard” penceresi

3.

4. hoose a Query Type penceresinden Use Sql statements seçeneğini

5.

butonunu tıklayarak, bir sonraki adıma geçin. 6. inish butonunu tıklayarak “Data Adapter Configuration Wizard”

irbazını sonlandırın.

butonunu tıklayın.

lantının Olaban

Araç kutusu üzerindeki OleDbConnection kontrolu form üzerine sürükleyin. OleDbConnection kontrolunun ConnectionString özelliği için oluşturduğunuz bağlantı cümlesini seçin.

aAdapter nesnesinin Oluşturulması el tablosunu DataSet içerisine aktarmak için OleDbDataAdapter oluşturun.

Araç kutusu üzerin

üzerinde Next butonunu tıklayarak, bir sonraki adıma geçin. 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. C

seçin ve Next butonunu tıklayarak, bir sonraki adıma geçin. Generate the Sql statements penceresindeki metin kutusuna SELECT Numara, Ad, Soyad, DogumTarihi, Adres, Sehir FROM Personel yazın ve Next F

sih

Page 463: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 5 131

DataSet n luşturulması Personel kay ışmak için DataSet oluşturun. 1. da üzeri onunu tıklayın. 2. Açılan kısayol menüsünden Generate DataSet menüsünü tıklayın. 3. n New seçeneğini seçin ve metin kutusuna

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,

Kod arın Yazılması

ur kontrolunun Click olayına kayıtları DataGrid kontrolüne kodları yazın.

);

ox.Show(ex.Message.ToString());

15. btnDKaydet kontrolunun Click olayına. DataSet kontrolundeki tüm değişiklikleri veritabanına kaydeden kodu yazın

esnesinin Oıtları ile çevrimdışı çalnde farenin sağ but

Choose a Dataset menüsündeds yazın.

DTarihi, Adres ve Sehir kolonlarına bağlayın.

l

14. btnDDolddolduran

try { conn.Open();

da.Fill(Ds1, "Personel"} catch (Exception ex) { MessageB} finally { conn.Close(); }

Page 464: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

132 Modül 5: Disconnected Veritabanı İşlemleri

try { conn.Open(); da.Update(Ds1, "Personel"); } catch (Exception ex) { } MessageBox.Show(ex.Message.ToString());

conn.Close();

tablosu içinde eklenen yeni satırı iptal eden kodu yazın.

elCurrentEdit();

ndingContext(Ds1, "Personel").EndCurrentEdit();

kontrolunun Click olayına. DataSet tablosundan aktif kaydı silen

ersonel").RemoveAt(BindingContext(Ds1, "Personel").Position);

21. btnOnceki kontrolunun Click olayına. önceki kayda giden kodu yazın.

22. btnSonraki kontrolunun Click olayına. sonraki kayda giden kodu yazın.

l").Position += 1;

olunun Click olayına. son kayda giden kodu yazın. BindingContext(Ds1, "Personel").Position = BindingContext(Ds1, "Personel").Count-1;

finally {

}

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

BindingContext(Ds1, "Personel").Canc

18. btnKaydet kontrolunun Click olayına. DataSet tablosuna yeni kayıt ekleyen kodu yazın.

Bi

19. btnSil

kodu yazın. BindingContext(Ds1, "P

20. btnIlk kontrolunun Click olayına. ilk kayda giden kodu yazın. BindingContext(Ds1, "Personel").Position = 0;

BindingContext(Ds1, "Personel").Position -= 1;

BindingContext(Ds1, "Persone

23. btnSon kontr

Page 465: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 5 133

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.

“microsoft.jet.oledb.4.0;data source=c:\Proje\stok.mdb"); select * from" +

tbl = new DataTable; bl);

Columns("kitap_ISBN"); DataRow w f (row==null)

yıt Bulunamadı!"); } else

OleDbConnection conn = new OleDbConnection("provider =" + OleDbDataAdapter da = new OleDbDataAdapter(" "kitaplar", conn);

DataTableda.Fill(ttbl.PrimaryKey = new DataColumn() { tbl.}

ro = tbl.Rows.Find("975-12-53-3");

i{ MessageBox.Show("Ka

Page 466: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

134 Modül 5: Disconnected Veritabanı İşlemleri

{ Mes}

ekte Tbl ismindeki DataTable nesnesine, DataAdapter nesnesinden gelen un Kitap_I

d numarası girilir ve sonuç Row değişkenine aktarılır. erisindeki sonuç ekrana yazılır.

kitap_yazar Like 'E%'

DataTable sınıfının Select metodu ile DataRow nesnelerinden oluşan bir aSet içindeki ri kopyalama

yapmaz ancak değişimleri görüntüler.

DataTable sınıfının Select metodu kullanılarak, kitap fiyatı sekizden farklı kayı itap isimlerine göre sıralanmıştır. ataRow selRows = tbl.Select("kitap_fiyat != 8",

DataViewRowState.Cu

ik", DataRowVersion.Original].ToString());

public DataRow() Select()

public DataRow() Select(string filterExpression)

string sort)

string sort,recordStates as DataViewRowState)

lect metodunun filterExpression, Sort ve recordStates isminde

lterExpression, filtreleme yapılacak ifadeyi içerir.

sageBox.Show(row["kitap_yazar"].ToString());

Örnkayıtlar doldurulur. Tbl tablosun SBN kolonu birincil anahtar olarak atanır. Row isminde yeni bir DataRow tanımlanır. DataTable nesnesinin Find metoduna kitabın barkoSon olarak Row değişkeni iç 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

koleksiyon geri döndürür. Select metodu aslında orjinal Datsatırları işaret eden işaretçiler kümesi olarak da algılanabilir. Ve

Örnekte

tlar gösterilmektedir. Bu kayıtlar K

D "kitap_baslik ASC", rrentRows); foreach (DataRow row In selRows) { MessageBox.Show("kitap: " + row["kitap_basl }

Select metodunun dört farklı kullanımı vardır. Bu kullanımlar aşağıda listelenmiştir. public DataRow() Select(string filterExpression,

public DataRow() Select(string filterExpression,

Seüç parametresi bulunur. fi

Page 467: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 5 135

"Country = ‘Turkey' AND City <> 'Ankara'"

Sort, sonuçların hangi sırada görüntüleneceğini belirtir.

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ı

“City DESC”

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

m kullanılır. Bu yöntemler grafiksel ve g Gra adımlar takip edin. • Araç kutusu üzerindeki DataView kontrolu form üzerine sürükleyin.

übağlanabilen bir nesnedir. DataView nesnesi oluşturmak için iki yönte

pro ramlama yöntemleridir.

fiksel yöntem ile bağlantı sağlamak için aşağıdaki

Page 468: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 DataÖrnekte fiyatı 8 YTL den büyük kay

View kullanımı aşağıda gösterilmektedir. ıtlar gösterilmektedir. Bu kayıtlar yazar

iğin

00 den büyük kayıtlar sorgulanmaktadır

en büyük olan kayıtlar sorgulanmaktadır.

ktadır.

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 özell e, sıralanacak kolonun adı girilir. RowFilter özelliğine ise arama veya filtreleme sorgusu girilir. Örnekte Sipariş Numarası 103 dv.RowFilter = ("SiparisID >10300") ;

Örnekte Sipariş Tarihi 08/25/1996 tarihind

dv.RowFilter = ("SiparisTarihi >#08/25/1996#");

Örnekte müşteri adı “V” ile başlayan kayıtlar sorgulanma

Page 469: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 5 137

dv.RowFilter = ("MusteriAdi like 'V*'")

;

Örnekte müşteri adı “V” ile başlayan veya Sipariş Numarası 10300 den büyük ka anmaktadır.

v.RowFilter = ("MusteriADi like 'V*' Or SiparisID >10300");

Modül Özeti

yıtlar sorgul d

6. Bağlantısız veri ortamı hangi .NET nesneleri ile gerçekleştirilir? 7. DataSet nedir? DataSet hangi nesnelerden oluşur? 8. DataTable nedir? Hangi durumlarda kullanılır ? 9. DataColumn nedir? Hangi durumlarda kullanılır ? 10. DataView Nedir ? Hangi durumlarda kullanılır ?

Page 470: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 471: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 5 139

Kon rin eklenmesi

ntrol – Kontrol İsmi

trolleDershane isminde yeni bir Windows projesi açın. Form üzerine, tablodaki kontrolleri ekleyin belirtilen özelliklerini ayarlayın. Ko Ö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ğ turulması Dershane veritabanı üzerinde işlem yapılması için bağlantı kurulması gerekir. Bu bağlan

lantı Cümlesinin oluş

tı için gerekli Connection String ifadesini Server Explorer’ı kullanarak oluşturun.

Page 472: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

140 Modül 5: Disconnected Veritabanı İşlemleri

Dershane uygulaması için yeni bağlantı oluşturmak. 1. Server Explorer pencer n sağ b ayın. Açılan

menüden Add Connection komutunu tıklayın. 2. Açılan Data Link Prope eresinin Provi sini tıklayın. 3. Provider sekmesinden Mi Jet.OLEDB.4.0 eçerek

Next butonunu tıklayın.

esi üzerinde fareni utonunu tıkl

rties penc der sekmecrosoft. Provider ‘i s

4. Açılan sekmesinin görüntüsünü resimdeki gibi düzenleyerek OK

BağDershane

3. A trolu form üzerine sürükleyin. 4.

Dat Oluşturulması Bolum risine aktarmak için OleDbDataAdapter oluşturun.

1. olu form üzerine sürükleyin. 2. Karşınıza çıkan “Data Adapter Configuration Wizard” penceresi

üzerinde N rak, bir sonraki adıma geçi3. ,

dıma geçin.

4. Type penceresinden Use Sql statements seçeneğini onunu tıklayarak, bir sonraki adıma geçin.

5. k, bir

sonraki adıma geçin.

Connection

butonunu tıklayın.

lantının Oluşturulması veritabanına bağlantı sağlamak için OleDbConnection oluşturun. raç kutusu üzerindeki OleDbConnection kon

OleDbConnection kontrolunun ConnectionString özelliği için oluşturduğunuz bağlantı cümlesini seçin.

aAdapter nesnesinin tablosunu DataSet içe Araç kutusu üzerindeki OleDbDataAdapter kontr

ext butonunu tıklaya n. Choose Your Data Connection penceresi üzerinde oluşturduğunuz bağlantı cümlesini seçin ve Next butonunu tıklayarak, bir sonraki a

Choose a Query

seçin ve Next butGenerate the Sql statements penceresindeki metin kutusuna SELECT Bolum, BolumID FROM Bolum yazın ve Next butonunu tıklayara

Page 473: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 5 141

6. Finish butonunu tıklayarak “Data Adapter Configuration Wizard”

7. Ekledi daBolum olarak değiştirin.

Ogren şturun. 1. rine 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. z

i adıma

4. a Query Type penceresinden Use Sql statements seçeneğini ma geçin.

5. Generate the Sql statements penceresindeki metin kutusuna SELECT OgrenciID, Ad, Soyad, Adres, BolumID, Sehir FROM

butonunu tıklayarak, bir sonraki adıma geçin. 6. rak “Data Adapter Configuration Wizard”

7.

Kurs ablolarını DataSet içerisine aktarmak için OleDbDataAdapter oluşturun.

1. in. 2. Karşınıza çıkan “Data Adapter Configuration Wizard” penceresi

. 3. hoose Your Data Connection penceresi üzerinde, oluşturduğunuz

b

4. oose a Query Type penceresinden Use Sql statements seçeneğini

5. etin kutusuna sAdi,

urs.KursNo urs.KursNo =

sNo) Next ıklayarak, bir

6. Wizard”

7. Eklediğiniz OleDbDataAdapter kontrolunun ismini daKurs olarak değiştirin.

DatBolum, Öğrenci ve Kurs tabloları ile çevrimdışı çalışmak için DataSet oluşturun. 1. 2. A tıklayın. 3. neğini seçin ve metin kutusuna

4. k

5. butonunu tıklayın. 6. kısayol menüsünden Generate DataSet menüsünü tıklayın 7. o ğini seçin ve açılan

n Dershane.ds seçeneğini seçin.

sihirbazını sonlandırın. ğiniz OleDbDataAdapter kontrolunun ismini

ci tablosunu DataSet içerisine aktarmak için OleDbDataAdapter olu Araç kutusu üzerindeki OleDbDataAdapter kontrolu form üze

Choose Your Data Connection penceresi üzerinde, oluşturduğunubağlantı cümlesini seçin ve Next butonunu tıklayarak, bir sonrakeçin. gChoose

seçin ve Next butonunu tıklayarak, bir sonraki adı

Ogrenci yazın ve Next Finish butonunu tıklayasihirbazını sonlandırın.

Eklediğiniz OleDbDataAdapter kontrolunun ismini daOgrenci olarak değiştirin.

ve OgrenciDersKayit t

Araç kutusu üzerindeki OleDbDataAdapter kontrolu form üzerine sürükley

üzerinde Next butonunu tıklayarak, bir sonraki adıma geçinC

ağlantı cümlesini seçin ve Next butonunu tıklayarak, bir sonraki adıma geçin. Ch

seçin ve Next butonunu tıklayarak, bir sonraki adıma geçin. Generate the Sql statements penceresindeki mSELECT OgrenciDersKayit.OgrenciID, Kurs.Kur

i, KOgrenciDersKayit.KursBasTarihi, Kurs.KredFROM (Kurs INNER JOIN OgrenciDersKayit ON K

yazın ve butonunu tOgrenciDersKayit.Kur

sonraki adıma geçin. Finish butonunu tıklayarak “Data Adapter Configurationsihirbazını sonlandırın.

aSet nesnesinin Oluşturulması

daBolum üzerinde farenin sağ butonunu tıklayın. çılan kısayol menüsünden Generate DataSet menüsünü Choose a Dataset menüsünden New seçeds yazın.

butonunu tıklayın O

daOgrenci üzerinde farenin sağ Açılan Cho se a Dataset menüsünden Existing seçenekutuda

Page 474: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

142 Modül 5: Disconnected Veritabanı İşlemleri

8. k butonunu tıklayın. 9. 10 sayol menüsünden Generate DataSet menüsünü tıklayın 11 Choose a Dataset menüsünden Existing seçeneğini seçin ve açılan

kutudan Dershane.ds seçeneğini seçin. 12 u tıklayın.

Datleri ü

tirin. 3. DataView kontrolunun Table özelliği için Ogrenci tablosunu seçin.

ağıdaki adımlar takip edin. 1. ntrolu form üzerine sürükleyin. 2. E i . 3. sunu seçin

Datkon ağlanması Bolum n.

4. Bolum tablosunu seçin. 5. Bolum kolonunu

6. olumID kolonunu

Kod

. Form kontrolunun Load olayına kayıtları DataSet tablolarına dolduran kodları yazın.

daBolum.Fill(Ds1, "Bolum"); i");

ption ex)

);

O

daKurs üzerinde farenin sağ butonunu tıklayın. . Açılan kı.

. Ok butonun

aView nesnesinin Oluşturulması DataTable nesne zerinde filtreleme işlemleri yapmak için DataView

uşturun. olOgrenci 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ş

Kurs tablosunu filtrelemek için aş

Araç kutusu üzerindeki DataView ko klediğniz DataView kontrolunun ismini dvKurs olarak değiştirin DataView kontrolunun Table özelliği için Kurs tablo

aset içerisindeki verinin ComboBox trolüne b tablosunu cbBolum isimli açılan kutuya bağlayı

CbBolum isimli açılan kutunun DataSource özelliğineCbBolum isimli açılan kutunun DisplayMember özelliğineseçin. CbBolum isimli açılan kutunun ValueMember özelliğine Bseçin.

ların Yazılması

1

try { Conn.Open(); daOgrenci.Fill(Ds1, "Ogrenc daKurs.Fill(Ds1, "Kurs"); } catch (Exce{ MessageBox.Show(ex.Message.ToString()} finally { Conn.Close(); }

Page 475: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 5 143

2. btnListele kontrolunun Click olayına dvOgrenci kontrolunu DataGrid u yazın.

= "BolumID='" + alue + "'";

aSource = dvOgrenci;

nun CurrentCellChanged olayına dvKurs kontrolunu

vKurs.RowFilter = "OgrenciID='" +

kontrolune bağlayan koddvOgrenci.RowFilter cbBolum.SelectedVdgOgrenci.Dat

3. dgOgrenci kontrolu

DataGrid kontrolune bağlayan kodu yazın. d dgOgrenci.Item(dgOgrenci.CurrentRowIndex, 0) + "' "; dgKurs.DataSource = dvKurs;

Page 476: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 6:

Modül 6: ASP.NET GİRİŞ

ASP.NET üzerinde çalışgeliştirme platformudur. ASP.NET Web Form nesneleri, dinamik Web uygulam tırır. Bu modülü tamamladıktan sonra:

, .Web sunucusu an ve .NET altyapısını kullanan

aları geliştirmeyi kolaylaş

Page 477: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 145

• ASP.NET çalışma modelini öğrenecek, • ASP.NET teknolojisinin .NET Framework çatısındaki yerini öğrenecek,

tebileceksiniz.

Konu 1: S

• IIS Web sunucusunun yapısını öğrenecek ve yöne

A P.NET Nedir?

ASP.NET teknolojisinden önce, web üzerinde dinamik sayfalarla çalışabilmek nolojisi, .NET çatısı ile yeni özelliklere

ı geliştirmek, Windows Form tabanlı uygulama

fında çalışır, istemci tarafında eşitli işlemleri gerçekleştirebilmek içinse Script adı verilen kodlar kullanılır.

cı ne bağlı değildir. Dolayısıyla ASP.NET

için ASP teknolojisi kullanılırdı. ASP tekeklendi. ASP.NET ile web uygulamasgeliş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 taraç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ıtarafındaki tarayıcıya ve işletim sistemiile yazılan uygulamalar, internet erişimi olan herhangi bir aygıtta çalışabilir.

Page 478: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

146 Modül 6: ASP.NET Giriş

Kon si u 2: Asp Tarihçe

HTML(Hyper Text Markup Language) web sayfası hazırlamak için kullanılan

mel web programlama dilidir.

TML’in u açığını kapatmak için ilk olarak CGI arabirimi (Common Gateway Interface)

ıştırılır. CGI kaynak kodun yeniden

ır.

nunu ile haberleşen ilk dil olan PERL(Practical ge) geliştirilmiştir. Bu dil C ve C++ ile yazılan

criptler içerir. PERL, CGI’ın yeniden derlenme dezavantajını ortadan kaldırmıştır. PERL halen aktif olarak kullanılmaktadır.

nra, “Internet erver Application Programming Interface” (ISAPI) arabirimini geliştirmiştir.

ı birleştirir. ASP, statik HTML sayfaları erisinde, dinamik veri alışverişi için Microsoft tarafından geliştirilmiştir

te HTML, kullanıcı ile sunucu arasında dinamik veri alışverişi sağlamaz. Hbgeliştirilmiştir. CGI arabirimi C dilinde hazırlanan kodlar ile çalarabiriminin dezavantajı, en ufak bir değişiklikte tümderlenmesidir. Bu durum zaman ve kaynak kullanımını olumsuz yönde artır CGI arabirimininden sonra, suExtraction and Reporting Languas

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

. Microsoft IIS sunucusunu geliştirdikten sodesteklemektedirSMicrosoft ilk defa ISAPI ile birlikte ASP teknolojisini duyurmuştur. ASP teknolojisi, IIS ve ISAPI alt yapısıniç

Page 479: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 147

Kon Uygulama Mimarisi u 3: ASP.NET

ASP.NET, multi-tier (çok katmanlı) veri erişim modelini kullanır. Bu veri erişim modeli İstemci,İş ve Ve atmanlar

stemci Katmanı (Presentation Tier): diğer katmran bileşenler bulunur. Html ve Sunucu kontroller,

eb Formlar ve kullanıcı tanımlı kontroller (User Controls) bu katman

: katmanda iş sleri, COM ve

anda veriyi saklamak için gerekli araçlar bulunur. şkisel veritabanları, e-mail alanları, mesaj kuyrukları ve dizin servisleri bu

ASP.NET ile veri kaynağına rişim için ADO.NET kullanılır.

ri k ından oluşur.

İBu katman, kullanıcı ile anların iletişimini sağlar. Bu katmanda, ullanıcı arayüzünü oluştuk

Wiçerisinde yer alır.

İş katmanı (Business Logic Tier) Bu katman uygulama ile veritabanı arasında iletişimi sağlar. Buservisleri ve kurallarını içeren bileşenler bulunur. XML Web serviCOM+ nesneleri bu katman içerisinde yer alır

Veri Katmanı (Data Tier) : Veri katmanıdır. Bu katmİlikeatman içerisinde yer alır. Web uygulamalarda,

Page 480: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

148 Modül 6: ASP.NET Giriş

Konu 4: Asp.Net Çalışma Modeli

ASP.NET, ASP ve diğer web rformans ile çalışır. ASP.NET bu performan

sağlar.

SP.NET platformunu en verimli şekilde kullanm

platformlarına göre daha yüksek pes artışını Visual Studio .NET ile gelen, .NET

Framework ve CLR (Common Language Runtime) ile A ayı sağlayan CLR bileşenleri aşağıdaki gibidir.

• Type Management • Memory Management • JIT Compilation • Exception Manager

Page 481: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 149

Tür Yönetimi (Type Management)

Güvenli olmayan bilgilere ve başlatılmamış değişkenlere iyönetim, ASP.NET’i ASP’den tamamen ay

zin vermez Bu ıran bir özelliktir.

Page 482: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 483: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 151

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ı

n sonra “Garbage Collection” mekanizması ile bellekten silinir. kaybettikte

Page 484: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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. rı kullanılarak

içerisinde uygulamanın

se machine.config içerisinde saklanır. Her dosyası bulunur.

isual Studio .NET, web uygulamalarının performansını arttırmak ve güvenliğini sağlamak için pek çok servis sunar.

ASP.NET uygulamalarında Try...Catch...Finally blokla,hata yakalama altyapısı kolayca devreye sokulur. ASP.NET uygulamaların konfigürasyon ayarları, XML dosyalar saklanır. Bu dosyalar kolayca okunur ve yazılabilir. Her web ke disine ait bir konfigürasyon dosyası vardır. ASP.NET uygulamaların nkonfigürasyon dosyaları web.config dir.

Sunucuya ait konfigürasyon ayarları iweb sunucusunda tek machine.config

V

Page 485: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 153

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. • sayfalar: Web Formların sunucu taraf Code-behind ında çalışan kodlarını

anın genel olaylarını içerir. Örneğin Web uygulamanın başlatılması veya durdurulması. Global.asax dosyası

global.asa dosyasının gelişmiş versiyonudur.

içerir. • K nfigürasyon dosyaları: Web uygulama ve sunucu ayarlarının tutulduğu o

XML dosyalarıdır. • sax dosyaları: Web uygulam Global.a

ASP deki

Page 486: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 487: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 155

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

ervice ve uygulama ıfları, alt

gösterir. Bu arayüzler Windows Form, Web Form, Web Sservislerinden oluşabilir. Orta katmanda .NET Framework sınkatmanda ise CLR bulunur.

Page 488: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

156 Modül 6: ASP.NET Giriş

KonAva

u 6: .Net Framework’un Asp.Net’teki ntajları

.Net Framework, ASP.NET ile uyBu ava

g vantaj sağlar. ntajlar aşağıda listelenmiştir.

• Visual Studio .NET orta n büyük avant , birden fazla dili ır. rda, farklı

dilleri bir arada kullanılabilir. Örneğin VB.NET ile geliştirilen bir uygulama içerisine C# ile rı ekle

• Visual Studio .NET, web uygulamaların güvenli çeşitli sınıflar içerir Bu sınıflar .Web.Security ı içerisinde bulunur.

SP .NET sayfaları içerisinde, HTML ve Kaynak kod bi çalıştırılır. Bu durum tasarım ve programlama kolayl ı sağlar

• ASP.NET içerisinde kodlar satır satır derlenmez eb formlar derlenir. Bu durum ansın artışını sa

• Güçlü hata yakalama araçlWeb servisleri ile birlik ışabilir.

• ASP.NET, ADO.NET kulla n web r.

ulama geliştirmek için birçok a

mının e ajı

destekliyor olmasıd AS.NET

P.NET ile geliştirilen uygulamala

yazılan kod blokla nebilir. ğini sağlayan

System isim alan

• A rlikte ığ .

. Bunun yerine Wlar perform ğ

arı sunar. • te çal

nımını kolaylaştıra nesneleri içeri

Page 489: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 157

Konu 7: ASP.NET ile Uygulama Gel tirmek iş

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.

Page 490: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

158 Modül 6: ASP.NET Giriş

IIS Nedir?

IIS(Internet Information Services), Windows sistemler için web tabanlı

acıyla kullanılan web sunucusudur. uygulama geliştirme ve yayınlama am

Page 491: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 159

IIS Kurulumu ve Yönetimi

IIS Kurulumu

Web uygulamaları geliştirmek için IIS 5.0 veya daha üst versiyonu kurulmalıdır.

arak gelir. IIS, Windows 2000 Server işletim sistemi ile varsayılan bileşen ol

Page 492: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

160 Modül 6: ASP.NET Giriş

Windows 2000 Professional, Windows XP Proferafından kurulma

ssional ve sonraki sistemlerde sı gerekir.

ağıdaki adımlar takip edilir. m Masası (Control Panel) penceresinde “Program Ekle/Kaldır” (Add

or Remove Programs) simgesini seçin. ows Bileşeni Ekle/Kaldır”

- “Windows Bileşeni Ekle/Kaldır” penceresinden “Internet Information

e Windo e Edition işletim ri ile ASP.NET

uygulaması geliştirilemez. .NET Framework kurulmadan önce IIS un kurulm a dikkat edilme ir. Aksi halde ASP.NET dosyala kütüphane dosyaları ile düzgün bir şekilde IIS kurulmad T Framework aya çalışılıra, uyarı ılır. Bu uyarı senmeden kuruluma devam

ilebilir. 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

omutu çalıştırılmalıdır.

ise, bu aracın kullanıcı ta IIS kurulumu için aş1- Deneti

2- Açılan pencerenin sol panelinden “Wind(Add/Remove Windows Components) bileşenini seçin.

3Services” (IIS) seçerek yükleme işlemini başlatın.

DİKKAT: Windows NT 4.0 v ws XP Hom sistemle

sunucusun uş olmasınlid rı, ilgili kullanılamaz. Eğer an .NE kurulmmesajı ile karşılaş mesajı önem

ed

Visual Studio .NET komut satırında “aspnet_regiis.exe -I “ k

Şekil 6.2: IIS Kurulumu

Page 493: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 161

IIS Yönetimi

IIS yönetimi, Internet Information Services (IIS) Manager ile

Açılan kısayol tu seçilir. Açılan Computer Manager

Applications menüsünden Internet

risinden Administrative Tools n Internet Information Services

gerçekleştirilir. IIS Manager açmak için aşağıdaki adımlar takip edilir. • “Bilgisayarım”(My Computer) ikonuna sağ tıklanır.

menüsünden Yönet (Manage) komupenceresinin Services and

Information Services (IIS)

• Denetim Masası (Control Panel) içeseçilir.

simgesi seçilir. Açılan penceredeManager seçilir.

IIS içerisinde aşağıdaki altkklasörler bulunur. • Application Pools • Web Sites • Web Service Extensions

Page 494: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 495: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 163

Resim 6.3: IIS Yönetimi ASP.NET web uygulamaları wwwroot klasörü altında tutulur. Bu klasör altında

l Directory (sanal klasör) ası için, wwwroot altında yeni

uşturulur. adan yeni bir Virtual Directory oluşturmak için

ite üzerinde sağ tıklanır. Çıkan menüden New alt menüsüne işaret edilir ve Virtual Directory seçilir. Virtual Directory Creation

.

tutulan klasörlerin diğerlerinden farkı Virtuaolmalarıdır. .NET ile açılan her yeni web uygulambir Virtual Directory olVisual Studio .NET kullanmDefault Web S

Wizard ile yeni bir Virtual Directory oluşturulur

Page 496: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

164 Modül 6: ASP.NET Giriş

.Net Framework Kurulumu

ASP.NET ile uygulama geliştirmek için .NET Framework’ün kurulu olması

K olarak isimlendirilen 130MB’lık full versiyonu vgerekir. Framework’ün,. SD e

) http://

ault.aspx”

k için aşağıdaki adımlar takip edilir. ork kurulum dosyası çalıştırılır.

2. Açılan penceredeki “Would you like to Install Mictosoft .NET Framework Package?” sorusuna Yes cevabı verilir.

mamlanır.

.Net Framework kurabilmek için işletim sisteminin Windows NT tabanlı olması

yalnızca temel bileşenleri kapsayan 20MB’lık iki farklı kurulum dosyası bulunmaktadır. Framework versiyon ve yamaları (Service Pack

ds/updates/defmsdn.microsoft.com/netframework/downloa

adresinden ücretsiz olarak indirilebilir. Framework’ü kurma

1. Framew

3. Next butonları tıklanarak kurulum ta

: İPUCUgerekir. Windows 2000 işletim sisteminde minimum SP2 yapılandırması gereklidir.

Page 497: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 165

Modül Özeti

11. ASP nedir? 12. ASP çalışma modelini açıklayın. 13. ASP .Net uygulamasını oluşturan bileşenler nelerdir? 14. IIS nedir?

Page 498: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

166 Modül 6: ASP.NET Giriş

Lab lamaların Yay

1: Web Tabanlı Uyguı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.

Page 499: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 167

6. Yeni alt menüsü içerisinden Metin Belgesi komutunu vererek Yeni

TML(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

Metin Belgesi oluşturun. 7. Oluşturduğunuz metin belgesi içerisine aşağıdaki H

b. http://127.0.0.1 c. http://MakinaAdı d. http://IpNumarası

Localhost: Lokal makina adı. 127.0.0.1 : Lokal IP numarası.

marası.

İpucu angi bir alt klasörden yapıl ir Application” uygu a

Makina Adı: Ağ içerisindeki bilgisayar adı. Ip Numarası: Ağ içerisindeki Ip Nu

: Web uygulamanın yayını, wwwroot içerisindeki herhabil . Örneğin http://localhost/WebUygulama. “ASP.NET Web lam ların yayını bu yöntem ile yapılır.

Page 500: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 8:

Page 501: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 169

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 ontrolleridir. Web Form, IIS tarafından çalıştırılan HTML kod ve Web k

Page 502: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

170 Modül 7:

kontrollerin birleşiminden oluşur. Bu formlara eklenen kontroller, sunucu veya ışabilirler.

bileşenlerini öğrenecek, Sunucu ve istemci taraflı kontrollerin farklarını öğrenecek, • Web kontrollerini tanıyacak,

ate ve PostBack kavramlarını öğreneceksiniz.

Kon şenleri

istemci taraflı çal Bu modül tamamlandıktan sonra:

• Web Form yapısını ve•

• ViewSt

u 1: Web Form Bile

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.

ğlamaktır.

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

Page 503: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 171

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

Page 504: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

.

Web formların, Visual Basic .NET veya C# uzantılı kod dosyasını belirtir.

Page CodeBehind=”WebForm1.aspx.cs” …>

tion özelliğine True değeri ayarlanırsa, sayfa yeniden yüklendiği çubuklarının sayfa içerisindeki yeri korunur. Böylece sayfa ilk

LanguageSayfa 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

<@Page CodeBehind=”WebForm1.aspx.vb” …> <@

SmartNavigation SmartNavigazaman, kaydırma konumunda kalır. Bu özellik Internet Explorer 5.5 ve üstü tarayıcılar tarafından desteklenir.

Page 505: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 173

<@Page Language=”c#” CodeBehind=”WeSmartNavigatio

bForm1.aspx.cs” _

VieASP.NET teknolojisi ile gelen yeniliklerden biridir. EnableViewState özelliği ile

tutup krar kullanıcıya geri döndürür. Bu durum sunucuya gönderilen veriler

Enable

eyinde EnableViewState özelliği kullanılabilir. Bu durumda, ur.

n=”True” >

wState

objenin içerisine girilen bilgi ne olursa olsun, sunucu bunu bir değişkendeteü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 ViewState=”True” …>

Ayrıca kontrol düzPage yönerge satırında belirtilen değer geçersiz ol <asp:Button … EnableViewState=”false“ …>

Body Özelliği

Web sayfasının ana bölümüdür.

dy> etiketi<bo ile web formun gövdesi oluşturulur. Kullanılan her kontrol

bod nımlanabilir.

<body> ... </body> etiketleri arasında bulunmalıdır.

y etiketi içerisinde PageLayout(ms_positioning) özelliği ta

Page 506: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

174 Modül 7:

PageLayout(ms_positioning) form içinde kullWeb anılan nesnelerin, görüntülenme biçimini ayarlar. Bu özellik

i değer alabilir:

• FlowLayout: Sayfaya eklenen kontroller eklenme sırasına göre

<body ms_positioning=”FlowLayout”>

• 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

ik

sıralanır. Kontrollerin yerleri sürükleme ile değiştirilemez. Nesneler için style tanımlamaz.

… </body>

Web kontrolleri gruplandırmak için kullanılır. Her web form için tek Form etiketi n

irçok özellik vardır.

ta ımlanır. Tüm kontroller <form> … </form> etiketleri arasına eklenir. Form etiketi içinde tanımlanabilecek b

Page 507: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 175

Method Web kontrol özelliklerinin, sunucuya gönderilme şeklini belirler. İki değer

İsim ve değer bilgilerini, HTML bilgisinin üst bilgisine yazarak gönderir.

nuna

form method=”Get” …>

ormun isim bilgisini verir. CodeBehind sayfası içerisinde, forma işlem

esi için runat=”server” bildirimi kullanılır. Bu özellik sadece server değerini alabilir.

alabilir:

• Post:

<form method=”Post” …>

• Get İsim ve değer bilgilerini, sayfa adının so ekleyerek

gönderir. <

Id Fyaptırmak için kullanılır. <form id=”deneme” …>

Runat Web formlarda kullanılan kontrollerin sunucu ile haberleşerek çalışabilm

<form runat=”server” …>

Page 508: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

176 Modül 7:

Kon u 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. Butt

istem lıdır. ASP çalışır ve geri plandaki tüm ilir. Bir k at=”server” özelliği ile belirlenir.

yınız” />

e=”Bu Bir Html Button” >

on, TextBox, DropDownList gibi server kontrollerinin çalışma modeli, ci taraflı HTML kontrollerinin çalışma modelinden oldukça fark

.NET server kontrolleri, tamamen sunucu üzerinde işleyişleri ara yüzle gizlenerek gerçekleştir

ontrolün sunucu tarafında çalıştığı run <asp:Button id=”Buton1” runat=”server” Text=”Tıkla

Örnekte istemci tarafında çalışan HTML Button kontrolü gösterilmektedir.

<INPUT type=”button” valu

Page 509: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 177

Bu kon in, kontrole runat özelliği ekle irilir.

<INPUT type=”button” id=”button1” runat=”server” _

Kon

trolün sunucu tarafında çalışması içnmelidir. Böylece kontrol HTML server kontrolü haline get

value=”Bu Bir Html Button” >

u 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, RangeValida-

tor, CompareValidator, RegularExpressionValidator, Cus-tomValidator, 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”>

u kontrollerin avantajları aşağıdaki gibidir.

</asp:TextBox>

B

Page 510: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Sele

sterilmektedir.

Bu grupta bulunan kontrollerin tümü id, text, backcolor, runat özelliklerine sahiptir. Ancak CheckBox kontrolünün Checked ve ListBox kontrolünün

ctedItem özellikleri vardır. Tablo 8.1’de Html ve Standart sunucu kontroller gö

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:Rad nput type=radiobutton>

ioButton> <i

<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.

Page 511: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 179

İlişkisel Liste Tabanlı Kontroller sini sağlar. DataList,

Konu 4: Standart Kontroller

Bu kontroller, veritabanından çekilen kayıtların gösterilmeDataGrid ve Repeater kontrolleri, bu grupta yer alırlar.

Label Label,kullanıcıya bilgi vermek için kullanılır.

<as L ="Label Control" Font-Ita c

Bu k r.

Bu kontrol, Internet Explorer tarayıcısında şu şekilde gösterilir. <input name="userName" id="userName" type="text" />

p: abel runat="server" Textli ="true" />

ontrol, Internet Explorer tarayıcısında şu şekilde gösterili <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">

Page 512: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

180 Modül 7:

Web kontroller, WebContBackColor, BorderCol

rol sınıfından türemişlerdir. Bu yüzden Web kontroller or, Enabled, Font, Height, Width özelliklerine sahiptir.

asp:Button id="Dugme1" runat="server" Text="Tıklayınız"

, System.EventArgs e) {

Html="Beni Tıkladın." ;

C eC c çenekler arasından seçim yapma imkânı sunar. O y aretlenmemiş ise False değerini alır.

n y kutusu CheckedChanged metodu ile takip edilebilir.

nder, 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" />

ButtonButton, 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. < OnClick="Dugme1_Click" runat="server"/> <span id="Message" runat="server" /> private void Dugme1(object sender

Message.Inner}

h ckBox he kBox, kullanıcıya sena kutusu işaretlenmiş ise True, işa nun durumu O

Ö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 Se

Page 513: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 181

RadioButton

oupName özelliği ile, birden fazla RadioButton arasında grup uşturulur. Aynı grup içerisinden sadece bir RadioButton seçilebilir. Birden

neğin işaretlenmesine izin verilmez. Onay kutusunun durumu hecked metodu ile takip edilebilir.

if (Radio1.Checked)

e.InnerHtml = "Seçiminiz" + Radio1.Text; } else if (Radio2.Chec

RadioButton, CheckBox kontrolüne benzerlik gösterir. Ancak RadioButton kontrolunun Grolfazla seçeC

Ö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){

{ Messag

ked) { 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>

Page 514: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

182 Modül 7:

<asp:RadioButton id=Radio1 Text="Pop" Checked="True' GroupName="muzik" runat="server"/> <br> <asp:RadioButton id=Radio2 Text="Jazz"

<asp:RadioButton id=Radio3 Text="Classic"

<br> tton text="Seçiniz" id=”BtnOnay”

k="BtnOnay_Clicked" runat=server/> >

<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

GroupName="muzik" runat="server"/> <br> GroupName="muzik" runat="server"/>

<asp:bu OnClic <br><br

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

ageUrl özelliği ile görüntülenecek resim dosyası belirlenir. ImageAlign özelliği resmin

teText resime alternatif metin göstermek ılır.

k

xt="Logomuz"

Image Image, sayfa içinde resim görüntülemek için kullanılır. Im

hizalanması için kullanılır. Alternaiçin kullan Örne te Image kullanımı gösterilmektedir. <asp:Image id="Image1" runat="server" AlternateTe

Page 515: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 183

ImageAlign="left" ImageUrl="logo.gif"/>

void ImageButton_Click(object Source,ImageClickEventArgs e)

ğme kontrolünü Tıkladınız" + String() + ", " +

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"/>

ImageButton kontrolünün ImageClickEventArgs argüman nesnesi kullanarak, kontrolün bulunduğu yerin koordinat değerleri alınabilir.

LinkButton LinkButton, HyperLink görünümlü Button kontrolüdür. LinkButton

kontrolünün HyperLink kontrolünden farkı ise olaylarının olmasıdır. Örnekte LinkButton kullanımı gösterilmektedir. void LinkButton1_Click(Object sender,EventArgs e) {

="Link Button’a tıkladınız" ;

"14pt" onclick="LinkButton1_Click" runat="server"/>

abel id=Label1 runat=server />

ImageButton ImageButton resimli button kontroludur. Örnekte ImageButton kullanımı gösterilmektedir.

{ Message.InnerHtml="Resimli Dü "Koordinatlar: (" & e.X.To

Label1.Text} <asp:LinkButton Text="Mesajı Görmek İçin Tıklayınız." Font-Name="Verdana" Font-Size=

<br> <asp:L

Page 516: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

184 Modül 7:

DroD D k için kullanılır. DropDownList öğeleri Items koleksiyonunda tutulur. Items koleksiyonunun Count özelliği ile

ontrolune tasarım veya çalışma

ownList kontrolune tasarım zamanında öğe eklenmektedir.

sp:ListItem> <asp:ListItem>İngilizce</asp:ListItem>

a</asp:ListItem> nca</asp:ListItem>

Text="Submit" n_Click" runat="server"/>

bel1" runat="server"/>

etiketi içindeki değerler, DropDownList öğelerini temsil eder.

ntrolune çalışma zamanında öğe eklenmektedir.

sp:DropDownList id="DropDownList1" style="Z-INDEX: 101;

pDownList rop ownList, açılan kutuda veri görüntüleme

toplam öğe sayısı bulunur. DropDownList kzamanında öğe eklenebilir. Örnekte DropD 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</a

<asp:ListItem>Almanc <asp:ListItem>İtalya</asp:DropDownList>

utton id="Button1" <asp:B OnClick="Butto<asp:label id="La

ListItem Örnekte DropDownList ko <a

Page 517: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 185

LEFT: 128px; POSITION: absolute; TOP: 160px"

DropDownList1.Items.Add(i.ToString);

}

n eklemek için, Items koleksiyonunun Add metodu

istBox DropDownList kontrolüne benzer. Elemanlar liste halinde gösterilir özelliğine değeri atanarak, çoklu seçim yapma

im

klu seçim özelliği kullanılmaktadır. ListBox

ublic void SubmitBtn_Click(object sender, EventArgs e)

Message.Text = ""; m in ListBox1.Items)

{

Message.Text += item.Text + " "; }

<asp:ListBox id=ListBox1 Rows=4 e="Multiple" Width="100px" runat="server"> tem>Türkçe</asp:ListItem>

</asp:ListBox>

Panel, diğer kontrolleri gruplandırmak için kullanılır.

t sender, EventArgs e)

runat="server" Width="152px"/> void Page_Load(System.Object sender, System.EventArgs e) { for (int i=0;i<=5;i++) {

}

Çalışma zamanında elemakullanılır.

ListBox

L

v,

e SelectionMode Multiple

kânı sağlanır. Örnekte ListBox kontrolunün çokontrolu içerisinde seçilen tüm elemanlar Label kontrolune yazıdırılır. p { ListItem item;

foreach(ListItem ite

if(item.Selected == true) { } }

SelectionMod <asp:ListI <asp:ListItem>İngilizce</asp:ListItem> <asp:ListItem>Almanca</asp:ListItem> <asp:ListItem>İtalyanca</asp:ListItem> <br> <asp:button Text="Submit" OnClick="SubmitBtn_Click" runat="server" /> <br> <asp:Label id="Message" runat="server"/>

Panel

Örnekte panel kullanımı gösterilmektedir. public void Button1_Click(objec {

Page 518: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

186 Modül 7:

// Label kontrolü oluşturalım

el label;

el1.Controls.Add(label); el1.Visible = true;

"

"150px" 200px"

el>

<asp:Button id="Button1" onClick="Button1_Click" Text="Panel’i Göster" runat="server"/>

ta gösterilmemektedir Button1 düğmesi tı nınca, panel kontrolunun içerisine label kontrolu eklenir ve görünür hale.

Table, satırlarına ve sütunlarına programlama yoluyla müdahale edilebilen ü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);

Lab label = new Label(); label.Text = "Etiket"; label.ID = "Label1"; Pan Pan } <asp:Panel id="Panel1" runat="server BackColor="blue" Height= Width=" Visible=false> Panel1 <p> </asp:Pan

Panel1 isimli panel kontrolü başlangıçkla

getirilir. BackImageUrl özelliği ile panele arka plan resmi verilir.

Table

tablo kontrold

}

Page 519: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 187

<asp:Table id="Table1" GridLines="Both" HorizontalAlign="Center" Font-Name="Verdana" Font-Size="8pt" CellPadding=15 CellSpacing=0 Runat="server"/>

u 5: Doğrulama(ValiKon dation) 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.

doğruluğunu kontrol etmek için doğrulama geliştirildi. ASP.NET, belirlsi bir aralıkta veri girişi sağlayan,

ş geçilmemesini sağlayan çeşitli lama kontrolleri listelenmiştir.

ASP.NET ile birlikte verinin kontrollerikarşılaştırma yapan ve belirli değerlerin bodoğrulama kontrolleri sunar. Tablo 7.1 de doğru

Validation Kontroller Görevi

RequiredFieldValidator Bir kontrol içerisine değer girilip girilmediğini kontrol eder. Veri

ılır. girilmesi zorunlu alanlarda kullan

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.

Page 520: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

188 Modül 7:

RegularExpressionValidator Bir kontrol içerisine girilen değerin, istenilen formatta girilmesini sağlar.

mValidator Özel doğrulama kontrolu yazmayı

Custosağlar.

ionSummary Sayfada kullanılan tüm validation trollerin, doğrulama hatalarını

özet olarak görüntüler.

Validatkon

Tablo 7.3: Doğrulama Kontrolleri

Doğrulama kontrollerinin ortak özellikleri aşağıdaki gibidir.

ControlToValidate: Hangi kontrolün doğrulanacağını belirtir. • ErrorMes e: G

lliği birlikte kullanılabilir. Bu unda Text özelliğindeki mesaj görüntülenir. Doğrulama lerin ErrorMessage özelliğine girilen tüm mesajlar

Req

apılacak web kontrolünün ismi ControlToValidate özelliğine rilir Geçerli giriş yapılmadığında ortaya çıkacak hata mesajı ErrorMessage

r.

eldValidator kullanımı gösterilmektedir..

"RequiredFieldValidator1" 4px; POSITION: absolute;

at="server" ErrorMessage="Adınızı Girmelisiniz!!!"

ComKontrol içerisine girilen değeri, sabit değerle veya başka bir kontrol ile

ullanılır. Doğrulama yapılacak web kontrolünün ismi sabit değer

alueToCompare özelliğine girilir. Type özelliğine girilen değerin veri türü,

tadır.

sag eçerli giriş yapılmamışsa görüntülenecek hata mesajını verir.

• Text: ErrorMessage ve Text özedurumkontrolValidationSummary içerisinde listelenir.

• Display: Validation kontrolün nasıl görüntüleneceği bilgisini tutar. Static, Dynamic ve None değerleri alır.

uiredFieldValidator RequiredFieldValidator, belirtilen kontrolün boş geçilmemesini sağlar. Doğrulama ygiözelliği ile belirtili Örnekte RequiredFi <asp:RequiredFieldValidator id= style="Z-INDEX: 103; LEFT: 22 TOP: 48px" run ControlToValidate="txtad"> </asp:RequiredFieldValidator>

pareValidator

karşılaştırmak için kControlToValidate özelliğine girilir. Karşılastırma yapılacak V

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ılmak

Page 521: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 189

<asp:CompareValidator id="CompareValidator1" style=" TOP: 88

Z-INDEX: 109; LEFT: 232px; POSITION: absolute; px" runat="server"

ErrorMessage="Yaşınız 20 ye eşit veya büyük olmalıdır."

ControlToValidate="txtYas" nteger" r="GreaterThanEqual" 28px"> reValidator>

rolu, başka bir web kontrolü ile arşılaştırılacaksa ControlToCompare özelliği kullanılır.

ğeri txtKontrol değerinden büyük olmalıdır.

; LEFT: 240px; POSITION: absolute; er" trol alanında yazılan

ük olmalıdır." Validate="txtYas"

e="Integer" eaterThan"

Width="144px" are="txtKontrol"> idator>

RanKontrol içerisine girilen değerin, belirli bir değer aralığında olmasını sağlar.

ortak özelliklerine ek olarak MinimumValue,

n değerin, otuzbeş ile elli arasında olamasını

<asp:RangeValida an " style="Z-INDEX EFT SITION: absolute; TOP: 8px" run ErrorMessage= şınız 35 ControlToValidate="txtYas Type="Integer" MaximumValue=" MinimumValue="35"> </asp:RangeValid >

ValueToCompare="20"

Type="I Operato Width="1</asp:Compa

Doğrulama yapılacak web kontk Örnekte txtYas kontrolünün de <asp:CompareValidator id="CompareValidator1" style="Z-INDEX: 109 TOP: 128px" runat="serv ErrorMessage="yaşınız kon değerden büy ControlTo Typ Operator="Gr

ControlToComp</asp:CompareVal

geValidator

Doğrulama kontrollerinin MaximumValue ve Type özellikleri vardır.

Örnekte txtYas kontrolune girilesağlayan doğrulama işlemi yapılmaktadır. Bu özel karakterler Tablo 7.4

tor id="R: 109; L

geValidator1: 240px; PO

12"Ya

at="server" ile 50 arasında olmalıdır." "

50"

ator

Page 522: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

190 Modül 7:

RegKontrol içerisine girilen değerin, istenilen formatta girilmesini sağlar.

irilen özel karakterler ile veri giriş formatı ğ arakterler Tablo 7.4 de gösterilmektedir.

e txtMail metin kutusu için

p:regularexpressionvalidator id="RegularExpressionValidator1" style="Z-INDEX: 111;

bsolute; TOP: 168px"

ValidationExpression= "\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*">

</asp:regularexp li

rakter

ularExpressionValidator

ValidationExpression özelliğine gsa lanır. Bu özel k Örnekte RegularExpressionValidator kontrolu ilgeçerli e-mail girişi sağlanmaktadır. <as

LEFT: 256px; POSITION: a runat="server" ErrorMessage="Mail giriş hatası" ControlToValidate="txtMail"

ressionva dator>

Ka

Tanımı

a B ı zorunlu kılar. ir harf kullanımın

1 1 sayısı kullanılmak zorunda.

? 0 k zorunda veya 1 öğe olma

* 0’dan n’e kadar bir değer

+ 1’den n’e kadar bir değer

Page 523: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 191

[0-n] 0 dizisi ’dan n’e kadar sayı değer

{n} N uğunda olmalı ile belirtilen değer uzunl

| 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

ktadır. formatı oluşturulma ValidationExpression= "\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*">

r bir değer girilmesi gerektiği anlamına gelir. @ işaretinin kull .

Örnekte Validatio ression rler ile e-mail formatı oluşturulmaktadır.

\w+ : En az bir karakter içeren metin anlamına gelir. ([-+.]) : -, +, . karakterlerinden herhangi biri anlamına gelir. : 0’dan n’e kada*

@ : anılması gerektiğini belirtir

özelliğine girilen özel karaktenExp

ValidationExpres =“\w+@

CustomValidator Aynı anda birden fazla nesnenin d anıcı tanımlı kontrol yazmak için CustomValidator kontrolü kullanılır.

sion \w+\.\w+”

eğerini kontrol etmek veya kull

Page 524: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

192 Modül 7:

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.

stomValidator_SunucuKontrol(object s, s e)

erverValidateEventArgs parametresinin iki özelliği vardır:

alue: Doğrulama kontrolünün değerini verir.

anılabilir.

tin kutusuna girilen değerin çift olması kontrol edilmektedir. CustomValidator kontrolunun HTML kodları aşağıdaki gibidir.

="Form1" method="post" runat="server">

style="Z-INDEX: 101; LEFT: runat="server"

Text="gonder" onClick=”gonder_OnClick”> </asp:Button>

id="CustomValidator1"

Özellik Açıklama

C İstemci fonksiyon ismini belirtir. lientValidationFunction

ControlToValidate Doğrulama yapılacak kontrolü belirler. D play Text özelliğine girilen hata mesajının nasıl is

görüntüleneceği belirtir. E bleClientScript İstemci skriptleri aktif hale getirir. na

Varsayılan değer True dur. Enabled Sunucu ve istemci taraflı skriptleri aktif hale

ayılan değer True dur. getirir. VarsErrorMessage Kontrol hata mesajını gösterir. I

True, değilse False değerini döndürür. sValid Kontrol işlemi başarı ile sonuçlanmışsa

Te ontrol hata mesajını gösterir. ErrorMessage ve Text özelliği birlikte kullanılabilir. Bu durumunda Text

ntülenir.

xt K

özelliğindeki mesaj görü

public void CuServerValidateEventArg

{ }

S

IsValid: Bu özellik True ise kontrol içerisine girilen değerin doğruluğu sağlanmıştır. V CustomValidator, kredi kart numaralarının doğruluğu kontrol etmek için kull Örnekte me

<form id <asp:Button id="Button1" 200px; POSITION: absolute; TOP: 96px" <asp:CustomValidator

Page 525: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 193

style="Z-INDEX: 102; LEFT: 312px; POSITION: absolute; TOP: 64px" runat="server"

" ControlToValidate="txtcustom" Display="Static"

</asp:CustomValidator>

: 152px" runat="server"> </asp:TextBox>

<asp:TextBox id="txtcustom" style="Z-INDEX: 104; TION: absolute; TOP: 64px"

id ServerKontrol(object source, verValidateEventArgs args)

num = int.Parse(args.Value); args.IsValid = ((num%2) == 0);

ex)

args.IsValid = false; }

bject sender, EventArgs e)

if(Page.IsValid)

txtmessage.Text = "Sayfada Hata Yok.";

{ txtmessage.Text = "Sayfa Hatalı!";

Valintrollerin ErrorMessage özelliğine girilen

mmary id="ValidationSummary1" 14; LEFT: 72px; POSITION: absolute;

mmary>

ErrorMessage="çift rakam giriniz. OnServerValidate="ServerKontrol"> <asp:TextBox id="txtmessage" style="Z-INDEX: 103; LEFT: 200px; POSITION: absolute; TOP LEFT: 144px; POSI runat="server"> </asp:TextBox> </form>

CustomValidator kontrolunun C# kodları aşağıdaki gibidir. Ser

public vo

{ try { int

} catch(Exception { } public void gonder_OnClick(o {

{ } else } }

dationSummary ValidationSummary, doğrulama kotüm mesajları listeler. Örnekte ValidationSummary kullanımı gösterilmektedir. <asp:ValidationSu style="Z-INDEX: 1 TOP: 336px" runat="server" HeaderText="Hatalar"> </asp:ValidationSu

Page 526: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

194 Modül 7:

DisplayMode özelliği ile ValidationSummary kontrolunun görüntüsü

MessageBox, hata listesinin mesaj kutusu içinde

örü

Kon

değiştirilebilir. DisplayMode, BulletList, List ve SingleParagraph

dgeğerlerini alır. Show

ntülenmesini sağlar.

u 8: Zengin Kontroller

AdRotator AdRotator, Web sayfalar nde reklam yayını yapmak için kullanılır. Reklam için kullanılan banner nesneleri XML dosya içer Örnekte AdRota kli XML dosya (Ads.Xml) gösterilmektedir.

< <NavigateUrl>http://www.bilgeadam.com</NavigateUrl>

<ImageUrl>image2.gif</ImageUrl>

sions>

ı üzeriisine kaydedilir.

tor kullanımı için gere

Advertisements> <Ad> <ImageUrl>image1.gif</ImageUrl>

<AlternateText>BilgeAdam BTA</AlternateText> <Impressions>80</Impressions> <Keyword>Yazılım</Keyword> </Ad> <Ad> <NavigateUrl>http://www.microsoft.com</NavigateUrl> <AlternateText>Microsoft Site</AlternateText> <Impressions>80</Impres

Page 527: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 195

<Keyword>microsoft</Keyword>

xt: Resime alternatif metin göstermek için kullanılır. pres mlerinin uygulam sini belirtir.

Keyword: arasında filtreleme oluşturacak kategori adını belirler. AdRota n Advertis i, reklâm bilgilerinin bulundu syayı içerir. Ke reklâmların filtrelenerek görüntülenmesini sağlar.

Calendar ek için kullanılır..

alender kullanımı gösterilmektedir.

ellikler tablo 7.4’de listelenmiştir.

</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. lternateTeA

Im sion: -Banner resi.Banner nesneleri

a süre

tor kontrolünü ementFile özelliğywordFilter özelliği iseğu XML do

Calendar, web sayları üzerinde Takvim gösterm

Örnekte C <asp:Calendar id=”takvim” runat=”server”/>

Calendar kontrolüne ait öz

Ö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

FullMonth, ShortMonth değerleri alır. Varsayılan CustomText değeridir.

Next ve Previous linklerinin biçimini ayarlar. CustomText,

SelectedDate Seçilen gün bilgisini tutar. Varsayılan değer günün tarihidir.

SelectionMode Calendar nesnesinin seçim modunu belirler. Day, DayWDayWeekMonth ve None değerleri

eek,

Page 528: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 lar. görüntülenmesini sağ

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: 160 ON: absolute; TOP: 248px" runat="server" CellSpacing="2" Width="240px" Height="152px" BorderStyle="Groove" DayNameFormat="Full" NextPrevFormat="FullMonth"> <DayStyle Font-Bold=" ontalAlign="Center"

rStyle="None" BorderColor="Transparent" alAlign="Top" BackColor="LightCyan">

</DayStyle> <DayHeaderStyle Font-Underline="True" Font-Italic="True" HorizontalAlign="Right" BorderWidth="3px"

BorderStyle="Groove" BorderColor="#C0FFFF" VerticalAlign="Top"

</DayHeaderStyle> olor="Salmon"></WeekendDayStyle>

sp:Calendar>

px; POSITI

True" Horiz Borde Vertic

ForeColor="DarkBlue" BackColor="#FFC0FF"> <WeekendDayStyle BackC</a

Page 529: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 197

Konu 9: AutoPostBack elliği Öz

AutoPostBack özelliği, herhangi bir sunucu kontrolünün web sunucuya

dermesini sağlar. Web formu doldurduktan sonra rolu kullanılır.

pDownList, ListBox, CheckBox, CheckBoxList, n, RadioButtonList, TextBox ve Button kontrolünde bulunur.

im yapıldığında veya TextBox kontrolüne yeni bir den yüklenmesi anlamına gelir.

Örnekte AutoPostBack kullanımı gösterilmektedir. <%@ Page Language="C#" Debug="true" %> <html> <head></head>

<form runat="server"> Bilgiğiniz Yabancı Dili Seçiniz:<br/><br/> <asp:listbox id="lstDiller" runat="server" rows="3" AutoPostBack="true" onSelectedIndexChanged="secimGoster"/>

<asp:Label id=lblMesaj runat="server" /> <br/><br/>

ody>

ript language=c# runat="server">

otomatik olarak bilgi gönsunucuya göndermek için genellikle button kont AutoPostBack özelliği, DroRadioButto

Bu özelliğin True olması, seçdeğer girildiğinde sayfanın yeni

<body>

<br><br> </form> </b</html> <sc

Page 530: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

198 Modül 7:

private void Page_Load(object s { lst

</script>

ender, System.EventArgs e) { if(!Page.IsPostBack)

Flowers.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; }

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 tekra ı verilerin girilmesi istenmez. Çünkü kulla iş olduğu değerler bu gizli değişkende saklanır ve sayfa

r aynnıcının girm

açılınca tekrar kullanıcıya sunulur.

Page 531: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 199

Örnekte ViewState kullanımı gösterilmektedir.

idden" name="__VIEWSTATE" khGyy1Rw1gGcc+ia" />

Modül Özeti

<input type="hvalue="dDwtMTY5NzI1NjkxNzs7Po5lYTu9gAdJ

15. Web form bileşenlerini açıklayın?

16. Stardart kontroller nelerdir ? 17. Doğrul18. Ze19. A20. ViewState özelliğini açıklayın?

Açıklayın. ama kontrolleri nelerdir ? Açıklayın.

ngin kontroller nelerdir ? Açıklayın. utoPostBack nedir ?

Page 532: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

200 Modül 7:

Lab 1: E-Ticaret Uygulaması Geliştirmek

Bu uy caret uygulamasının web formları tasarlanacaktır. E-ticaret uygul 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

tır. Ayrıca kullanıcıyı yönlendirmek için Giris, Kayıt ve Satış isminde 3 ayrı web form tasarlanacaktır.

• Access veritabanına bağlantı oluşturabilecek, • Web Formları tanıyacak, • Standart Kontrolleri kullan ek, • Doğrula ceksiniz.

Veri ının projeye eklenmesi anılacak Course veritabanı oluşturun.

ile “KitapDb” isminde bir veritabanı oluşturun. ama göre oluşturun.

gulamada, e-tiaması iç

kullanılacak

Bu lab tamamlandıktan sonra:

abilecma kontrollerini kullanabile

tabanBu uygulamada kull10. Microsoft Access11. Veritabanın tablolarını aşağıdaki diyagr

Page 533: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 201

12. Veritabanı içerisinde EnCokSatanlar isminde sorgu oluşturun. 13. Sorgunun içerisine aşağıdaki Select cümlesini ekleyin.

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

SELECT Kitap.KitapAdi, Kitap.Ucret, Kitap.KitapID

Özellik Değer

TextBox – txtAd

TextBox – txtSoyad

TextBox – txtEmail

TextBox – txtSifre TextMode Password

TextBox – txtSifreDogrula TextMode Password

RequiredFieldValidator – rfvAd

ControlToValidate txtAd

ErrorMessage Adı boş geçemezsiniz Text * Required – rfvSoyad

ControlToValidate txtSoyad FieldValidator

ErrorMessage Soyadı boş geçemezsiniz

* Text

Page 534: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

202 Modül 7:

Required

rfvEmail FieldValidator – ControlToValidate txtEmail

ErrorMessage E-maili boş geçemezsiniz

Text * RequiredFieldValidator – ControlToValidate txtSifre rfvSifre ErrorMessage Şifreyi giriniz. Text * RequiredFieldValidator – rfvSifre2

ControlToValidate txtSifreDogrula

ErrorMessage Doğrulama şifresini giriniz

Text * RegularExp ionValidator

– revEmail ControlToValidate txtEmail ress

ErrorMessage Hatalı Email Text * Validation

Expression +.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

\w+([-

CompareValidat

cvSifreDogrula or– ControlToCompare txtSifre

ControlToValidate txtSifre2 ErrorMessage Şifreler uyumsuz Text * ValidationSummary – vsHata Button - btnKaydet Text Kaydet

UyeKayit Web formun Html kodları aşağıdaki gibi olacaktır.

Page 535: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 203

<%@ Register TagPrefix="uc1" TagName="yan" Src="yan.ascx" %> <%@ Pag age="C#" AutoEventWireup="false" Codebehin .aspx.cs" Inherit et.UyeKayit" %> <%@ Reg agPrefix="uc1" TagName="kategori" Src="ka %> <%@ Reg ix="uc1" TagName="Ust" Src="Ust.ascx" %> <%@ Regis agPrefix="uc1" TagName="Alt" Src="Alt.ascx" %> <!DOCTYPE HTML PUBLIC "- /DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <title>UyeKayit</tit <meta c osoft ual Studio .NET 7.1" name="G <meta content="C#" "CODE_LANGUAGE"> <meta content="Java " name="vs_defaultClientScr <meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">

EAD> 0">

nat="server"> cellSpacing="0" cellPadding="0" order="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" r ver"></uc1:kategori></TD> <TD width="400" height="100%"> <P> <TABLE id="Table2" cellSpacing="0"

dding="0" width="300" align="center" border="0"> TR>

<TD style="HEIGHT: 48px"

<P align="center"><FONT e="Tahoma" size="2"><STRONG>Üyelik

</P> </TD> </TR> <TR> <TD style="WIDTH: 100px"><FONT face="Tahoma" size="2">Ad*</FONT></TD> <TD><asp:textbox id=" d" runat="server" Width="176px"></asp:textbox><asp:requiredfieldvalidator id=" runat="server" ControlToValidate="txtAd" ErrorMessage="Adı boş geçe niz">*</asp:requiredfieldvalidator><FONT face=" a" size="2"></FONT></TD> </TR> <TR> <TD style="WIDTH: 100px"><FONT face="Tahoma" size="2">Soyad*</FONT></TD>

d="txtSoyad"

e Langud="UyeKayit

s="AspEticarister Ttegori.ascx"ister TagPref

ter T//W3C/

le>

ontent="Micr VisENERATOR">

name=Scriptipt">

</H <body bgColor="#f0fff <form id="Form1" method="post" ru <TABLE id="Table1" width="700" align="center" b

unat="ser

cellPa < colSpan="2"> facBilgileri</STRONG></FONT>

txtA

rfvAd"

mezsiTahom

<TD><asp:textbox irunat="server"

Page 536: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

204 Modül 7:

Width="176px"></asp:textbox><asp:requiredfieldvalidator id="rfvSoyad" ErrorMessage="Soyadı boş geçemezsiniz.">*<

"Taho

idErr

Display="larexpressionvalidator id="revEmaControlToValidate="txtEmail" Er ValidationExpression.]\w+)*">*</asp:regfac

runat="server" WTextMode="Passworr id="rfvSifre" runaErrorMessage="Şifreygir

face="Tahoma" size="2">Şifre Do <TD><aid=

fvSifre2" runat="servValidate="txtSifreD

runat="server" ControlToValidate="txtSoyad"

/asp:requiredfieldvalidator><FONT face="Tahoma" size="2"></FONT></TD> </TR> <TR> <TD style="WIDTH: 100px"><FONT face= ma" size="2">E-Mail*</FONT></TD> <TD><asp:textbox id="txtEmail" runat="server" Width="176px"></asp:textbox><asp:requiredfieldvalidator ="rfvEmail" runat="server" ControlToValidate="txtEmail" orMessage="E-maili boş geçemezsiniz. "

Dynamic">*</asp:requiredfieldvalidator><asp:regu

il" runat="server" rorMessage="Hatalı Email"

Display="Dynamic" ="\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-

ularexpressionvalidator><FONT e="Tahoma" size="2"></FONT></TD>

</TR> <TR> <TD style="WIDTH: 100px"><FONT face="Tahoma" size="2">Şifre*</FONT></TD>

<TD><asp:textbox id="txtSifre" idth="176px" d"></asp:textbox><asp:requiredfieldvalidato

t="server" ControlToValidate="txtSifre" i

iniz.">*</asp:requiredfieldvalidator><FONT face="Tahoma" size="2"></FONT></TD> </TR> <TR> <TD style="WIDTH: 100px"><FONT

ğrula*</FONT></TD> sp:textbox

"txtSifreDogrula" runat="server" Width="176px" TextMode="Password"></asp:textbox><asp:requiredfieldvalidator id="r er" ControlTo ogrula" ErrorMessage="Doğrulama şifresini giriniz." Display="Dynamic">*</asp:requiredfieldvalidator><asp:comparevalidator 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>

Page 537: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 205

<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 – txtEmail

TextBox – txtSifre TextMode Password

Text * Button – btnGiris Text Giriş Label – lblMesaj Text

Page 538: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

206 Modül 7:

UyeGiriş W 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>

i></TD> dth="400" vAlign="top">

ing="0" r="0">

ONG><FONT

x">E-

p:TextBox id="txtEmail" ="128px"></asp:TextBox></TD>

EIGHT:

tSifre"

eb formun

<TR> <TD width="150" vAlign="top"> <uc1:kategori id="Kategori1" runat="server"></uc1:kategor <TD wi <P> <TABLE id="Table2" cellSpaccellPadding="0" width="200" align="center" borde <TR> <TD style="HEIGHT: 63px" colSpan="2"> <P align="center"><STRface="Verdana" size="2"><BR> Üye Giriş</FONT></STRONG></P> </TD> </TR> <TR> <TD style="WIDTH: 66pMail&nbsp;</TD> <TD> <asrunat="server" Width </TR> <TR> <TD style="WIDTH: 66px; H11px">Sifre</TD> <TD style="HEIGHT: 11px"> <asp:TextBox id="txrunat="server" Width="127px" TextMode="Password"></asp:TextBox></TD>

Page 539: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 207

</TR> <TR> <TD style="HEIGHT: 54px" colSpan="2"> <P align="center"> <asp:Button id="runat="server" Text="Giriş"></asp:Button></P> </TD> < <TD colSpan="2"> <asp:Label id="lblMesarunat="server"></asp:Label></TD> </TR> </TABLE> </P> </TD> <TD width="150" bgColor="#0099ff" v <uc1:yan id="Yan1" runat="server"></uc1:yan></TD> </TR> <TR> <TD bgColor="#99ccff" colSpan="3"> <ucrunat="server"></uc </TR> </TABL </form> </body> </HTML>

Giris formunun eklenmesi ASPEticaret projesine G Form üzerine, tablodaki kontrolleri ekleyin belirtilen özelliklerini ayarlayın. Kontrol – Kontrol İsm

btnGiris"

/TR> <TR>

j"

Align="top">

1:Alt id="Alt1" 1:Alt></TD>

E>

iris isminde yeni bir web form ekleyin.

i Özellik Değer

HyperLink – lnk1 NavigateUrl UyeGiris.aspx Text Tıklayınız HyperLink – lnk2 NavigateUrl UyeKayit.aspx Text Tıklayınız

Page 540: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

208 Modül 7:

Giri

<%@ Register TagP<%@ Register TagPrefix="uc1" Tag<%@ Register TagPrefix="uc1" TagNSrc="kategori.asc<%@ Register TagPref<%@ Page Language="C#" AutoEventWCodebehind="Giris.aspx.cs" Inher<!DTr<HTML> <title>Kayit</title> Studio .NET 7.1"> <meta name="vs_defaultCliencon content="http://sche <body bgColor="#f0fff0"> <TABLE id="wid <TR> runat="server"></uc1 <TR> <urunat="server"></ <TD width="400" vAl <P><BR> yapmalısınız.<BR> <asp:HyperLinkNavigateUrl="UyeGiris.aspx">tıkl

s Web formun Html kodları aşağıdaki gibi olacaktır.

refix="uc1" TagName="Alt" Src="Alt.ascx" %> Name="Ust" Src="Ust.ascx" %> ame="kategori"

x" %> ix="uc1" TagName="yan" Src="yan.ascx" %>

ireup="false" its="AspEticaret.Giris" %>

OCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 ansitional//EN">

<HEAD>

<meta name="GENERATOR" content="Microsoft Visual

<meta name="CODE_LANGUAGE" content="C#"> tScript"

tent="JavaScript"> <meta name="vs_targetSchema"

mas.microsoft.com/intellisense/ie5"> </HEAD>

<form id="Form1" method="post" runat="server"> Table1" cellSpacing="0" cellPadding="0"

th="700" align="center" border="0">

<TD bgColor="#99ccff" colSpan="3"> <uc1:Ust id="Ust1"

:Ust></TD> </TR>

<TD width="150" vAlign="top"> c1:kategori id="Kategori1" uc1:kategori></TD>

ign="top">

Sayfaya erişmek için üye girişi

Giriş yapmak için id="lnk1" runat="server" ayınız</asp:HyperLink></P>

<P>Üye olmak için

Page 541: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 209

Nav </TD> runat="server"></uc1 <TR> <urun </TR> </form> </HTML>

Kayit formunuASPEticaret projesine Kayit isminde yeni b Form üzerine, tablodak Kon

<asp:HyperLink id="lnk2" runat="server" igateUrl="UyeKayit.aspx">tıklayınız</asp:HyperLink></P>

<TD width="150" bgColor="#0099ff" vAlign="top"> <uc1:yan id="Yan1"

:yan></TD> </TR>

<TD bgColor="#99ccff" colSpan="3"> c1:Alt id="Alt1"

at="server"></uc1:Alt></TD>

</TABLE>

</body>

n eklenmesi ir web form ekleyin.

i kontrolleri ekleyin belirtilen özelliklerini ayarlayın.

trol – 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" %>

="Ust" Src="Ust.ascx" %> <%@ Register TagPrefix="uc1" TagName="Alt" Src="Alt.ascx" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML>

<%@ Register TagPrefix="uc1" TagName="kategori" Src="kategori.ascx" %> <%@ Register TagPrefix="uc1" TagName

Page 542: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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>

k için <asp:HyperLink id="lnk1" runat="server"

<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>

munun eklenmesi ASPEticaret projesine Satis isminde yeni bir web form ekleyin. Form üzerine, tablodaki kontrolleri ekleyin belirtilen özelliklerini ayarlayın. Kontrol – Kontrol İsmi

Giriş yapma NavigateUrl="UyeGiris.aspx">tiklayiniz</asp:HyperLink></P> </TD>

</form> </body> </HTML>

Satis for

Özellik Değer

HyperLink – lnk1 NavigateUrl Default.aspx Text tıklayınız

Page 543: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 211

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ş&nbsp;işlemi başarıyla tamalandı.<BR> Devam etmek&nbsp;için <asp:HyperLink id="link1" runat="server" NavigateUrl="Default.aspx">tıklayınız</asp:HyperLink></P> </TD> <T 0099ff" vAlign="top"> D width="150" bgColor="#

Page 544: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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>

Page 545: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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,

Page 546: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 547: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 215

Inline Kod Yazmak

Aynı .aspx L kodu ve V

kodlar Scr yazılmalıdır vebelirtilmelidir.

Kod 8.1: Inline Kod Yazmak

dosyası içinde HTM isual Basic .NET kodu ayrı bölümlere yazılır. Bölümlerin ayrı tutulması okunabilirliği arttırır. Server taraflı

ipt etiketi içersine runat=”server” özelliği

<%@ Page La<html> <head> <title irs ti<scri na

</form> </body> </html>

nguage="C#" %>

>My F t Web Form</ tle> pt ru t="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" />

Page 548: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

216 Modül 8: Asp.Net ile Kod Geliştirmek

Cod Kod Yazmak e-Behind

Visual Studio .NET ortamının kullandığı varsayılan model comodelidir. Programlama vegöre ayrım yapılmış olur. Code-behind sayfsonuna .cs eklensayfası, WebForm1.aspx.cs şeklindedir. Form üzerinde bkontrole ait olay için metot tanımlanır. Csayfasının Page bildiriminde, CodeBehind ve Src özelliklerine ilgili degirilmesi

Kod 8.2: WebForm.aspx - Code-behind

de-behind tasarım tasarım sayfaları ayrı tutularak çalışma mantığına

aları, .aspx uzantılı sayfanın erek isimlendirilir. Webform1.aspx sayfasının code-behind

ir kontrole çift tıklandığında code-behind sayfası açılır ve o

ode-behind sayfasının .aspx sayfasıyla birlikte çalışabilmesi için, .aspx ğerlerin

gerekir.

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>

Page 549: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 217

</form> </body> </HTML>

Kod 8.3: WebForm.aspx. s – Code-Behind Sayfası

c

using System; using System.Collections; using Sys nentModel; using System.Data; using System.Web;

protected System.Web.UI.WebControls.Button btnGond private void Page_Load(object sender, System.EventArgs e) { Response.Write("S } rivate void Button1_Click(object sender, System.EventA { lblMesaj.Text = "Hoşgeldin " + txtAd.Text.ToString(); }

Codebehind Code-behind

tem.Compo

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;

er;

elam");

p rgs e)

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.

Page 550: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

218 Modül 8: Asp.Net ile Kod Geliştirmek

Kon lay Prosedürleri

u 2: Client Side(İstemci Taraflı) O

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çbi Çünkü istemci tarafındaki Internet tarayıcısı kodu alır ve işler. Clie prosedürleri yalnızca HTML kontrolleri tarafından kullanılır. Client ay 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. < =”JavaScript”> </SCRI

r bilgi göndermezler.

nt-side olay-side ol

SCRIPT language

PT>

Page 551: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 219

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ı

ına kod yazılabilir. Server-gibi olaylar için kullanılır. Fare ve

kaynaklarını kullanamazken, server-side olay prosedürleri sunucukullanı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 olaylarside olay prosedürleri Click ve Change klavye olayları gibi çok sık gerçekleşebilecek olayları desteklenmez.

Page 552: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

220 Modül 8: Asp.Net ile Kod Geliştirmek

Olay Prosedürleri Oluşturmak

Visual Studio .NET içerisinde server-side ooluşturulur. Birinci adım olay üretecekİkinci adım ise code-behind sayfasına olay prosedurü

Olay prosedürleri kooluşturulur. Handles anahtar sözcüğü kontrolün hangi ilişkilendirileceğini belirler. Handles anahtar sözcüfazla olay prosedürü olu

Örn

lay prosedürleri iki adım ile kontrolu web form üzerine eklemektir.

nü eklemektir.

ntrolun ID özelliğine girilen değerden faydalanarak olay ile

ğü ile tek bir olay için birden şturulabilir.

ekte 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.

Page 553: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 221

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; }

Page 554: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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- Pag a klenm 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, önderilene kadar

nucuya gönderilmeden Change

e_Load (S yfanın yü esi): Bu

sayfa sunucuya geri ggerçekleşmez. Örneğin Click olayı ile form suolayları gerçekleşmez.

Page 555: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 223

Response.Redirect

Kullanıcıyı ir sayfadan b

da dolaşmayı sa . Parametre olarak

tirilmektedir.

b aşka bir sayfaya yönlendirmek için kullanılır. HyperLink kontrolü gibi sayfalar arasın ğlargidilecek sayfanın adresini belirtilir. Örnekte Response.Redirect metodu ile yönlendirme işlemi gerçekleş

Kod 8.6: Response.Redirect

private void ectedInd hanged(object sender, System.EventAr

istBox1.Select dValu

Value="httpsp:ListItem

</asp:Lis</asp:ListBox

ListBox1_Sel exCgs e)

{ } Response.Redirect(L e e); <asp:ListBox id="ListBox1" runat="server" AutoPostBack="True"> <asp:ListItem

://www.yahoo.com">yahoo </a >

<asp:ListItem Value="http://www.google.com">google

tItem> >

Page 556: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

ropDownList kontrolunun AutoPostBack ögirilmiştir. Bu durum liste kutusundan seçilen değerin sunucuya gönderilmesini sağlar.

Kod 8.7 DropDownList Kontrolunun Sunucuya Gönderilmesi

Örnekte D zelliğine True değeri

<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; }

Page 557: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 225

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

Page 558: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

226 Modül 8: Asp.Net ile Kod Geliştirmek

21. Web form içeris22. Code-Behind23. Sayfa yaşam döng24. Response.Redirect niçin kull25. Page.IsPostBack niçi

ile Kod G

inde kod yazmak için hangi yöntemler kullanılır? kod yazma tekniğini açıklayın?

üsünü açıklayın? anılır?

n kullanılır?

Lab 1: ASP.Net eliştirmek

Bu uygulamada, Code Behind ve Inline kod yöntemlerinin kullanımını öğrene 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,

ı skriptlerin kullanımını öğreneceksiniz.

Web uygulaması olu Bu uygul a 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

an “ASP.Net Web Application” şablonunu seçin.

16. Location metin kutusuna “http://localhost/AspCode” yazın.

ceksiniz. Ayrıca istemci

• İstemci tarafl

şturmakamad

komutunu tıklayın. 15. New Project ileti kutusund

Page 559: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 227

17. Enter bu

ode proj Test ism r web yin.

tonu tıklayın.

Web Form eklenmesi AspC esine inde yeni bi form ekle Form üzerine, tablodaki kontrolleri ekleyin belirtilen özelliklerini ayarlayın.

Kontrol – Kontrol İsmi Özellik Değer

Button – btnCodeBehind Code Behind Text

Button – btnInline Text Inline <INPUT type="button"> Value Java script

Kodların yazılması 1- btnCodeBehind kontrolunun Click olayına “Code Behind” yazan kodu

yazin. Bu ko Codolay

Respons Behind")

2- Test web formunun HTML bölümüne aşağıdaki 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.

<scrip t=" private void btn_Click(object sender, System.EventArgs e) { Response.Write("Inline");

d code behind yöntemi ile btn eBehind kontrolunun click ını çalıştırır.

e.Write("Code

kodları

t language="c#" runa server">

Page 560: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

228 Modül 8: Asp.Net ile Kod Geliştirmek

} </script>

3- Test web formunun HTML bölüm arı yazın. Bu kod,

Java Script ile istemci taraflı kod tanımlamaktadır. . Bu kodu <Head>..</Head> etiketleri arasına ekleyin.

> etiketleri arasına aşağıdaki kodu

<INPUT style="Z-INDEX: 103; LEFT: 24px; WIDTH: 112px; POSITION: absolute; TOP: 88px; HEIGHT: 24px" type="button" value="Java Script" onclick="mesaj()">

üne aşağıdaki kodl

<script language="javascript"> function mesaj() { alert('Hello World') } </script>

Fonksiyonu çağırmak için <Body>..</Bodyekleyin.

Page 561: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

tatik (sab 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.

kullanımı s it) sayfalar

Page 562: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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ş cuttur. Bir Web

rı kullanıcı tarafında çalışabilen ayrı web Örneğin JavaScript, kullanıcı tarafında

gibi web gramlama dilleri, sunucu tarafında kod yazma imkanı sunar.

Kon

İstemci ve sunucu tarafında çalışan çeşitli teknolojiler mevsayfası tasarlamak için kullanılan ortak dil HTML dilidir. Ancak HTML sayfalaiçinde, sunucu tarafında ve programlama dilleri kullanılabilir.kodlama imkanı sunarken, CGI, ASP, Php, Perl, ASP.NETpro

u 2: HTML

HTML (Hyper Text Markup Language), bir işaretleme dilidir. İstemci tarafında çalışan arayıcısı tarafından okunur, yorumlanır ve alınan işaretler neticesinde ekrana ilgili görüntü yansıtılır. HTML, HT col) ile bir arada çalışır. Bu işaretleme dili ile oluşturulmuş dökümanlar yalnızca istemci tarafında çalışır.

Internet t

TP (HyperText Transfer Proto

Page 563: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 231

HTML dökümanlarını CII ka lerinden oluşur ve hmetin editöründ

HTML Yapısı HTML dilini oluşturan bileşenler • Tag (etiket) • Attribute (nitelik) • Value (değer) olarak tanımlanır.

HTM ko r. Bir etiket, HTML’e yapılması istenen bir olay bil çerisine attribute adı verilen değerler girili ik özellikler, attribute nesnelerinde saklanır. Attr but ylara ait ayrıntıları tutar. Value ise, bir attribute değe n er.

n tümü AS rakter erhangi bir e yazarak oluşturulabilir.

L dlarının temeli etiketlerdiın dirimini temsil eder. Etiketlerin ir. Etiketlere ait değişi e değerleri, olarini davranacağı tarzı belirl

Tag

Etiketler (Tag), <> işaretleri arasında yazılır. Semboller ve etiket aboşluk yoktur. <H

ifadesi ise </Html> şeklinde bildirilir. Yişareti getirilerek kapatılır. Örneğin <P>

rasında

tml>

Bir etikete ait açma ve kapatma ifadeleri vardır. Açma ifadesi <Html>,kapatma ani açılan bir etiket, aynı isim başına / etiketi,bir paragraf açmaya yarar. </P>

Page 564: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

232 Modül 9: Web Programlamaya Giriş

Kapatma ifadesi kullanıldığında ise bu kapatma ifadesinin kadar olan bölüm p<Img> ve <Br> etiketi gibi bazı etiketler için bir kapatma ifadesi y HTML etiketlerinde büyük harf, küçük harf d

kullanıldığı yere aragrafın , içine dahil edilir. Ancak bazı istisnalarda vardır.

oktur.

uyarlılığı yoktur.

Attribute

Öznitelikler (Attribute), bir etikete ait özellikleri belirler. <html> etiketi ve

bittiği yeri belirtir ve Attribute değerine ihtiyacı yoktur. Attribute olmadan çalışan etiketlerin yanı sıra, attrib > etiketi, </body> kapatma ifadesi ile görüntülenecek alanın başlangıcını ve bitişini bildirir. Bu etiket, hiçbir attribute ışabilir. Görüntülenecek alana bir arka plan nımlamak iste color veya görüntülenecek yazı tipini tanımlamak is izde text özniteliklerine

ır. Aşağıdaki örnekte siyah zemin üzerine beyaz yazı yazılmaktadır. <Body bgcolor=”#000000” text=”#ffffff”>

</html> kapatma etiketi, HTML belgesinin başladığı ve

ute ile birlikte çalışan etiketler de vardır. <body

tanımlanmadan çalrengi ta diğinizde bg

tediğindeğerler atanmalıd

Page 565: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 233

Value

Bir olayın ne şekilde gerçekleşeceği value ile bildirilir. Örneğin bir pmetinin hizalanması, <DIV> etikattribute değeri, leftal

aragraflık eti kullanılarak yapılır. DIV etiketinin align

, right, center ve justify değerlerinden birini ır.

Page 566: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

tml>

r. e e

d etiketleri arasında yer alır. itle>…</title>, belgenin başlık yazısını tutar.

i istenen

</body> </h

<html>…</html>, Tarayıcıya HTML belgenin başladığı ve bittiği alanı bildiri<h ad>…</head>, Tarayıcıya HTML belge hakkında bilgi verir. <title> v<meta> etiketleri <head>…</hea<t

<body>…<body>, belgenin gövde bölümüdür. Sayfada görüntülenmestüm değerler burada bildirilir.

Page 567: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 235

En Sık Kullanılan Etiketler

Başlıklar Bir sayfadaki yazının başlıklarını standart şekilde tutmak için HTML bak lanılır. Başlıklar 1 ve 6 arası değerler alır.

Kod 9.2: HTML Baş

şlıkları ul

lık Etiketleri

<html> <head> <title>Başlık E</h

<h1>Bu başlık H1 tag'i ile o <h2>Bu başlık H2 tag'i ile oluştu</h2> <h3>Bu başlık H3 tag'i ile oluştu</h3> <h5>Bu b <h6>Bu başlık H6 </body> </

Paragraf ve Sat<p>... </p>bildirmek için <br> etiketi kullanılır.

tiketleri</title> ead>

<body> <h1>html başlıkları</h1>

luştu</h1>

<h4>Bu başlık H4 tag'i ile oluştu</h4> aşlık H5 tag'i ile oluştu</h5>

tag'i ile oluştu</h6>

html>

ır Sonu etiketleri arasında paragraflar tanımlanır. Paragrafta, satır sonunu

Page 568: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

236 Modül 9: Web Programlamaya Giriş

Sayfalara Bağlantı Vermek Birden fazla sayfayı birbirine bağlam Bir sayfada başka bir sayfaya ba• <a> etike• <a ifadesinden so

• > karakt ile <a>

Kod 9.3: Sayf ı Verme

ak için sayfa bağlantıları kullanılır.

ğlantı verebilmek için ti yazılır,

nra 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.)

eri etiketi sonlanır. Bağlantının açılması için tıklanması gereken metin girilir.

• Ve metin bitimine </a> etiketi yerleştirilir.

a içinde Bağlant k

<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.

l> etiketleri a

r liste

Sırasız ve sıralı listeler oluşturulabilir. Sırasız listeler, <ul>...</uar sında oluşturulur. Her bir liste nesnesi için <li> etiketi kullanılır. Sı alı listeler, <ol>...</ol> etiketleri arasında oluşturulur. Her bir nesnesi için <li> etiketi kullanılır.

Kod 9.4: Liste Oluşturmak

<h4> Sıralı liste</h4> <ol> <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 oluşturulabilietike

<li>nesne 1

programcı tarafından tanımlı listeler r. <dl>...</dl> etiketleri arasında listelenecek metinler girilir. Bu

tler arasına, başlığı tutan <dt> etiketi ve başlık altında görüntülenecek metini tutan <dd> etiketi yerleştirilir.

Page 569: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 237

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şl1' <dt> Başlık 2: <dd> Başlık 2'ye ait açBaşlık 2'ye ait açıklama bu par

NOT: Listeleme ifadeleri iç içe kullan

Resim GörüntHTM src

attrib enecek resmin adresi

ık e ait açıklama bu paragrafta girilir.

ıklama bu paragrafta girilir. agrafta girilir.

</dl>

ılabilir.

üleme L sayfalarında resim görüntülemek için <img> etiketi kullanılır. ute değeri, görüntül ni tutar.

Kod 9.6’da <img> kullanımı gösterilmektedir.

Kod 9.6: Resim Görüntülemek

<a hre am.com"> <img im1.jpg"> </a>

tur.

sütünlardan oluşan yapılara tablo denir. Bir Web sayfası içerisinde, ü belirli sınırlarda tutmak için tablolardan yararlanılır.

ble>...</table> etiketleri ile tablonun başlangıç ve bitiş alanı bildirilir. Bu etiketler arasındaki, <tr> satırları, <td> ise sütunları temsil eder. Tablonun

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 .7 olu

f="http://www.bilgead src="c:\resimler\res

img etiketinin sonlandırma ifadesi yok

Tablolar Satır vegörünüm <ta

align , border,

9 : 4x3 Boyutlarında Tablo şturmak

<ta e border="2" bgcolor="#6633CC" ali = <tr> < /td> < 2. sütun </td> < sütun </td> </tr> <tr> < satır 1. sütun </td> <td>2. satır 2. sütun </td> <td>2. satır 3. sütun </td> </tr> <tr>

bl width="140" gn "left">

td>1. satır 1. sütun<td>1. satır td>1. satır 3.

td>2.

Page 570: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

238 Modül 9: Web Programlamaya Giriş

<td>3. satır 1. sütun </td> <td>3. satır 2. sütun </td>

r </tr> <tr> <td>4. satır 1. sütun </td> <td>4. satır 2. sütun </td>

r 3. sütun </td>

</tab

Konu 3: ript Nedi

<td>3. satı 3. sütun </td>

<td>4. satı </tr>

le>

Sc r?

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.

Page 571: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 239

JavaScript

Ja aScript dili, Netscape firması tarafından oluşturulmuştur. Yazolarak C dili esas alınarak tasarlanmıştır. Amaç olarak HTMyerlere script’ler ile ddinamik bir yapı kazandıran JavaScript, istemci tarafında çalışır. giderek yaygınlaşan JavaScript,Explorer web tarayıcta Jav<script>...</script> etiketleri arasında yazılmalBu

Birden fazla satır yorum satırı yapılacaksa, satırların ba

e ifadeleri yerleştirilir.

2. satı

erans gönde

v ım biçimi L’in yetmediği

estek vermesi düşünülmüştir. Web programcılığına Kullanımı

daha sonra Microsoft firmasının Internet ısında da kullanılabillir hale geldi. Günümüzde tüm

rayıcıların desteklediği bir script dilidir.

aScript kodları yazmak için Notepad gibi bir metin editörü yeterlidir. Kodlar ıdır.

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.

şladığı yere /*, bittiği yer */

/* yoruma alınan 1. satır r

...

*/

JavaScript kodları HTML sayfaları içine <head> etiketlerine gömülü olarak veya .js uzantılı dosyalara ref rilerek HTML içinden çağrılabilir.

Page 572: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

240 Modül 9: Web Programlamaya Giriş

JavaScrip eler, n an olaylar ve ra ilişkin esneyi 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

yapılarına, nksiyon, nesne ve olay kavramlarına sahiptir.

t dilinde nesn esnelere uygulan olaylagörevler vardır. Bir n

bilgi alma, ekrana çıktı verme işlemlerine, koşul ve döngü fo

Kod 9.8: Örnek JavaScript

<html> <head><title>onCli <script language="ja function merhaba() { alert ("beni tikladiniz"); } </script> </head> <body> <input type="butto on

</body> </html>

script etiketinin attribute değeri ile kullanılacak script dili belirtili

Kod 9.9: Örnek JavaScript

ck</title> vascript">

n" name="tikla" value="tikla" Click=merhaba()>

language r. Javascript kullanılması için burada language=”javascript” bildirimi yapılır.

<html> <head> <title>JavaScript Örneği</title>

<body> <br

Bu yazı yin </body>

Buradaki i head etiketle arasında bir fonksiyon olarak değil, da satır ha

oluşturulur. Tür bilgiSayısal değerler v

ldiğinde is

</head>

> Bu yazı html ile yazıldı.

<br> <script language="JavaScript"> document.write("İşte bu ise JavaScript ile yazıldı!") </script> <br>

e HTML ile yazıldı.

</html>

script ifades ri

body etiketleri arasın linde kullanılmıştır.

Değişkenler var anahtar sözcüğü ile yeni bir değişken si saklanmaz.

erildiğinde işlem yapma yeteneğine sahip olurlar. Çift tırnak içerisinde değer veri e metin ifadesi olarak anlaşılır.

Page 573: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 241

Dikkat edilmesi gereken nokta küçük – duyarlı ı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 u nedenle her değişken ad önünde bulundurularak

verilmel var deger1; var deger2=20; var deger3=30; var ay=”Mayıs”; var 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,

in ifadeleri rleş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

llanılabilir. Bunlara ek olarak C dilinden gelen koşul operatörleri kullanılabilir. n kullanımı

ştir.

oşul ifadesi] ? koşul_doğru_ise : koşul_yanlış_ise

değişkenlerin büyük harf olmas

edilir. B ı bu durum gözidir.

tarih isimli değişkende, ay ve yil değişkenlerinden gelen metbi

kuBir if deyiminin tek satırda yazılmış haline benzeyen bu operatörükod 3.1.1’de gösterilmiGenel kullanım biçimi ise [k

şeklindedir.

Kod 9.10: Koşul Operatörünün Kullanımı

var a=5; vavar c=14; var d=23; var e;

r b=7;

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

Page 574: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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. etik Operatörler

Visual Basic .NET aritmetik operatörlerinden farklı olan ++ ve -- operatörleri, C dili operatörlerindendir. D bir arttırma veya bir azaltma yeteneğine sahiptir. Prefix (değişken isminin önünde) ve subfix (değişken isminin

kasında) olmak üzere iki kullanım şekli vardır.

De 1 de gösterilmektedir.

Kod 9.11: Prefix ++ operatörü

1: Aritm

eğişkeni

ar

ğişkenin prefix kullanımı kod 9.1

var x = 5; // x değişkeni bir arttırılır ve ekrana 6

değeri yazılır document.write(++x);

Page 575: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 243

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.

Page 576: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

doğru olması durumunda true değerini döndürür.

verilen ifadelerden en az birinin

!

Not operatörü: Koşulun yanlış olması durumunda true değeriniverir.

rünün karşılığı && operatörüdür. Or erin değili anlamına

len Not operatörünü karşılığı ise ! operatörüdür.

rme nıcıdan bilgi almak için formların dışında promt komutu

t komutu ile kullanıcıdan bilgi alırken ayrı bir pencere açılır.

ıdan değer almak

Tablo 9.3: Mantıksal Operatörler

Visual Basic .NET programlamada And operatö

operatörünün karşılığı ise || operatörüdür. Bir değge

Klavyeden Bilgi Alma ve Ekrana Çıktı VeJavaScript dilinde kullakullanılır. prom prompt(“soru”, “cevap için rehber ifade”);

Kod 9.13: Prompt ile kullanıc

var sehir; sehir=pro“İstanbul içi

JavaScript dilinde HTML sayfasına yaz documentaçıklama”, degisken);

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

mpt(“Yaşadığınız şehrin trafik kodunu giriniz”, n 34, Ankara için 6 gibi”);

ı yazdırmak için write komutu kullanılır.

.write(“Yazılmak istenen değişkene ilişkin

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.

ği alan

Page 577: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 245

Koşul n doğru olması halinde yapılacak işlemler bir satırdan fazla yer tutuyorsa, bu satırlar {} parantezleri ile gruplanır. Visual Basic .NET dgibi End if ifadesi kullanılmaz. if (koşul) { //koşul doğru ise

{ //koşul yanlış ise }

Tekrarlanan belirli bir işlemi yaptırmak için kullanılan döngüldilindeki kullanım for döngüsünün genel kullanım biçimi; fo{ //yapılacak i}

şeklindedir.

Kod 9.14: For Döngüsünün Kullanımı

uilindeki

} else

erin JavaScript ı tamamen C dilinin yapısına göre tasarlanmıştır.

r(başlangıç_değeri; döngü_ifadesi; değişecek_değişken_adı)

şlemler

var a; var b = 10; for (a = 1; a <= b document.write(}

while döngüsününwhile ( döngü_koşul_ifade{ //şart doğruysa yapılacak i} //şart doğru değilse yapılacak işlemler

Visual Basic .NET dilidilinde switch-case ifadesi vardır. Genel kullanımı: switch (parametre) { case “ifade1”: // ifade1 koşulu doğru is break; //break ile diğer koşulların da çalış //engellenir ve döngüden çıkılır. case “ifade //ifade2 ko break; }

; a++) { a , “. sayı”, “<br>”);

yapısı si )

şlemler

ndeki Select Case döngüsüne karşılık olarak JavaScript

e yapılması istenenler ması

2:” şulu doğru ise yapılması istenenler

Fonksiyonlar JavaScript dilinde, kodların yeniden kullanılabilmesi için kullanılır. Genel kullanımı:

Page 578: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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)

sonuc= deger1+deger2; urn sonuc;

onuna gönderilen d r1 ve deger2 değişkenleri toplanarak, n içinde şturulan sonuc ğişkenine atanır. return sonuc; ifadesi fonksiyonunda elde edilen uç geri döndürülür.

cript N sneleriJavaScript 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.

{ var ret}

Topla fonksiy ege

fonksiyo olu deile topla son

JavaS e

Ö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

görüntülenmesini Durum çubuğunun

sağlar.

Page 579: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 247

Scrollbars Kaydırma çubuklarının görüntülenmesini sağlar.

Resizable Penceresinin ağlar. boyutlandırılmasını s

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 klığı

verir. pencere arasındaki uza

Top Ekranın üst noktasına ile klığı pencere arasındaki uza

verir.

Tablo 9.4: Pencere Öze

Kod 9.16: Yeni bir pencere açma

llikleri

window.open("http://www.bilgeadam.com", "bilgeadam" , "menubar=no, toolbar=no, scrollbawidth=300, heigt=300";)

Internet tarayıcısı ile daha önce ziyaret edilmiş sayfalara tekrawindow.history.go(-1) komutu kullangidilir. Sayı arttırılarak daha önceki sayfalara da gidilebilir. Internet tarayıcısının en alt kısmında bwindow.status komutu kullanılır. window.status =”JavaScript öğreniyoruz!”;

Navigator (tarayıcı) Nesnesi JavaScript, tarayıcıları da bir nesne olarak değerlendirir. Kullanıctarayıcısına ilişkin bilgileri almak için tablo 3.1.5’te belirkullanılabilir.

Değişken İsmi

rs=yes, location=yes,

r ulaşabilmek için ılabilir. -1 ifadesi ile bir önceki sayfaya

ulunan status penceresine erişmek için

ının tilen değişkenler

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>

Page 580: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

248 Modül 9: Web Programlamaya Giriş

<head> <title>Browser'ımızı tanıyalım</title> <METAcontent=text/html;CHARSET=iso-8859-9 http-equiv=Content-Type> <script language="Javascript"> function Tarayici() { var browseradi=" "; browseradi +="Brows browseradi +="Surumu:"+navigator.appVersion +"\r“ ; browseradi +="Kodadi:"+navigator.ap browseradi +="Useragent:"+nav alert(browseradi} </script> </head> <body onLoad="Taray</html>

Olaylar

olay denir. Bu olaylar ise onSubmit,onReset, onChange, o

on

onClick Inteüzerinde bir nesnenin fare ile tıklanıp bırakılmaolaydır. Link, button ve resim nesneleri tıklanarak onClickNesnelerin etbildirilmelidir.

Kod 9.18: onClick Olayı

er:"+navigator.appName +"\r“ ;

pCodeName+"\r“ ; igator.userAgent+"\r“ ;

);

ici()"></body>

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

onClick, onMuoseOver, onMouseOut,

nLoad, onUnLoad, onError, onAbort,

Focus, onBlur olarak belirtilebilir.

rnet sitelerinin çoğunda en sık kullanılan JavaScript olayıdır. Sayfa sı sonucunda gerçekleşen

olayı tetiklenebilir. iketlerinde ise onClick olaylarını tetikleyen fonksiyonların ismi

fu{ 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şmesaj kutusu çıkar. Ayrıca onDblCl

onMouseOver, onMouseOut Fare nesnenin üzerindeyken onMouseOver, fare nesne üzerinden ayronMouseOut olayları devreye girer.

nction tikla()

kilendirilen tikla fonksiyonu devreye girer. alert komutu ile ekrana bir

ick, çift tıklanma olayını tetikler.

ılınca

Page 581: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 249

Kod 9.19: onMouseOver ve onMouseOut Olayı

function nesneUzerinde() { window.status="Şu anda} function nesneDisinda() { window.status="nesnenin dışına çıktını} <a href="htt onMouseOver = nesneUzerinde() onMouseOut = </a>

onSubmit Wdurumlarında onSubmit devreye girer. Gönderilecek forma girilen verileriuygunluğunun kontrolü bu

Kod 9.20: onSubmit Olayı

nesne üzerindesiniz.";

z." ;

p://www.google.com"

nesneDisinda()> Google

eb safyalarında ziyaretçinin forma bilgi girip sunucuya göndermesi n

olayın tetiklediği fonksiyonlara yaptırılabilir.

function dogrula()

confirm } <form action="mail.pl" method="post" onSubmit="dogrula()">

confirm komutu, kullanıcıya Ok ve Cancel butonlarıpenceresi açar.

onReset Form içinde kullanılan tüm metin alanlarının temizlenmesini saformda yanlışlık olduğunda bu olay tetiklenir. Kullanıcıya onayçıkartmak için de kullanılabilir.

Kod 9.21: onReset Olayı

{ (‘Formu doldurduysanız OK'i tıklayınız');

ndan oluşan bir diyalog

ğlar. Doldurulan penceresi

function sil() { return confirm('} <form onReset="return sil()"> <input type="text" name="mail"> <input type="reset" value="s</form>

onChange Bilgi girişi yapılan alantetiklenir.

Silmek istediginize emin misiniz?');

il">

larda, değişikliğin gerçekleştiği bilgisi onChange olayı ile

Page 582: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

250 Modül 9: Web Programlamaya Giriş

Kod 9.22: onChange Olayı

function deg{ aler

Kod 9.23

isti()

t(‘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.

: onLoad ve onUnLoad Olayı

function giris() { alert(“Sayfaya Giriş Yaptınız!"); } function cikis()

sneler, çeşitli nedenlerden dolayı tam olarak emiş olabilir. Genellikle resim nesnelerinin yüklenmesinde problem

bildirmek için onError veya onAbort

{ alert("Sayfadan çıktınız.."); } <body onLoad="giris()" onUnload="cikis()"> </body>

onError, onAbort Ziyaret edilen sayfadaki neyüklenemçıkabilir. Bu tür durumları ziyaretçiye olayları kullanılır.

Kod 9.24: onError ve onAbort Olayı

<img src="resim.gif" onError="alert(‘Reyüklenemedi')">

onFocus, onBlur onFo us olayı kullanıcı kontrollerine giriş yapılırken gerçekleşir. OnBlur olayise ve kullanıcı kontrollerinden çıkış yapılırken gerçe

Kod 9.25: onFocus ve onBlur Olayı

sim dosyası

c ı kleşir.

function dogru() {

Page 583: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 251

document.form1.mesaj.value="Lütfen hata yapm} function sor() { document.form1.mesa} <form name="form1" method=" <p><h3>Lütfen isminizi yazınız!</h3></p> <input type="text" size="20" name="isim" onfocus="dogru()" onblur="so <p> <input type="text" name="me</form>

cript VbScript , Microsoft tarafından gelitarafından desteklenmez. Bu nedenle tüm tarayıcılarda çalışacak syazılmak isteniyorsa, JavaScript kullanılm Vbscript dilinin kullanılabilmesi için script etiketi içerisindeki laözniteliğine vbscript değeri atanır. <script language="vbscript">...</script>

Kod 9.26: İlk VbScript Örneği

ayın!";

j.value="isminiz alındı";

post">

r()">

saj"></p>

VbS

ştirilmiştir. Ancak, VbScript tüm tarayıcılar cript

alıdır.

nguage

<html> <body> <script language="vbscript"> document.write("İlk VBScript!") </script> </body> </html>

Değişken tanımlamaları dim anahtar sö

Kod 9.27: Değişken tanımalaması

zcüğü ile yapılır.

<html> <body> <script langu dim isim isim="Bilge Adam" document.write(isim) </script> </body> </html>

Metot tanımlam

age=”vbscript">

ası 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.

Page 584: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

252 Modül 9: Web Programlamaya Giriş

Kod 9.28: Sub Tanımlaması

<html> <sc guage="vbscripsub mySub() msgbox(" rocedure") end sub <</head> <body> <script language=”vbscript"> call mySub() </script>

ş değeri taşımaz.</p> body>

ction Tanımlaması

<head> ript lan t">

sub p

/script>

<p> sub procedure geri dönü</</html>

Kod 9.29: Fun

<html> <head> <script language=”vbscript"> function sehir() end function </script> </head> <body> <script language=“vbscript"> document.write("En sevdi </script> <p> function procedure geri dönüş </body> </html>

Koşul ve döngü ya

sehir = "Trabzon"

ğim sehir: " & sehir())

değerine sahiptir.</p>

pılarının kullanımı Visual Basic .NET dilindeki gibidir.

Page 585: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 253

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:

kullanılabilir. Örneğin paragraf etiketine ” attribute değeri eklenebilir. Ve o paragrafa özel tasarım özellikleri

yazılar

ed)

Head

Style>..</Style> etiketleri kullanılmalıdır.

• Inline (iç) • Embedded (gömülü) • Linked (bağlantılı) İç (Inline)

Herhangi bir HTML etiketi içinde stil style=”x

bildirilebilir. <p style=”font: 12pt arial”> Bu paragraftaki tüm arial 12 stilidedir.</p>

Gömülü (Embedd

Gömülü stiller, HTML sayfasının etiketi içerinde tanımlanır. Bu stilleri tanımlamak için <

Page 586: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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ü tabağlantılı stil dosyalarındadır. Tasarım özelliklesayfa içinden bu stil dosyasına bağlantı vuygulanır. HTML sayfalarda stil dosyası ile bağlantı kurmak için aşağıdakyapılır. Bu tanımlama head etiketleri içerisinde <link rel=stylesheet href=”stil.css” t

e Sheet’lerin Söz Dizimi Slide12 Stil nesnelerinin söz dizimi, HTML söz nesnelerinin belirli kısımları vardır: • Seçici (Selector): Atanılan özellikler ve de

etiketlerine benzerler. • Özellik (Property): Bir seçiciyi tanımlar. P paragraf etiketine verilen

özellikler o seçiciyi tanımlar. Kenar birer özellik öğesid

• Değer (Value): Özellikleri tanımlayan öğelerdir. Özellikler ve değerler birloluşturur. Sayfa düzeedilerek ha

sarım özelliği ri bu dosyada tanımlanır ve her

erilerek etiketlere gerekli stiller

i tanımlama yapılır.

ype=”text/css”>

Styl

dizimine benzer yapıdadır. Stil

ğerleri alır. H1 ve P gibi HTML

boşlukları, font ve arka plan değerleri ir.

eşerek bir tanım oluşturur. Seçici ve tanım ise bir kural ni ,kenar boşlukları, girinti ve hizalama değerleri kontrol

zı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.

Page 587: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 255

Özellik ve Değer Açıklama

Marg ft Sol kenar boşluğunu belirlemek için kullanılır. Punto, inç, cm ve piksel cinsinden değer verilir.

{margin-left: 10px;}

in-le

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

Body { margin- eft: 10px; margin-right: 10px; mamargin- ottom:15px; }

Font özellik ve değerleri tablo 9.7’de belirtilmi

ğerleri

l

rgin-top: 20px; b

ş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

italic;

e Değer

Tablo 9.7: Font özellik ve değerleri

p { font-size: 20; color: blue;font-weight: bold; font-style: font-family: Times New Roman; }

Liste özellikleri ve değerleri tablo 4.3’te belirtilmiştir.

Özellik v 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

Page 588: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

256 Modül 9: Web Programlamaya Giriş

alpha koyar.

none Liste elemanları için bir sembol almaz.

list-style-image

Liste imleri yerine resim kullanır.

list-style-position

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

background-color

Arka plan renk değerini tutar.

background-image

Arka plan resminin yol bilgisini tutar.

background-repeat

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

background-position

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 ö e 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}

zellikler eklem

Page 589: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 257

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; font-family: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 tensin. 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

lmelidir.

ılmak is

dikkat edi

Page 590: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

258 Modül 9: Web Programlamaya Giriş

Modül Öz

26.

eti

HTML nedir? En sık kullanılan HTML etiketlerini açıklayın. 27. Script Nedir? 28. Java Script nedir? Java Script niçin kullanılır? 29. CSS nedir? 30. CSS, Html sayfalara nasıl dahil edilebilir?

Page 591: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 259

Lab 1: Web Progra aya Giriş mlam

Bu uygulamada, Java Script .ile sanal klavye yapmasını öğreneceksiniz. Ayrıca Jav e popup pencere oluşturmayı öğreneceksiniz. Bu lab tamamlandıktan sonra:

• Java Script ile Sanal Klavye oluşturabilecek, • ript ile popup pencere oluşturabileceksiniz.

Web uygulaması oluşturmak Bu uygulamada kullanılac et Web Ap tion 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.

San lWebOrnek projesine SanalKlavye isminde yeni bir Html sayfa ekleyin.

a Script il

Java Sc

ak ASP.N plica

21. Enter butonu tıklayın.

a Klavye oluşturmak

Page 592: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

260 Modül 9: Web Programlamaya Giriş

Aşağıdaki ko

cellsp

<td><input type="button" id="bf" onClick="HarfF()" valu onClick="HarfG()" value="G" NAME="bg"></td> <td><input name="button2" type="button" idonClick="HarfH()" value="H"></td> </tr> <tr> <td><input type="button" id="bi" onClick="HarfI()" value="I" NAM <td><input type="button" id="onClick="Ha onClick="HarfK()" value="K" NAME="bk"></td> <td><inponC <td><input typonClick="HarfM()" value="M" <td><input type="button" id="onClick="HarfN()" value="N" NAME="bn"></td <td><input type="button" id="bo" onClick="HarfO()" value="O" NAME="bo"></td> <td><input type="buttoonC

dları <Body>..</Body> etiketlerinin arasına yazarak Html sayfayı tasarlayın. <div id="klavyem">

<table width="200" border="1" cellpadding="0" acing="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>

e="F" NAME="bf"></td> <td><input type="button" id="bg"

="bh"

E="bi"></td> bj"

rfJ()" value="J" NAME="bj"></td> <td><input type="button" id="bk"

ut type="button" id="bl" lick="HarfL()" value="L" NAME="bl"></td>

e="button" id="bm" NAME="bm"></td>

bn" >

n" id="bp" lick="HarfP()" value="P" NAME="bp"></td>

Page 593: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 261

</tr> <tr> <td><input type="button" id="br" onClick="HarfR()" value="R" NAME="br"></td> <td><input type="button" id="bs" onCl rfS()" 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>

>&nbsp;</tdnput na pe="bu

ris" value="Giris Yap ick="hosgeldin()"> &nbsp; <input type="reset" id="temizle" value="Sil"></t </tr> </table> </form>

K ası SanalKlavye Html sayfasının HTML bölümüne aşağıdaki kodları yazın. Bu kod, Java Script taraflı fonksiyonlar ekleme u <Head>..</Head eri arasına ekleyin. <script language="javascript">

function HarfA() { form1.password.value += "A"; } function HarfB() { form1.password.value += "B"; }

ick="Ha

<td > <td><i me="button2" ty tton" id="gi " onCl

name="button2"d>

odların yazılm

ile istemci ktedir. Bu kod> etiketl

Page 594: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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()

ssword.value += "I"; } function HarfJ() { form1.password.value += "J";

tion HarfK() { form1.password.value += "K"; }

n HarfL()

form1.password.value += "L"; } function HarfM() { form1.password.value += "M"; } function HarfN()

= "O";

{ form1.pa

} func

functio{

{ form1.password.value += "N"; } function HarfO() { form1.password.value +} function HarfP() {

Page 595: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 263

} function Ha{

ue += "T";

fun{

form1.password.value += "P"; } function HarfR() { form1.password.value += "R";

rfS()

form1.password.value += "S"; } function HarfT() { form1.password.val} function HarfU() { form1.password.value += "U"; } function HarfV() { form1.password.value += "V"; }

ction 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.

Page 596: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

264 Modül 9: Web Programlamaya Giriş

Aşağıdaki kodlar ody> etiketlerinin arasına yazarak Html sayfayı tasarlayın. <INPUT 1" type="button" onclick="pencereac()" value= " name="Button1">

WebOrnek projesine acilan_pencere isminde yeni bir Html sayfa ekleyin.

ı <Body>..</B

id="Button"Pencere Aç

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">

Page 597: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Konu: 1 265

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,height=300') } </script>

Page 598: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modül 10:

Mod llanıcı Kontrolleri Oluşturmak ül 10: Ku

Web uygulamaları geliştirirken, her sayfada görüntülenecek sabigerekebilir. Bu panelle

t paneller ri her sayfa için tekrar oluşturmak zaman ve performans

Page 599: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 10: 267

kaybına yol aoluşturulup, proje içinde birçok yerde kulla Bu modül tamaml

• Kullanı• Kullanıcı kontrolü oluşturabilecek, •

çar. Bu paneller, User Controls (kullanıcı kontrolleri) biçminde nılabilir.

andıktan sonra : cı kontrollerin yapısını öğrenecek,

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. Ördolaşımı sağlayan menü paneli, kullanıcı kontrolü haline g Web kontrollerinde olduğu gibi kullanıcı kontrolleri de sunucu t Kullanıcı kontrolleri System.Web.UI.UserControl sınıfından türetilmiştir

anıcı Kontrolünün Avantajları • Kullanıcı ko

kullanıldıkları Web formları ile olkaldırır.

• Kullanıcı kontroözellik veya metot için isim çakışması söz konusu değildir.

neğin sayfalar arası etirilebilir.

arafında çalışır.

.

Kullntrolleri, ayrı bir namespace içinde tanımlanır. Bu durum

uşabilecek isim çakışmasını ortadan

lleri, aynı sayfa içinde birden fazla kullanılabilir. Hiçbir

Page 600: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

268 Modül 10: Kullanıcı Kontrolleri Oluşturmak

• Kullanıcı kontrolleri ayrı dillerde yazılabilir. Kullanıcı kontrolleri, uygulama içindeki tüm sayfaluygulamalardaki kullanıcı konuyeklenmelidir.

anıcı Kontro

ara eklenebilir. Ancak diğer trolleri sayfalara direk eklenemez. Diğer

gulamalardaki kullanıcı kontrolleri, kullanmadan önce uygulamaya

Kull lü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. Proje3. Açılan penceredeki Add menüsünden

kom

adı üzerinde farenin sağ butonunu tıklayın. Add Web User Control

utunu seçin. 4. Name metin kutusuna kullanıcı kontrolune verilecek ismi girin.

Page 601: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 10: 269

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.

Page 602: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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"/>

Page 603: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 10: 271

Ö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>

Page 604: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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?

Page 605: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 10: 273

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 HyperLink – btnUyeGiris NavigateUrl UyeGiris.aspx Text tıklayınız

Page 606: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

274 Modül 10: Kullanıcı Kontrolleri Oluşturmak

HyperLink – btnUyeKayit NavigateUrl UyeKayit.aspx Text Üye Kayit LinkButton – btnCikis 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&nbsp;Kitapevi</FONT></P> </TD> </TR> <TR> <TD>&nbsp; <asp:Label id="lblAd" runat="server"></asp:Label>&nbsp;</TD> </TR> <TR> <TD> <P align="center"> <asp:HyperLink id="btnAnaSayfa" runat="server" NavigateUrl="Default.aspx">AnaSayfa</asp:HyperLink>&nbsp;| <asp:HyperLink id="btnUyeGiris" runat="server" NavigateUrl="UyeGiris.aspx">Üye Giriş</asp:HyperLink>&nbsp;| <asp:HyperLink id="btnUyeKayit" runat="server" NavigateUrl="UyeKayit.aspx">Üye Kayit</asp:HyperLink>&nbsp;&nbsp;&nbsp; &nbsp; <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") != "") {

Page 607: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 10: 275

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 Değer

HyperLink – Link1 NavigateUrl Text AnaSayfamYap HyperLink – Link2 NavigateUrl Text SikKullanilanlaraEkle HyperLink – Link3 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>&nbsp;| <asp:hyperlink id="Link2" runat="server">SikKullanilanlaraEkle</asp:hyperlink>&nbsp;| <asp:hyperlink id="Link3" runat="server" NavigateUrl="mailto:[email protected]">Iletisim</asp:hyperlink></P>

Page 608: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 609: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 10: 277

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 New Item komutunu seçin. 4- Templates seçeneği içerisinden DataSet öğesini seçin 5- 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.

Page 610: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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 kodları aşağıdaki gibi olacaktır.

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();

Page 611: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 10: 279

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(); } } }

Page 612: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 11:

Page 613: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 11: 281

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.

Page 614: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 615: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 11: 283

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>"

Page 616: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 617: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 11: 285

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>

Page 618: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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,

Page 619: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 11: 287

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

Page 620: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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>

Page 621: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 11: 289

<asp:Label id="Label2" runat="server" Width="65px" Font-Bold="True">Yazar</asp:Label> </HeaderTemplate> <FooterTemplate> <asp:Label id="Label3" runat="server" Font- Bold="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 properties penceresindeki görünüme ilişkin pek çok özellik sunulmuştur. 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.

Page 622: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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">

Page 623: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 11: 291

</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

Page 624: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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ı

BoundColumn ile sadece görüntülenmesi istenen kolonları DataGrid kontrolüne eklenir.

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.

Page 625: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 11: 293

İ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(); }

Page 626: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

Page 627: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 11: 295

ü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");

Page 628: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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>

Page 629: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 11: 297

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;

Page 630: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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

Page 631: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 11: 299

• 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 satır düzenlenebilir. Düzenlemenin veritabanı geçmesi ayrı işlemler gerektirir. 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

Page 632: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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();

Page 633: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 11: 301

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"

Page 634: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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;

Page 635: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 11: 303

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.

Page 636: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 637: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 11: 305

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” %>

Page 638: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

306 Modül 11:

Modül Özeti

34. Veri bağlantı kontrolleri nelerdir? Açıklayın 35. Repeater niçin kullanılır? Açıklayın 36. DataList niçin kullanılır? Açıklayın 37. DataGrid niçin kullanılır? Açıklayın 38. DataGrid ile sayfalama nasıl yapılır?

Page 639: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 11: 307

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, DataGrid ve DataList

kontrollerinei bağlayabileceksiniz.

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");

Page 640: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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;

Page 641: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 11: 309

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 Özellik Değer

Label – lblKitapAdi

Page 642: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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>

Page 643: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 11: 311

</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>&nbsp; <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>

Page 644: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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) {

Page 645: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 11: 313

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.

Page 646: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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">

Page 647: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 11: 315

<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 Font-Bold="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> &nbsp; </form> </body> </HTML>

Page 648: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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();

Page 649: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 11: 317

} } } }

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">

Page 650: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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>

Page 651: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 11: 319

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(); } } }

Page 652: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

320 Modül 11:

Page 653: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 654: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 655: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 12: 323

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.

Page 656: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 657: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 12: 325

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.

Page 658: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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" />

SessionState ‘in varsayılan attribute değerleri Visual Studio.NET tarafından atanmıştır. 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ı

Page 659: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 12: 327

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");

Page 660: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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ı)

Page 661: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 12: 329

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.

Page 662: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 663: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 12: 331

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

Page 664: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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.

Page 665: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 12: 333

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ı

Page 666: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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?

Page 667: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 12: 335

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";

Page 668: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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"; } }

Page 669: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

Modul 12: 337

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

Page 670: C# Yazilim Uzmani - Bilge Adam 670 Sayfa

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"); }