Вы находитесь на странице: 1из 283

YAZILIM UZMANLII

Uygulamal Yazlm Projeleri

Okan Tekeli

Editr C. Banu ncolu


Uygulamal Yazlm Projeleri
Okan Tekeli

Editr: C. Banu ncolu

Kapak Tasarm: Melih Sancar

Grafik Tasarm: Tuna Erkan

Grafik Uygulama: Soner Ik

Genel Yayn Ynetmeni: Mehmet mleki

1. Basm: ubat 2008

Rev: 00

Bilge Adam Yaynlar: 22

Eitim Yaynlar Dizisi:22

ISBN: 978-605-5987-20-6

Copyright 2007, Bilge Adam Bilgisayar ve Eitim Hizmetleri San. ve Tic. A..

Eserin tm yayn haklar Bilge Adam Bilgisayar ve Eitim Hizmetleri San. ve Tic. A..ye aittir. Yaynevinden yazl izin
alnmadan ksmen ya da tamamen alnt yaplamaz, hibir ekilde kopya edilemez, oaltlamaz ve tekrar yaymlanamaz.
Bilge Adamn rencilerine cretsiz armaandr, para ile satlamaz.

Bilge Adam Bilgisayar ve Eitim Hizmetleri San. ve Tic. A..


19 Mays Mahallesi, 19 Mays Caddesi, UBM Plaza, No: 59-61, Kat: 4-7; ili, stanbul
Telefon: (212) 272 76 00 (212) 217 05 55 Faks: (212) 272 76 01
www.bilgeadam.com - info@bilgeadam.com
indekiler
Proje 1: herkesburada.com 3

Grmeler3

Ahmet Becerikli (Proje Sahibi)3

Uygulama Analizi3

Uygulama Tasarm4

Veritaban Tasarm4

Arayz Tasarm5

Proje 2: Otobs Otomasyonu 107

Genel Bak107

Grmeler107

zgr Koluksa (Genel Mdr)107

Seluk Huysuz (Mteri Hizmetleri Mdr)107

Baki okbilmi (Personel Sorumlusu)107

Vildan Parasever (Muhasebe Sorumlusu)108

Uygulama Tasarm108

Veritaban Tasarm108

Arayz Tasarm122

Uygulama166

Proje 3: DVDDukkani.com169

Grmeler169

Hsamettin Beceriksiz (Proje Sahibi)169

Uygulama Tasarm169

Veritaban Tasarm169

Arayz Tasarm172

Ek - A: Teknik Terimler Szl237


nsz
Yazlan bu proje kitab, eitiminiz boyunca greceiniz konularn toplu bir ekilde uygulamalarn
yapabileceiniz, size temel konularda pratik kazandrmay hedefleyen, yol gsteren projelerden
oluuyor. Amacmz sizi oyuna hazr birer oyuncu olarak karmak. Bu kitaptaki projeler ierisinde
bir projeye balanaca zaman Nereden balamal, nasl ilerlemeli? sorularna cevap bulacak-
snz.

Elinizdeki bu projeler derste ilenmeyecek, konu bitiminde sizlere tan altna elinizi koymanz iin
yol gsterecek. Proje kitab temelde eitim odakl ilerlemekte, verilen senaryolara destek amal
yazld. lgili konu bittii zaman projeyi adm adm takip ederek tamamlamanz, kitapta yazlmayp
sizden yapmanz istenen blmleri yapmanz, verilen uyar ve ipularn kullanmanz sizlere proje
yapmakta pratik kazandracak.Yaplan bu projeler ile birlikte, sizlere verilen rnek senaryolar
tamamlamanz, bir proje ierisindeki sorunlar zmenizde ve resmi daha en bandan grebil-
menizde byk katk salayacaktr. Kitaptaki projeleri tamamladktan sonra rnek senaryolar
bitirmeniz, eitiminiz sonunda sizlere i hayatna hazr birer yazlm uzman olma yolunda byk
katk salayacaktr.

Umarm sizler iin yararl bir alma olur. yi almalar.

Okan Tekeli
1 Proje 1:
herkesburada.com
1 Proje 1:
herkesburada.com
Grmeler

Uygulama Tasarm
Proje 1: herkesburada.com
Grmeler
Ahmet Becerikli (Proje Sahibi)
Yapmak istediimiz web uygulamas sayesinde yelerimizin site zerinden arkadalklar kurma-
larn, birbirlerinin albmlerini grebilmelelerini ve mesaj atmalarn istiyoruz. u andaki mevcut
internet sitelerindeki ye kayt sayfalar kullanclardan detayl bilgiler istiyor fakat bizim sitemize
ye olurken sadece kullancnn e-posta, ifre bilgisi ve rumuz girip ye olsun daha sonradan
kendi profil bilgilerini dzenlesin. Sitemizde her sayfaya ancak ye olan kullanc eriebilir, ye
olmayan kullancnn herhangi bir ilem yapmasn istemiyoruz.

ye profili olarak ise Tablo 1.1de verilen bilgileri girmesini istiyoruz.

Tablo 1.1: Mteri htiyalar Tablosu


Ad Hakknda
Soyad Rumuz
Doum Tarihi Dinledii Mzik
Cinsiyet Meslek
Eitim Durumu Okuduu Kitaplar
Bulunduu ehir Tuttuu Takm
Bulunduu lke Yapt Spor
Hobileri Sigara er mi
Fobileri Alkol Kullanr m

stediim zaman eitim durumu, ilgi alan, ehir, lke, meslek ve takm tanmlamalarn yapabil-
meliyim. Profil bilgilerini kimlerin grebileceini kullanc belirlesin. sterse herkes grr, isterse
sadece arkadalar grebilir.

yeler kendi profil resimleri haricinde farkl albmler oluturabilsin ama bu albmleri herkes
gremesin, profil grntlemedeki gibi sadece arkadalar veya herkes grebilsin deme imkan
olmal.

yeler birbirlerine zel mesaj atabilsinler. Mesaj atarken eer mesaj ataca ye kullancnn ar-
kada ise kullanc adnn veya kime ksmnn yazlaca yer otomatik tamamlansn, eer arkada
deil ise tamamlanmasn. Burada teklif dediimiz bir sistem olmal. Arkadalk teklifi sonrasnda
iki kullanc arkada olabilecek ve albm, profil gibi bilgilere erimeye balayacak. ou arka-
dalk sitesinde bulunan titreim gnderme ya da iek smarlama gibi uygulamalar istemiyoruz
sadece mesaj gndersin yeter. Kullanclar arkada listelerindeki online arkadalar ile chat yapa-
bilsin istiyoruz. Baz internet sitelerinde kullanclar kendi ana sayfalarn zelletirebiliyor. Bizim
sitemizde de kullanclar sayfalarnda istedikleri blmleri gstersin, istemediklerini gstermesin.
Farkl tema seenekleri olsun. Bir de baz siteler kullanc ilem yaparken ekranda kalyor hi gelip
gitmiyor, tpk Windows uygulamas gibi hemen ilem yapyor, bizim sitemiz de o ekilde olsun.

Uygulamada 2 rol istiyoruz. Bunlardan biri admin dieri ise standart. Admin grubu uygulama ie-
risinde kullanc rol deitirme, ifre resetleme ve ynetmesini istediimiz bilgileri ynetme gibi
ilemleri yapacak. Standart rol ise bildiimiz ye olacak.

Uygulama Analizi
Projeye balamadan nce bir analiz yaplacak olursa;

1. Uygulama rol bazl olacak. Uygulama ierisinde kullanclar istedii yerleri zelletirebilecei
iin web part kullanlacak ve Windows uygulamas gibi hzl tepki verebilmek iin ajax tekno-
lojisi kullanlacak.
 Proje 1

2. Kullanclar aras mesajlama sistemi olacak.


3. Kullanclar sadece onayladklar kullanclar ile mesajlaabilecek
4. Chat uygulamas olacak.
5. Kullanc bazl fotoraf galerisi olacak.
6. Tartma gruplar oluturulabilecek, gerektiinde mesajlar mail atlacak.

Uygulama Tasarm
Veritaban Tasarm
Asp.Net membership alt yaps kullanlaca iin veritaban sunucunuzu an.
HerkesBuradaDb isminde veritaban oluturun.
Balat > Programlar > Visual Studio 2008 > Visual Studio Tools < Visual Studio 2008 Com-
mand Prompt aracn altrn.
Uygulama ksayolu programlar mensnde buluna- Aspnet_regsql komutunu altrn. kan sihir-
myorsa Balat > altr > C:\Program Files\Mic- bazdan HerkesBuradaDb veritaban sein ve ya-
rosoft Visual Studio 9.0\VC\ komutunu yrtn.
plandrn.

ekil 1.1: Membership veritaban oluturmak.

Veritabannn yelik sistemini kullanaca tablolar oluturulduktan sonra HerkesBuradaDb ve-


ritabann an. ekil 1.2 ile ekil 1.9 arasndaki tablolalar aspnet_regsql arac ile oluturulan
membership tablolarna ek olarak oluturun.

ekil 1.2: Sehirler tablosu. ekil 1.3: Takimlar tablosu.

ekil 1.4: Albumler tablosu. ekil 1.5: ArkadasListesi tablosu.


herkesburada.com 

ekil 1.6: EgitimDurumlari tablosu. ekil 1.7: Fotograflar.

Tm tablolardaki primary key stunlarnnn


identity specification Yes yaplmal ve identitty
increment ve seed 1 olarak belirtilmelidir.

ekil 1 8: Mesajlar tablosu. ekil 1.9: Meslekler tablosu.

Oluturulan tablolardaki ilikileri yaplandrn.

Kaynak Tablo Kaynak Stun Hedef Tablo Hedef Stn


Albumler KullaniciId aspnet_Users UserId
ArkadasListesi Kim aspnet_Users UserId
ArkadasListesi Kimin aspnet_Users UserId
Fotograflar AlbumId Albumler AlbumId

Arayz Tasarm
Visual Studio programn an. New > Web Site > ablonunu sein. Proje adn HerkesBuradaWe-
bUI eklinde verin. Dil olarak C# sein. Version olarak ise .Net Framework 3.5 sein.

ekil 1.10 : Yeni web sitesi oluturma ekran.

Uygulama oluturulduktan sonra Solution Explorer penceresinden web.config dosyasn an.


Asp.Net membership altyapsndan yararlanabilmek iin configuration dm ierisinde (sys-
tem.web dm hemen zerine) connectionStrings dm ekleyin. Mevcut ConnectionS-
tring dm silinmeli ve daha sonra aadaki dm eklenmeli (Liste 1.1).
 Proje 1

<connectionStrings>
<clear/>
<add name=LocalSqlServer connectionString=server=.;data
base=HerkesBuradaDb;user id=dbUser;password=123/>
</connectionStrings>

Liste 1.1: Web.config connectionStrings tanmlamas.

Uygulamay yaplandrmak iin Asp.Net Configuration aracn an. Bu arac amak iin Web Site
> Asp.Net Configuration mensn takip edebilirsiniz.

ekil 1.11: Asp.Net Web Administration Application.

Alan Asp.Net Web Application Administration sitesinden security sekmesine gelin. ekil 1.11
haricinde bir kt grnyorsa, hatay okuyarak sorunu giderin. Oluabilecek muhtemel hatalar;

Web.config dosyas ierisinde connection stringin yanl yazlmas ve yazm hatas (; kul-
lanmay unutmak).
Sql Server veritabanna balant kurulamamas.
Balanlmak istenen veritaban sunucusunun almyor olmas.
Sorunsuz balant sadktan sonra sras ile;

1. Security sekmesi altndaki Users blm ierisinden Select authentication type linkine tkla-
yn.
2. From Internet seenei sein. Done butonuna tklayn.
3. Security Sekmesi ierisinden Roles blmnden Enable Roles linkine tklayn.
4. Security Sekmesi ierisinden Roles blmnden Create or Manage roles linkine tklayn.
5. Admin ve Standart olarak 2 adet rol ekleyin.
herkesburada.com 

6. Internet Explorer penceresini kapatp uygulamaya dnn.


7. Uygulamaya geri dnld zaman web.config dosyasnda yaplan deiiklikler yznden
Visual Studio dosya deiiklik uyars verecektir. kan uyarya Yes to All diyerek onaylayn.
8. Solution Explorer penceresinden uygulama zerinde sa tklayn. New Folder mensn ia-
ret edin. Klasr ismini admin olarak verin.
9. Asp.Net Configuration aracn altrn. Solution Expolorer
penceresi zerindeki en sada bulunan ikona tklayarak
aabilirsiniz. (ekil 1.12)
10. Security sekmesinden Access Rules blmnden Create
access rules linkine tklayn.
11. Select a directory for this rule blmden admin klasrn ekil 1.12: Asp.Net Configuration Toolu
sein. Rule applies to blmnden Role radio button kon- altrmak.
troln sein. Karsndaki dropdownlistten Admin sein.
12. Permission blnden Allow seeneini sein ve OK butonuna tklayn.
13. Security sekmesinden Access Rules blmnden Create access rules linkine tklayn.
14. Select a directory for this rule blmden admin klasrn sein Rule applies to blmnden
All users radio button kontroln sein. Permission blnden Deny seeneini sein.
15. OK butonsuna tklayn ve web administration toolu kapatn.
Bu admlar bitirdikten sonra Solution Explorer penceresinden admin klasr zerinde sa tk-
layn, Refresh Folder mensn sein. Klasr ierisinde bir web.config olduu grnecek. Bu
dosyaya izin verilen ve yasaklanan gruplar eklendi.

Bu aamaya kadar uygulama ierisine 2 rol tanmland. Tanmlanan bu rollerden admin rol grubu-
na, uygulama ierisindeki admin klasrne eriimine izin verildi, dier tm kullanclara kapatld.
Bir web uygulamas ierisinde klasre eriim izni verirken ilk nce eriimine izin verilecekleri
(allow) daha sonra yasaklanacak kullanc veya rolleri atayn. lk nce tm kullanclara yasak-
lanrsa, daha sonradan izin verilen kullanclar bile eriemeyecek. Yanl kullanma rnek olarak;

<authorization>
<deny users=* />
<allow roles=Admin />
</authorization>

Liste 1.2: Yanl tanmlanm authorization dm.

Standart olarak membership altyaps ierisinde kullanclarn kullanacaklar ifre format en az 7


karakter olmal ve bunlardan biri alfa numeric karakter (#,@,? gibi.) olmal. Uygulama ierisinde
bu ayar deitirmek iin web.config dosyasnda membership ayarlarn kendiniz belirleyin. Web.
config dosyasna system.web dm ierisine Liste 1.3deki kodu ekleyin.

<membership>
<providers>
<clear/>
<add name=AspNetSqlMembershipProvider
type=System.Web.Security.SqlMembershipProvider, System.
Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d
50a3a
connectionStringName=LocalSqlServer
 Proje 1

enablePasswordRetrieval=false
enablePasswordReset=true
requiresQuestionAndAnswer=true
applicationName=/
requiresUniqueEmail=false
passwordFormat=Hashed
maxInvalidPasswordAttempts=5
minRequiredPasswordLength=5
minRequiredNonalphanumericCharacters=0
passwordAttemptWindow=10
passwordStrengthRegularExpression= />
</providers>
</membership>

Liste 1.3: Web.config dosyasnda ezilmi membership bilgileri.

Bu ayardan sonra web uygulamas iin ifre uzunluu en az 5 karakter olacak ve alfa numeric ka-
rakter zorunluluu olmayacak. Web uygulanmasnn admin rolne sahip kullancsn tanmlamak
iin Asp.Net Configuration aracn altrarak security sekmesinden Users blm ierisindeki
Create User linkine tklayn. Admin kullanc isminde bir kullanc tanmlayn.
Admin kullancs olu- Kullanc bilgilerini tutmak iin (Ad, Soyad, Doum Tarihi) profile kullann.
turulurken Admin rol
seili olmal.
Profile tanmlamas iin web.config ierisinde profile dmn ezin.
Mterinin istedii kullanc bilgilerini tanmlayn.

<profile>
<properties>
<group name=KisiselBilgiler>
<add name=Ad type=System.String/>
<add name=Soyad type=System.String/>
<add name=DogumTarihi type=System.
DateTime/>
<add name=Cinsiyet type=System.
Boolean/>
<add name=YasadigiSehirId
type=System.String/>
</group>
<add name=EgitimDurumId type=System.
String/>
<add name=Hobileri type=System.String/>
<add name=Fobileri type=System.String/>
<add name=Hakkinda type=System.String/>
<add name=MeslekId type=System.String/>
<add name=OkuduguKitaplar type=System.
String/>
<add name=TuttuguTakimId type=System.
String/>
herkesburada.com 

<add name=YaptigiSporlar type=System.


String/>
<add name=SigaraKullanirMi type=System.
Boolean/>
<add name=AlkolKullanirMi type=System.
Boolean/>
<add name=ProfilYetki type=System.Boolean
defaultValue=true/>
<add name=ProfilResmi type=System.String
defaultValue=resimyok.jpg/>
</properties>
Profile dm
</profile> System.Web ie-
risinde yer alr.
Liste 1.4: web.config profile tanmlamas.

Gvenlik iin web.config dosyasnda kullanlacak authentication tanmlamasn yapn. Standart


olarak web.config ierisinde bu dm bulunur. Authentication dmn Liste 1.5teki ekilde
yaplandrn.

<authentication mode=Forms>
<forms defaultUrl=~/kullanici/default.aspx></
forms>
</authentication>

Liste 1.5: web.config authentication dm.

Uygulama ierisinde theme dndaki stilleri tanmlamak iin Style isminde bir klasr oluturun ve
iine Genel.css isminde stylesheet ekleyin. Eklenen dosyann ieriini temizleyin. Eklenen bu stil
belgesi ierisine Liste 1.6da belirtilen stili tanmlayn.

*
{
font-family: Tahoma, Arial, Helvetica;
}

#SayfaAna
{
width: 70%;
text-align: left;
border: 1px solid #89a5e0;
border-top: none;
}

.AnaIcerik
{
width:100%;
height:100%;
text-align:left;
10 Proje 1

}
#Menu
{
background-color: #89a5e0;
height: 30px;
width: 100%;
}

#Baslik
{
background-color:#3b5998;
}

#Icerik
{
padding: 10px 20px;
}

#SonBlum
{
text-align: center;
font-weight: bold;
color: Gray;
text-decoration: none;
margin-top: 10px;
}

body
{
margin: 0 auto 0 auto;
padding: 0;
color: #000000;
text-align: center;
}

.SolMenu
{

width:20%;
float:left;

}
.KullaniciIcerik
herkesburada.com 11

{
width:79%;
float:right;
font-size:small;
font-family:Verdana;
}

.KullaniciIcerik a
{
font-size:small;
}

a, a:link, a:visited, a:active


{
color: #000;
text-decoration: none;
}

a:hover
{
text-decoration: underline;
}

#Menu, #Menu a
{
color: #fff;
font-size: 18px;
font-weight: bold;
text-decoration: none;
}

#Menu .Separator
{
font-size: 18px;
}

#Menu .Text
{
font-size: 14px;
}

img
{
border: none;
12 Proje 1

p
{
margin-top: 0;
}

h1, h2, h3
{
margin: 0;
margin-bottom: 2px;
}

h1
{
font-size: 16px;
}

h2
{
font-size: 15px;
color: #de4d52;
}

h3
{
font-size: 13px;
}

Liste 1.6: Genel.css.

Uygulama ierisine SiteResimleri isminde bir klasr ekleyin ve size verilen proje materyalleri ie-
risindeki SiteResimleri klasr iindekileri bu klasre kopyalayn. Tasarm tanmlandktan sonra
her sayfada kullanlacak olan sayfann en stnde grnecek meny tanmlayn. Bu menu kulla-
ncnn rolne gre deiiklik gsterecei iin Login View kontrol kullann. Bilindii gibi bu kontrol
ye girii yapan ve yapmayan kiilere gre veya farkl rollere gre grnm kazanr. Uygulamaya
Controls isminde bir klasr oluturun ve iine UstMenu isminde bir Web User Control ekleyin.
(Liste 1.7)

<%@ Control Language=C# AutoEventWireup=true


CodeFile=UstMenu.ascx.cs Inherits=Controls_Menu %>
<table cellpadding=0 cellspacing=0 style=width: 700px;
height: 30px;>
<tr>
<td style=width: 500px; vertical-align: middle;>
&nbsp;
herkesburada.com 13

<a id=A1 href=~/ runat=Server>Ana Sayfa</a> <span


class=Separator>|</span>&nbsp;
<asp:LoginView runat=server ID=lv1>
<AnonymousTemplate>
<a id=A4 href=~/Login.aspx runat=Server>Giri</a>
</AnonymousTemplate>
<LoggedInTemplate>
<asp:LinkButton ID=lnkLogout runat=server
OnClick=lnkLogout_Click >k</asp:LinkButton>
</LoggedInTemplate>
<RoleGroups>
<asp:RoleGroup Roles=Admin>
<ContentTemplate>
<asp:LinkButton ID=lnkLogout runat=server
OnClick=lnkLogout_Click >k</asp:LinkButton>
<span class=Separator>|</span> <a id=A5 href=../
Admin/default.aspx runat=Server>
Ynetim</a>
</ContentTemplate>
</asp:RoleGroup>
</RoleGroups>
</asp:LoginView>
</td>
<td style=width: 200px; text-align: right; vertical-align:
middle;>
</td>
</tr>
</table>

Liste 1. 7: Ustmenu.ascx html tasarm.

Oluturulan st men kullanclarn giri yapmalarn salayacak, eer admin rol grubunda ise bu
gruba ait zel bir link kartmay salayacak.

lv1 ismindeki Login View kontrol iinde standart haricinde bir de admin rolndeki kullanclar iin
bir template oluturulmutur. Admin rolne sahip kullanclar, admin klasrne ynlendirilecek.

k butonuna tkland zaman k yapabilmek iin lnkLogout button kontrolnn Click olayn-
da kullanc k ilemini yaptrn. (Web User Controln kod dosyas - Liste 1.8.)

protected void lnkLogout_Click(object sender, EventArgs e)


{
FormsAuthentication.SignOut();
Session.Clear();
Response.Redirect(~/default.aspx);
}

Liste 1.8: lnkLogout linkbutton kontrol Click olay.


14 Proje 1

Uygulamann tasarmda tek bir arayz kullanabilmek iin Ajax Master Page ekleyin ve ismini her-
kesburada.master olarak belirleyin ve Liste 1.9da belirtilen tasarm yapn.

<%@ Master Language=C# AutoEventWireup=true


CodeFile=herkesburada.master.cs Inherits=herkesburada %>
<%@ Register Src=Controls/UstMenu.ascx TagName=Menu
TagPrefix=uc1 %>

<!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN


http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd>

<html xmlns=http://www.w3.org/1999/xhtml >


<head id=Head1 runat=server>
<title>Herkes Burada</title>
<link href=Style/Genel.css rel=stylesheet type=text/css
/>
</head>
<body>
<form id=form1 runat=server>
<div id=SayfaAna>
<div id=Baslik>
<img src=~/SiteResimleri/Logo.gif runat=server
id=imgLogo alt=Herkes Burada /></div>
<div id=Menu>
<uc1:Menu ID=Menu1 runat=server />
<asp:ScriptManager ID=ScriptManager1 runat=server>
</asp:ScriptManager>
</div>
<div id=Icerik>
<asp:ContentPlaceHolder ID=AnaIcerik runat=server>
</asp:ContentPlaceHolder>
</div>
</div>
<div id=SonBolum>
<!-- Daha sonradan buraya copyright bilgileri gelebilir. --
>
</div>
</form>
</body>
</html>

Liste 1.9: herkesburada.master dosyas tasarm.

Herkesburada.master master sayfasnn UstMenu.ascx user control eklenmi ekran grnts


ekil 1.13de belirtilmitir.
herkesburada.com 15

ekil 1.13: herkesburada.master sayfa tasarm.

Bu aamadan sonra uygulamaya eklenecek tm Ajax Web Formlarn


Web Form eklerken
herkesburada.master dosyasndan tretin. Yeni bir Ajax Web Form ek- master page setirme-
lerken master page setirip herkesburada.master dosyasn sein. Kul- yi unutmayn.
lanclarn kayt olabilmelelerini salamak iin kayit.aspx isminde bir Ajax
Web Form ekleyin.

kayit.aspx ierisine bir fieldset ekleyin. Eklenecek fieldseti Content Place Holder ierisine ekleyi
unutmayn.

<fieldset style=width: 320px; height: 260px>


<legend>Yeni ye?</legend>
</fieldset>

Eklenen bu fieldset ierisine Create User Wizard kontrol ekleyin. ID zelliini KullaniciKayit ola-
rak deitirin. zelliklerinde Trkeletirilebilen tm zellikleri Trkeletirin. rnein Password-
LabelText zelliini ifre olarak deitirin. Ek olarak Tablo 1.2deki zellikleri atayn.

Tablo 1.2: CreateUserWizard Kontrolnde Deitirikecek zellikler


zellik Deer
ContinueDestinationPageUrl ~/kullanici/default.aspx

Kayit.aspx formunun tasarm ekil 1.14deki gibidir.

ekil 1.14: Kayit.aspx sayfas.

Uygulama ierisinde 2 rol kullanlacak. Kayt olan kullancnn Standart rol grubuna alnmas iin
kayt esnasnda kayt olan kullancy bu gruba dahil edin. Bunun iin CreateUserWizard kontro-
lnn CreatedUser olaynda kullancy standart rol grubuna aln.

protected void KullaniciKayit_CreatedUser(object sender, EventArgs


e)
{
16 Proje 1

MembershipUser user = Membership.GetUser(KullaniciKayit.


UserName);
Roles.AddUserToRole(KullaniciKayit.UserName, Standart);
Membership.UpdateUser(user);
}

Liste 1.10: Kayt olan kullancy standart rol grubuna alma kodu.

Kayt olan kullancnn giri yapmasn salayacak olan Login.aspx sayfas iin uygulamaya Web
Form ekleyin ve ismini login.aspx olarak belirleyin. Kayit.aspx sayfasndaki gibi fieldset ekleyin
ve ierisine Login kontrol atn. Trkeletirilebilen zellikleri Trkeletirin ve ek olarak Tablo
1.3deki zellikleri atayn.

Tablo 1.3: Login.aspx Sayfas zerindeki Login Kontrolne Eklenecek zellikler


zellik Deer
CreateUserText Beni de aranza aln
CreateUserUrl ~/kayit.aspx
PasswordRecoveryText ifremi Unuttum
PasswordRecoveryUrl ~/sifrehatirlat.aspx

Login.aspx sayfasnn kts ekil 1.15de gsterilmitir.

ekil 1.15: Login.aspx sayfasnn tasarm grnm.

Uygulamaya sifrehatirlat.aspx isimli bir tane Web Form ekleyin. Sayfadaki Contente Password-
Recovery kontrol ekliyin. Trkeletirilebilen zellikleri Trkeletirin. Sifrehatirlat.aspx sayfasnn
grnts ekil 1.16da gsterilmitir.

ekil 1.16: SifreHatirlat.aspx sayfasnn tasarm grnm.


herkesburada.com 17

Bir ziyareti web sitesine ilk girdii zaman kullancy karlayacak olan default.aspx sayfasn
uygulamaya ekleyin.

<%@ Page Language=C# MasterPageFile=~/herkesburada.master


AutoEventWireup=true CodeFile=Default.aspx.cs Inherits=_
Default Title=Herkesburada.com %>
<asp:Content ID=Content1 ContentPlaceHolderID=AnaIcerik
Runat=Server>
<center> <asp:Panel ID=Panel1 runat=server
CssClass=AnaIcerik Height=100% Width=70%>
<p>
&nbsp;</p>
<p>
<font style=font-size: small; color: gray; font-
family: Verdana>&nbsp;Album outurun,
arkadalarnz ile mesajlan, yeni arkadalar
bulun, profil gncelleyin ve albumlere
gz atn.&nbsp;</font></p>
<center>
<asp:Button ID=btnKaydol runat=server
BackColor=Green Font-Names=Verdana Font-Size=Small
ForeColor=White Text=Aramza Katl
OnClick=btnKaydol_Click />
</center>
</asp:Panel></center>
</asp:Content>

Liste 1.11: Default.aspx html tasarm grnm.

btnKaydol button kontrolnn Click olaynda giri sayfasna ynlendirme yapn. Load olaynda ise
eer kullanc giri yapmsa Kullanici klasrne ynlendirin.

protected void Page_Load(object sender, EventArgs e)


{
if (User.Identity.IsAuthenticated)
Response.Redirect(@~\kullanici\default.aspx);
}
protected void btnKaydol_Click(object sender, EventArgs e)
{
Response.Redirect(login.aspx);
}

Liste 1.12: Default.aspx kod satr.


18 Proje 1

ekil 1.17: Default.aspx sayfa tasarm grnm.

Web sitesinde oluabilecek hatalar kullancya daha gzel ve anlalr gstermek iin hata say-
falar yapn. Hata isminde bir klasr ekleyin. 404 hata kodu internet sitelerinde bulunamayan
sayfalar, 403 nolu hata kodu ise eriilmeye yasak sayfalar belirtir. Bir web uygulamasnda olu-
abilecek en sk hatalar 404 ve 403 hatalardr. Bu hatalar iin ayr birer sayfa, dier tm hatalar
iin ise tek bir sayfa yapabilirsiniz. Bu klasre 404.aspx isminde bir Web Form ekleyin. Aradnz
sayfaya ulalamyor hatasn kullancya gsterin.

<%@ Page Language=C# MasterPageFile=~/herkesburada.master


AutoEventWireup=true CodeFile=404.aspx.cs Inherits=Hata_404
Title=Untitled Page %>
<asp:Content ID=Content1 ContentPlaceHolderID=AnaIcerik
Runat=Server>
<font color=Red>
<center>
&nbsp;</center>
<center>
&nbsp;</center>
<center>
Hata olutu ve yneticiye bildirildi.
<br />
Aradnz sayfaya ulalamyor.
</center></font>
</asp:Content>

Liste 1.13: 404.aspx hata sayfas html tasarm.

Ayn ekilde 403.aspx sayfas ekleyin ve Bu sayfaya eriim izniniz yok mesaj verdirin. Bu ha-
talar haricinde oluabilecek her hata iin genel bir generic hata sayfas yapn ve ismini hata.aspx
verin.

<%@ Page Language=C# MasterPageFile=~/herkesburada.master


AutoEventWireup=true CodeFile=hata.aspx.cs Inherits=Hata_
hata Title=Untitled Page %>
<asp:Content ID=Content1 ContentPlaceHolderID=AnaIcerik
Runat=Server>
<font color=Red>
<center>
&nbsp;</center>
<center>
herkesburada.com 19

&nbsp;</center>
<center>
Hata olutu ve yneticiye bildirildi.
<br />
leminizi tekrar deneyin.
</center></font>
</asp:Content>

Liste 1.14: Hata.aspx sayfas html tasarm.

Web.config dosyasn ap oluturulan hata sayfalarn tantn. Artk IIS kendi hata mesajlar yeri-
ne sizin zelletirdiiniz hata sayfalarn (custom error page) gsterecek.

<customErrors mode=RemoteOnly defaultRedirect=~/Hata/hata.


aspx>
<error redirect=~/Hata/404.aspx statusCode=404/>
<error redirect=~/Hata/403.aspx statusCode=403/>
</customErrors>

Liste 1.15: Web.Config CustomErrors dm.

Giri yapan kullanclarn eriecei sayfalar Kullanc klasr altnda toplamak iin uygulamaya
Kullanici klasr ekleyin. Eklenen klasre ilk olarak web.config dosyas ekleyin ve sadece giri
yapm kullanclarn bu klasre erimesine izin verin.

<?xml version=1.0 encoding=utf-8?>


<configuration>
<system.web>
<authorization>
<allow roles=Standart />
<allow roles=Admin />
<deny users=? />
</authorization>
</system.web>
</configuration>

Liste 1.16: Kullanc klasr ierisindeki web.config dosyas.

Controls klasr ierisine her sayfada grnecek olan sol menu iin KullaniciSolMenu.ascx is-
minde Web User Control ekleyin. Bu mende kullancnn profil resmi, sayfalarda gezinmesini
salayacak Menu kontrol ve kullanc aramasn salayacak arama blm olacak.

<%@ Control Language=C# AutoEventWireup=true CodeFile=Kullan


iciSolMenu.ascx.cs Inherits=Controls_KullaniciSolMenu %>
<fieldset style=height: auto; width: auto>
<legend><font style=font-size:smaller>Bilgilerim</font></
legend>
<br />
20 Proje 1

<a href=profilresmi.aspx title=Resminizi Guncelleyin><c


enter><asp:Image ID=imgUser runat=server AlternateText=Uye
Resminiz GenerateEmptyAlternateText=True /></center></a><br />
<font style=font-size:x-small>&nbsp; Hogeldin</font>
<asp:LoginName ID=LoginName1 runat=server Font-
Names=Verdana Font-Size=X-Small
ForeColor=Blue />
</fieldset>
<br />
<asp:Menu ID=Menu1 runat=server BackColor=#E3EAEB
DynamicHorizontalOffset=2
Font-Names=Verdana Font-Size=Small ForeColor=#666666
Height=115px StaticSubMenuIndent=10px
Width=158px>
<StaticMenuItemStyle HorizontalPadding=5px
VerticalPadding=2px />
<DynamicHoverStyle BackColor=#666666 ForeColor=White />
<DynamicMenuStyle BackColor=#E3EAEB />
<StaticSelectedStyle BackColor=#1C5E55 />
<DynamicSelectedStyle BackColor=#1C5E55 />
<DynamicMenuItemStyle HorizontalPadding=5px
VerticalPadding=2px />
<Items>
<asp:MenuItem Text=Mesajlarm Value=Mesajlarm
NavigateUrl=~/Kullanici/mesajlarim.aspx></asp:MenuItem>
<asp:MenuItem Text=Arkadalarm Value=Arkadalarm
NavigateUrl=~/Kullanici/arkadaslarim.aspx></asp:MenuItem>
<asp:MenuItem Text=Albumlerim Value=Albumlerim
NavigateUrl=~/Kullanici/albumlerim.aspx></asp:MenuItem>
<asp:MenuItem Text=Bilgilerim Value=Bilgilerim
NavigateUrl=~/Kullanici/bilgiler.aspx></asp:MenuItem>
</Items>
<StaticHoverStyle BackColor=#666666 ForeColor=White />
</asp:Menu>
<br />
<fieldset style=height: auto; width: auto>
<legend><font style=font-size:smaller>ye Ara</font></legend>
<asp:TextBox ID=txtRumuz runat=server Width=125px></
asp:TextBox><br />
&nbsp;<asp:Button ID=btnAra runat=server Text=Ara /><br
/>
<asp:HyperLink ID=HyperLink1 runat=server Font-
Size=Small ForeColor=Blue
NavigateUrl=~/kullanici/detayliarama.aspx>Detayl
Arama</asp:HyperLink><br /></fieldset>
&nbsp;<br />
<br />
herkesburada.com 21

KullaniciSolMenu.ascx kontrolnde en stte bir fieldset tanmland ve LoginName kontrol otu-


rum aan kullancnn otu-
ierisine kullancnn resimini gsterebilmek iin Image kontrol ek- rum adn almay salar.
lendi. Hemen altnda karlama mesaj olarak Hogeldiniz yazld ve
LoginName kontrol eklendi.

Orta blmde kullanclarn sayfalarda gezinmelerini salamak iin Menu kontrol eklendi ve ge-
rekli sayfalar link verildi. En altta ise kullanclarn site ierisinde arama yapmalarn salamak iin
arama blm yapld. Kullanc ilk oturum atnda Profile bilgilerinden ProfilResmini belirtme-
mi olacak. Eer kendisi resim belirtmemi ise otomatik olarak resimyok.jpg dosyas kullancnn
resmi yerine gsteriyoruz. Kullanc resimlerini depolomak iin uygulama ierisine UyeResimleri
klasr ekleyin. Bu klasr sitedeki kullanclarn resimlerini tutucak, dolaysyla resimler daha d-
zenli tutulmu olacak. Klasr ierisine resimyok.jpg resmini ekleyin. Bu resim profil bilgisini dol-
durmam kullancnn resminde gsterilecek. Bundan sonra oluturulacak her sayfada bu menu
kullanlacak.

protected void Page_Load(object sender, EventArgs e)


{
if (String.IsNullOrEmpty(Profile.ProfilResmi))
imgUser.ImageUrl = Server.MapPath(~/UyeResimleri/
resimyok.jpg);
else
imgUser.ImageUrl = Server.MapPath(~/UyeResimleri/)
+ Profile.ProfilResmi;
} Eklenen her sayfay
herkesburada.master
sayfasndan tretin.
Liste 1.17: Default.aspx Page_Load olay.

Kullanc klasrne default.aspx isminde bir Web Form ekleyin.

Oluan sayfann kullancya ho grnebilmesi iin Contenti tasarmsal olarak ikiye bln, yani
div kullanarak ekillendirin. Solda oluan div ierisine biraz nce oluturduunuz KullaniciSolMe-
nu.ascx kontroln ekleyin.

<%@ Page Language=C# MasterPageFile=~/herkesburada.


master AutoEventWireup=true CodeFile=Default.aspx.cs
Inherits=Kullanici_Default Title=ye Ana Sayfa %>
<%@ Register Src=../Controls/KullaniciSolMenu.ascx TagName=Kul
laniciSolMenu TagPrefix=uc1 %>

<asp:Content ID=Content1 ContentPlaceHolderID=AnaIcerik


Runat=Server>
<div class=SolMenu>
<uc1:KullaniciSolMenu ID=KullaniciSolMenu1 runat=server
/>

</div>
<div class=KullaniciIcerik>
</div>
</asp:Content>

Liste 1.18: Default.aspx sayfas html tasarm.


22 Proje 1

Bundan sonraki her sayfada ayn tasla kullann. Eklenen her sayfay Liste 1.18de belirtidii gibi
2 paraya bln ve sol tarafa KullaniciMenu.ascx kontroln ekleyin.

ekil 1.18: Kullanici/default.aspx sayfa tasarm grnts.

Kullanici klasr ierisine Mesajlarim.aspx isminde bir Web


Default.aspx sayfasnn en stnde be-
Form Ekleyin. Kullancnn gelen ve giden mesajlarnn liste-
lirtilen declaration haricindeki tm kod-
lar koplayalp yaptrabilirsiniz. lenecei sayfas olacak. Sayfay default.aspxteki gibi iki div
ierisine bln.

<%@ Register Assembly=AjaxControlToolkit Namespace=AjaxControl


Toolkit TagPrefix=cc1 %>
<%@ Register Src=~/Controls/KullaniciSolMenu.ascx TagName=Kull
aniciSolMenu TagPrefix=uc1 %>

<asp:Content ID=Content1 ContentPlaceHolderID=AnaIcerik


Runat=Server>
<div class=SolMenu>
<uc1:KullaniciSolMenu ID=KullaniciSolMenu1 runat=server
/>

</div>

<script language=javascript type=text/javascript>



function YeniMesajGoster()
{

window.open(yenimesaj.aspx,yenimesaj,width=350,h
eight=250);
}
</script>
herkesburada.com 23

<div class=KullaniciIcerik>
<br />
<asp:LinkButton ID=lnkYeniMesaj OnClientClick=YeniMe
sajGoster(); return false; runat=server ForeColor=Blue
Width=67px>Yeni Mesaj</asp:LinkButton><br />
<asp:UpdatePanel ID=UpdatePanel1 runat=server>
<ContentTemplate>
<br />
<cc1:TabContainer ID=TabContainer1 runat=server
ActiveTabIndex=0 Width=625px>
<cc1:TabPanel ID=TabPanel1 runat=server
HeaderText=TabPanel1>
<ContentTemplate>
<asp:GridView ID=gelenMesajlar runat=server
AllowPaging=True AllowSorting=True
AutoGenerateColumns=False BackColor=White
BorderColor=#CCCCCC BorderStyle=None
BorderWidth=1px CellPadding=4 DataKeyNames=M
esajId,OkunduMu DataSourceID=SqlDataSource1
EmptyDataText=Gelen Mesajnz bulunmuyor...
ForeColor=Black GridLines=Horizontal
Width=100% OnRowDeleting=gelenMesajlar_
RowDeleting OnRowDataBound=gelenMesajlar_RowDataBound>
<FooterStyle BackColor=#CCCC99 ForeColor=Black
/>
<Columns>
<asp:HyperLinkField DataNavigateUrlFields=
UserName DataNavigateUrlFormatString=~/kullanici/profildetay.
aspx?user={0}
DataTextField=UserName HeaderText=G&#2
46;nderen />
<asp:HyperLinkField DataNavigateUrlFields
=MesajId DataNavigateUrlFormatString=~/kullanici/mesajoku.
aspx?mesaj={0}
DataTextField=Baslik HeaderText=Konu
/>
<asp:BoundField DataField=Tarih
DataFormatString={0:d} HeaderText=Tarih HtmlEncode=False
SortExpression=Tarih />
<asp:TemplateField ShowHeader=False>
<ItemTemplate>
<asp:LinkButton ID=LinkButton1
OnClientClick=return confirm(Mesaj silmek istediinizden
emin misiniz?) runat=server CausesValidation=False
CommandName=Delete
Text=Sil></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
24 Proje 1

</Columns>
<SelectedRowStyle BackColor=#CC3333 Font-
Bold=True ForeColor=White />
<PagerStyle BackColor=White ForeColor=Black
HorizontalAlign=Right />
<HeaderStyle BackColor=#333333 Font-Bold=True
ForeColor=White />
</asp:GridView>
</ContentTemplate>
<HeaderTemplate>
Gelen Mesajlarm
</HeaderTemplate>
</cc1:TabPanel>
<cc1:TabPanel ID=TabPanel2 runat=server
HeaderText=TabPanel2>
<ContentTemplate>
<asp:GridView ID=gidenMesajlar
runat=server AllowPaging=True AllowSorting=True
AutoGenerateColumns=False
BackColor=White BorderColor=#CCCCCC BorderStyle=None
BorderWidth=1px CellPadding=4
DataKeyNames=MesajId DataSourceID=SqlDataSource2
EmptyDataText=Giden mesajnz
bulunmuyor... ForeColor=Black GridLines=Horizontal
OnRowDeleting=gidenMesajlar_
RowDeleting Width=100%>
<FooterStyle BackColor=#CCCC99
ForeColor=Black />
<Columns>
<asp:BoundField
DataField=UserName HeaderText=Kime SortExpression=Kimden />
<asp:BoundField DataField=Baslik
HeaderText=Balk SortExpression=Baslik />
<asp:BoundField DataField=Tarih
DataFormatString={0:d} HeaderText=Tarih HtmlEncode=False
SortExpression=Tarih />
<asp:TemplateField
ShowHeader=False>
<ItemTemplate>
<asp:LinkButton
ID=LinkButton1 runat=server CausesValidation=False
CommandName=Delete
OnClientClick=return
confirm(Mesaj silmek istediinden emin misiniz?) Text=Sil></
asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
herkesburada.com 25

</Columns>
<SelectedRowStyle BackColor=#CC3333
Font-Bold=True ForeColor=White />
<PagerStyle BackColor=White
ForeColor=Black HorizontalAlign=Right />
<HeaderStyle BackColor=#333333
Font-Bold=True ForeColor=White />
</asp:GridView>
<asp:SqlDataSource ID=SqlDataSource2
runat=server ConflictDetection=CompareAllValues
ConnectionString=<%$
ConnectionStrings:ConStrHerkesBurada %> DeleteCommand=DELETE
FROM [Mesajlar] WHERE [MesajId] = @original_MesajId AND [Kimden]
= @original_Kimden AND [Kime] = @original_Kime AND [Baslik] = @
original_Baslik AND [MesajIcerik] = @original_MesajIcerik AND
[Tarih] = @original_Tarih
InsertCommand=INSERT INTO [Mesajlar]
([MesajId], [Kimden], [Kime], [Baslik], [MesajIcerik], [Tarih],
[OkunduMu]) VALUES (@MesajId, @Kimden, @Kime, @Baslik, @
MesajIcerik, @Tarih)
OldValuesParameterFormatString=orig
inal_{0} SelectCommand=SELECT [MesajId], [UserName], [Baslik],
[MesajIcerik], [Tarih] &#13;&#10;FROM [Mesajlar] m &#13;&#10;Inner
Join aspnet_Users a on a.UserId = m.Kime&#13;&#10;WHERE ([Kimden]
= @Kimden And GondericiyeGosterme=False) ORDER BY [Tarih]
UpdateCommand=UPDATE [Mesajlar]
SET [Kimden] = @Kimden, [Kime] = @Kime, [Baslik] = @Baslik,
[MesajIcerik] = @MesajIcerik, [Tarih] = @Tarih WHERE [MesajId] =
@original_MesajId AND [Kimden] = @original_Kimden AND [Kime] = @
original_Kime AND [Baslik] = @original_Baslik AND [MesajIcerik] =
@original_MesajIcerik AND [Tarih] = @original_Tarih>
<InsertParameters>
<asp:Parameter Name=MesajId
Type=Object />
<asp:Parameter Name=Kimden
Type=Object />
<asp:Parameter Name=Kime
Type=Object />
<asp:Parameter Name=Baslik
Type=String />
<asp:Parameter Name=MesajIcerik
Type=String />
<asp:Parameter Name=Tarih
Type=DateTime />
</InsertParameters>
<SelectParameters>
<asp:SessionParameter
Name=Kimden SessionField=UserId />
</SelectParameters>
26 Proje 1

<UpdateParameters>
<asp:Parameter Name=Kimden
Type=Object />
<asp:Parameter Name=Kime
Type=Object />
<asp:Parameter Name=Baslik
Type=String />
<asp:Parameter Name=MesajIcerik
Type=String />
<asp:Parameter Name=Tarih
Type=DateTime />
<asp:Parameter Name=OkunduMu
Type=Boolean />
<asp:Parameter Name=original_
MesajId Type=Object />
<asp:Parameter Name=original_
Kimden Type=Object />
<asp:Parameter Name=original_
Kime Type=Object />
<asp:Parameter Name=original_
Baslik Type=String />
<asp:Parameter Name=original_
MesajIcerik Type=String />
<asp:Parameter Name=original_
Tarih Type=DateTime />
</UpdateParameters>
<DeleteParameters>
<asp:Parameter Name=original_
MesajId Type=Object />
<asp:Parameter Name=original_
Kimden Type=Object />
<asp:Parameter Name=original_
Kime Type=Object />
<asp:Parameter Name=original_
Baslik Type=String />
<asp:Parameter Name=original_
MesajIcerik Type=String />
<asp:Parameter Name=original_
Tarih Type=DateTime />
</DeleteParameters>
</asp:SqlDataSource>
</ContentTemplate>
<HeaderTemplate>
Giden Mesajlarm
</HeaderTemplate>
</cc1:TabPanel>
</cc1:TabContainer><br />
herkesburada.com 27

<asp:SqlDataSource ID=SqlDataSource1 runat=server


ConflictDetection=CompareAllValues
ConnectionString=<%$ ConnectionStrings:
ConStrHerkesBurada %>
DeleteCommand=DELETE FROM [Mesajlar] WHERE
[MesajId] = @original_MesajId AND [Kimden] = @original_Kimden
AND [Kime] = @original_Kime AND [Baslik] = @original_Baslik AND
[MesajIcerik] = @original_MesajIcerik AND [Tarih] = @original_
Tarih
InsertCommand=INSERT INTO [Mesajlar] ([MesajId],
[Kimden], [Kime], [Baslik], [MesajIcerik], [Tarih]) VALUES (@
MesajId, @Kimden, @Kime, @Baslik, @MesajIcerik, @Tarih)
OldValuesParameterFormatString=origi
nal_{0} SelectCommand=SELECT [MesajId], [UserName],
[Baslik], [MesajIcerik], [Tarih] ,OkunduMu&#13;&#10;FROM
[Mesajlar] m &#13;&#10;Inner Join aspnet_Users a on
a.UserId = m.Kimden&#13;&#10;WHERE ([Kime] = @Kime And
AliciyaGosterme=False) ORDER BY OkunduMu,[Tarih] &#13;&#10;
UpdateCommand=UPDATE [Mesajlar] SET [Kimden] =
@Kimden, [Kime] = @Kime, [Baslik] = @Baslik, [MesajIcerik] = @
MesajIcerik, [Tarih] = @Tarih WHERE [MesajId] = @original_MesajId
AND [Kimden] = @original_Kimden AND [Kime] = @original_Kime
AND [Baslik] = @original_Baslik AND [MesajIcerik] = @original_
MesajIcerik AND [Tarih] = @original_Tarih AND [OkunduMu] = @
original_OkunduMu>
<DeleteParameters>
<asp:Parameter Name=original_MesajId
Type=Object />
<asp:Parameter Name=original_Kimden
Type=Object />
<asp:Parameter Name=original_Kime
Type=Object />
<asp:Parameter Name=original_Baslik
Type=String />
<asp:Parameter Name=original_MesajIcerik
Type=String />
<asp:Parameter Name=original_Tarih
Type=DateTime />

</DeleteParameters>
<UpdateParameters>
<asp:Parameter Name=Kimden Type=Object />
<asp:Parameter Name=Kime Type=Object />
<asp:Parameter Name=Baslik Type=String />
<asp:Parameter Name=MesajIcerik
Type=String />
<asp:Parameter Name=Tarih Type=DateTime
/>
28 Proje 1

<asp:Parameter Name=original_MesajId
Type=Object />
<asp:Parameter Name=original_Kimden
Type=Object />
<asp:Parameter Name=original_Kime
Type=Object />
<asp:Parameter Name=original_Baslik
Type=String />
<asp:Parameter Name=original_MesajIcerik
Type=String />
<asp:Parameter Name=original_Tarih
Type=DateTime />
<asp:Parameter Name=original_OkunduMu />

</UpdateParameters>
<SelectParameters>
<asp:SessionParameter Name=Kime
SessionField=UserId Type=Object />
</SelectParameters>
<InsertParameters>
<asp:Parameter Name=MesajId Type=Object
/>
<asp:Parameter Name=Kimden Type=Object />
<asp:Parameter Name=Kime Type=Object />
<asp:Parameter Name=Baslik Type=String />
<asp:Parameter Name=MesajIcerik
Type=String />
<asp:Parameter Name=Tarih Type=DateTime
/>

</InsertParameters>
</asp:SqlDataSource>
</ContentTemplate>
</asp:UpdatePanel>
&nbsp;&nbsp;<br />
<br />
</div>
</asp:Content>
Liste 1.19: Mesajlarim.aspx html tasarm.

Eklenen bu formun en st ksmnda bir link button kontrol bulunur. Bu link butonuna tkland
zaman yeni bir pencerede popup olarak yeni mesaj gnderme sayfas alacak. Bu linkin hemen
altnda bir update panel bulunur. Update panel ierisinde Tab Container kontrol bulunur. Tab
Container kontrol ierisinde 2 adet tab oluturuldu ve bu tablardan birinde gelen mesajlar, die-
rinde ise giden mesajlar listelendi. Gelen mesaj eer okunmam ise mesajn bulunduu satrn
stili deitirilecek. Bunun iin gelenMesajlar grid view kontrolnn RowDataBound olaynda me-
sajn okunup okunmad bilgisini alp gerekli deiiklii yapn.
herkesburada.com 29

protected void gelenMesajlar_RowDataBound(object sender,


GridViewRowEventArgs e)
{
if (e.Row.RowType != DataControlRowType.DataRow)
return;

bool neymis = Convert.ToBoolean(gelenMesajlar.DataKeys[e.


Row.RowIndex][OkunduMu]) ;

if (!neymis)
{
e.Row.BackColor = Color.Brown;
e.Row.ForeColor = Color.White;
}
}

Liste 1.20: Mesajlarim.aspx gelenMesajlar RowDataBound olay.

Giden ve gelen mesajlarda silinme ileminde deiik bir sistem kullanlr. Bir mesaj geldii zaman
veritabannda tek bir satra kayt girilecek. Mesaj gnderen kii gelen mesajlarndan mesaj sil
dedii zaman aslnda bana gsterme demi olacak. Mesaj gelen kii gelen mesaj sil dedii za-
man aslnda bana gsterme demi olacak. Eer mesaj gerekten silinirse gnderen veya alan kii
mesaj sildii zaman dier kii mesaj grememi olacak. O yzden bir kullanc mesaj sil dedii
zaman aslnda o kullancya mesajn gsterilip gsterilmeyecei belirtilecek. Bu yzden gelen ve
giden mesajlar iin silinme olaynda gerekli mesajlar gncelleyin.

protected void gelenMesajlar_RowDeleting(object sender,


GridViewDeleteEventArgs e)
{
Guid mesajId = new Guid(gelenMesajlar.DataKeys[e.
RowIndex].Value.ToString());
SqlConnection con = new SqlConnection(ConfigurationManage
r.ConnectionStrings[LocalSqlServer].ConnectionString);
SqlCommand cmd = new SqlCommand(Update mesajlar set
AliciyaGosterme = True Where MesajId = @MesajId, con);
cmd.Parameters.AddWithValue(@MesajId, mesajId);
try
{

con.Open();
cmd.ExecuteNonQuery();
}
catch (SqlException ex)
{

throw ex;
}
finally
30 Proje 1

{
con.Close();
}

SqlDataSource1.DataBind();
}

protected void gidenMesajlar_RowDeleting(object sender,
GridViewDeleteEventArgs e)
{
Guid mesajId = new Guid(gidenMesajlar.DataKeys[e.
RowIndex].Value.ToString());
SqlConnection con = new SqlConnection(ConfigurationManage
r.ConnectionStrings[LocalSqlServer].ConnectionString);
SqlCommand cmd = new SqlCommand(Update mesajlar set
GondericiyeGosterme = True Where MesajId = @MesajId, con);
cmd.Parameters.AddWithValue(@MesajId, mesajId);
try
{
con.Open();
cmd.ExecuteNonQuery();
}
catch (SqlException ex)
{
throw ex;
}
finally
{
con.Close();
}

SqlDataSource2.DataBind();
}

Liste 1.21: Mesajlarim.aspx gelen ve giden mesajlarn silinme olay.

Mesaj alan kii ve gnderen kii birlikte silinme istediinde bulunursa mesaj gerekten veritaba-
nndan silinir. Bu yzden veritaban zerine bu ilemi yapacak trigger oluturun. Liste 1.22de
belirtilmitir.

USE herkesburadadb
GO

CREATE TRIGGER MesajSilici


ON Mesajlar
For Update
herkesburada.com 31

AS
BEGIN

Declare @MesajId uniqueidentifier

Select @MesajId = MesajId From Inserted

Delete From Mesajlar Where GondericiyeGosterme = True


And AliciyaGosterme=True And MesajId = @MesajId

END

Liste 1.22: MesajSilici trigger kodu.

Mesajlarim.aspx sayfas tasarm ekil 1.19da belirtilmitir.

ekil 1.19: Mesajlarim.aspx sayfa tasarm grnm.

Yeni mesaj gnderebilmek iin Kullanici klasr ierisine yenimesaj.aspx isimli bir sayfa ekleyin
fakat bu sayfay eklerken master page semeyin.

<%@ Page Language=C# AutoEventWireup=true CodeFile=yenimesaj.


aspx.cs Inherits=Kullanici_yenimesaj %>
<%@ Register Assembly=AjaxControlToolkit Namespace=AjaxControl
Toolkit TagPrefix=cc1 %>
<!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd>
<html xmlns=http://www.w3.org/1999/xhtml >
<head runat=server>
<title>Yeni Mesaj Gnder</title>
32 Proje 1

<link href=../Style/Genel.css rel=stylesheet type=text/


css />
</head>
<body style=margin-left:0;margin-top:0>
<form id=form1 runat=server>
<div style=text-align:left>
<table width=300>
<tr>
<td style=width: 55px>
</td>
<td colspan=2>
<asp:ScriptManager ID=ScriptManager1
runat=server>
</asp:ScriptManager>
<cc1:AutoCompleteExtender
EnableCaching=false
id=AutoCompleteExtender1
MinimumPrefixLength=2 runat=server
servicemethod=GetCompletionList

targetcontrolid=txtKime
UseContextKey=true
></cc1: AutoCompleteExtender>

</td>
<td style=width: 100px>
</td>
</tr>
<tr>
<td style=width: 55px>
Kime :
</td>
<td style=width: 69px>
<asp:TextBox ID=txtKime runat=server></
asp:TextBox></td>
<td style=width: 69px>
</td>
<td style=width: 100px>
</td>
</tr>
<tr>
<td style=width: 55px>
Konu :
</td>
<td colspan=3>
herkesburada.com 33

<asp:TextBox ID=txtBaslik runat=server


Width=100%></asp:TextBox></td>
</tr>
<tr>
<td style=width: 55px; height: 18px
valign=top>
Mesaj :
</td>
<td colspan=3 style=height: 18px>
<asp:TextBox ID=txtMesaj runat=server
Height=107px TextMode=MultiLine Width=100%></asp:TextBox></
td>
</tr>
<tr>
<td style=width: 55px>
</td>
<td style=width: 69px>
<asp:Button ID=btnGonder runat=server
Text=Gnder OnClick=btnGonder_Click />
</td>
<td style=width: 69px>
<asp:Button ID=btnIptal runat=server
Text=ptal CausesValidation=False OnClientClick=javascript:
window.close(); /></td>
<td style=width: 100px>
</td>
</tr>
<tr>
<td style=width: 55px; height: 18px>
</td>
<td style=width: 69px; height: 18px>
&nbsp;</td>
<td style=width: 69px; height: 18px>
</td>
<td style=width: 100px; height: 18px>
</td>
</tr>
</table>

</div>
</form>
</body>
</html>

Liste 1.23: Yenimesaj.aspx.


34 Proje 1

Yeni mesaj gndermek iin sayfaya bir scriptmanager ve bir autocompleteextender konrol
eklendi. Eer mesaj gnderilecek kii kullancnn arkada ise otomatik olarak textbox altnda
kacak. Kullanc mesaj gidecek kiinin ismini yazd zaman tamamlama olmayacak. Mesaj
gnderilecek kii, mesaj gnderen kiinin arkada olup olmadn renebilmesi iin veritaban
zerinde ArkadasListem isminde bir stored procedure oluturun. Arkada listesi tek bir tabloda
tanmlanyor.

CREATE proc [ArkadasListem]


(
@UserId uniqueidentifier
)
As

SELECT aspnet_Users.UserName , Kimin As KullaniciId


FROM ArkadasListesi INNER JOIN aspnet_Users
ON ArkadasListesi.Kimin = aspnet_Users.UserId WHERE
ArkadasListesi.OnaylandiMi =
True And (ArkadasListesi.Kim = @UserId)
Union
SELECT aspnet_Users.UserName, Kim As KullaniciId
FROM ArkadasListesi INNER JOIN aspnet_Users
ON ArkadasListesi.Kim = aspnet_Users.UserId WHERE ArkadasListesi.
OnaylandiMi =
True And (ArkadasListesi.Kimin = @UserId)

Liste 1.24: ArkadasListem StoredProcedure.

Mesaj gnderilecei zaman mesaj gnderecek kii, alacak mesaj gnderecei kiinin adn ya-
zar. Veritaban ise bir mesaj kaydedebilmesi iin kullancnn ID bilgisine ihtiya duyacaktr. Ve-
ritaban zerinde kullancnn adn parametre olarak alan ve IDsini dndren function yazn.
(Liste 1.25)

CREATE function KullaniciIdAl


(
@UserName nvarchar(50)
)
returns uniqueidentifier
As
begin
Declare @userId uniqueidentifier

Select @UserId =UserId From aspnet_Users Where [UserName] = @


username

return @userId
end

Liste 1.25: KullancIdAl function tanmlamas.


herkesburada.com 35

Yenimesaj.aspx sayfasna geri dnp arkada listesini dndrecek metodu tanmlayn.

public static List<string> uyeler = new List<string>();


[System.Web.Services.WebMethodAttribute(), System.Web.Script.
Services.ScriptMethodAttribute()]
public static string[] GetCompletionList(string prefixText,
int count, string contextKey)
{
SqlConnection con = new SqlConnection(ConfigurationManage
r.ConnectionStrings[LocalSqlServer].ConnectionString);
SqlCommand cmd = new SqlCommand(ArkadasListem,con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue(@UserId, Membership.
GetUser(HttpContext.Current.User.Identity.Name).ProviderUserKey);
SqlDataAdapter da = new SqlDataAdapter(cmd);

DataTable dt = new DataTable();
da.Fill(dt);
uyeler.Clear();
foreach (DataRow dr in dt.Rows)
{
if (dr[UserName].ToString().StartsWith(prefixText))
uyeler.Add(dr[UserName].ToString());
}

return uyeler.ToArray();
}

Liste 1.26: Kullancnn arkada listesini otomatik dolduran metod.

Arkada listesini doldurduktan sonra yeni mesaj gndermek iin btnGonder button kontrolnn
Click olaynda yeni mesaj gnderme kodlarn yazn.

protected void btnGonder_Click(object sender, EventArgs e)


{
SqlConnection con = new SqlConnection(ConfigurationManage
r.ConnectionStrings[LocalSqlServer].ConnectionString);
SqlCommand cmd = new SqlCommand(Insert into mesajla
r(Kimden,Kime,MesajIcerik,Baslik,Tarih) values(@Kimden,dbo.
KullaniciIdAl(@Kime),@MesajIcerik,@Baslik,@Tarih), con);

cmd.Parameters.AddWithValue(@Kimden,Membership.
GetUser(User.Identity.Name).ProviderUserKey);
cmd.Parameters.AddWithValue(@Kime,txtKime.Text);
cmd.Parameters.AddWithValue(@MesajIcerik,txtMesaj.
Text);
cmd.Parameters.AddWithValue(@Baslik,txtBaslik.Text);
cmd.Parameters.AddWithValue(@Tarih,DateTime.Now );
36 Proje 1

int i = 0;
try
{
con.Open();
i = cmd.ExecuteNonQuery();
}
catch (SqlException ex)
{

throw ex;
}
finally
{
con.Close();
}

if (i == 1)
{
Response.Redirect(~/kullanici/mesajgonderildi.
aspx);
}
}

Liste 1.27: btnGonder button kontrol Click olay.

ekil 1.20: YeniMesaj.aspx sayfa tasarm grnm.

Mesaj gnderildikten sonra kullancya mesajn gittiine dair mesaj gnderilecek ve tekrar mesaj
gndermek isteyip istemediini sorulacak mesajgonderildi.aspx sayfasn Kullanici klasrne ek-
leyin ve master page setirmeyin.

<%@ Page Language=C# AutoEventWireup=true CodeFile=mesajgond


erildi.aspx.cs Inherits=Kullanici_mesajgonderildi %>

<!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN


http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd>

<html xmlns=http://www.w3.org/1999/xhtml >


<head runat=server>
herkesburada.com 37

<title>Mesaj Gnderildi</title>
<link href=~/Style/Genel.css rel=stylesheet type=text/
css />
</head>
<body>
<form id=form1 runat=server>
<div>
<br />
<asp:Label ID=Label1 runat=server Font-Size=Medium
ForeColor=Red Text=Mesajnz Gnderildi...></asp:Label><br />
<br />
<asp:LinkButton ID=LinkButton1 runat=server
OnClick=lnkYeniMesaj_Click>Yeni Mesaj</asp:LinkButton>
<asp:HyperLink ID=HyperLink1 runat=server
NavigateUrl=javascript:window.close();>Kapat</asp:HyperLink></
div>
</form>
</body>
</html>

Liste 1.28: Mesajgonderildi.aspx sayfas html tasarm.

Yeni Mesaj button kontrolnn Click olaynda yenimesaj.aspx sayfasna ynlendirme yapn.

protected void lnkYeniMesaj_Click(object sender, EventArgs e)


{
Response.Redirect(~/kullanici/yenimesaj.aspx);
}

Liste 1.29: lnkYeniMesaj button kontrol Click olay.

Bu aamadan sonra eklenen tm sayfalar herkesbu-


rada.master sayfasndan tretin ve default.aspx sayfa-
sndaki ekilde sol ve sa taraf olacak ekilde bln.
ekil 1.21: MesajGonderildi.
aspx tasarm grnm.

Mesaj gnderme ve gelen/giden mesajlar grntleme tamamlandktan sonra mesajoku.aspx


sayfasn Kullanici klasrne ekleyin.

<%@ Page Language=C# MasterPageFile=~/herkesburada.


master AutoEventWireup=true CodeFile=mesajoku.aspx.cs
Inherits=Kullanici_mesajoku Title=Untitled Page %>
<%@ Register Src=../Controls/KullaniciSolMenu.ascx TagName=Kul
laniciSolMenu TagPrefix=uc1 %>

<asp:Content ID=Content1 ContentPlaceHolderID=AnaIcerik


Runat=Server>
<div class=SolMenu>
38 Proje 1

<uc1:KullaniciSolMenu ID=KullaniciSolMenu1 runat=server


/>

</div>
<div class=KullaniciIcerik>
<asp:Label ID=lblGonderen runat=server ForeColor=Blue
Text=Gnderen : ></asp:Label>
der ki;
<br />
<br />
<asp:Label ID=lblBaslik runat=server Font-Bold=True
Text=Selamlar></asp:Label><br />
<br />
<asp:Label ID=lblMesaj runat=server Text=Label></asp:
Label>&nbsp;<br />
<br />
<asp:Button ID=btnSil runat=server OnClick=btnSil_Click
Text=Sil />
<asp:Button ID=btnYanitla runat=server
OnClick=btnYanitla_Click Text=Yantla /></div>
</asp:Content>
Liste 1.30: Mesajoku.aspx html tasarm.

Mesaj okutmak iin mesajoku.aspx sayfasnn code blmne Liste 1.31deki kodlar yazn.

protected void Page_Load(object sender, EventArgs e)


{

if (!Page.IsPostBack)
{
MesajOku();
}
}

void MesajOku()
{
if (Request.QueryString[mesaj] != null)
{
try
{
Guid g = new Guid(Request.QueryString[mesaj]);
SqlConnection con = new SqlConnection(Configurati
onManager.ConnectionStrings[LocalSqlServer].ConnectionString);
SqlCommand cmd = new SqlCommand(Select m.*,
[UserName] From Mesajlar m Inner join aspnet_Users a on a.UserId
= m.Kimden Where MesajId = @MesajId And Kime=@Kime, con);
herkesburada.com 39

cmd.Parameters.AddWithValue(@MesajId, g);
cmd.Parameters.AddWithValue(@Kime, Membership.
GetUser(User.Identity.Name).ProviderUserKey);

try
{
con.Open();
SqlDataReader rdr = cmd.ExecuteReader();
if (rdr.Read())
{
lblBaslik.Text = rdr[Baslik].ToString();
lblGonderen.Text = rdr[UserName].
ToString();
lblMesaj.Text = rdr[MesajIcerik].
ToString();

SqlCommand cmdGuncelle = new


SqlCommand(Update mesajlar Set OkunduMu=True Where MesajId=@
MesajId,con);
cmdGuncelle.Parameters.AddWithValue(@
MesajId, new Guid(Request.QueryString[mesaj]));
cmdGuncelle.ExecuteNonQuery();
}
else
{
Response.Redirect(~/kullanici/default.
aspx);
}
}
catch (SqlException ex)
{

throw ex;
}
finally { con.Close(); }

}
catch (FormatException ex)
{
Response.Redirect(mesajlarim.aspx);
}
}
}

Liste 1.31: MesajOku.aspx Page_Load olay ve MesajOku metodu.


40 Proje 1

Okunan mesaj cevaplamak ve silmek iin btnSil ve btnCevapla button kontrol Click olaylarna
Liste 1.32deki kodu ekleyin.

protected void btnSil_Click(object sender, EventArgs e)


{
if (Request.QueryString[mesaj] != null)
{
try
{
Guid g = new Guid(Request.QueryString[mesaj]);
}
catch { return; }
}
SqlConnection con = new SqlConnection(ConfigurationManage
r.ConnectionStrings[LocalSqlServer].ConnectionString);
SqlCommand cmd = new SqlCommand(Update mesajlar set
AliciyaGosterme = True Where MesajId = @MesajId, con);
cmd.Parameters.AddWithValue(@MesajId, new Guid(Request.
QueryString[mesaj]));
int i = 0;
try
{
con.Open();
i = cmd.ExecuteNonQuery();
}
catch (SqlException ex)
{

throw ex;
}
finally
{
con.Close();
}

if (i > 0) Response.Redirect(~/kullanici/mesajlarim.
aspx);

}
protected void btnYanitla_Click(object sender, EventArgs e)
{
Session[cevap] = Cvp : + lblBaslik.Text + | +
lblGonderen.Text; ;
Response.Redirect(~/kullanici/cevapla.aspx);
}

Liste 1.32: btnSil ve btnYanitla button kontrol Click olay.


herkesburada.com 41

MesajOku.aspx tasarm grnm ekil 1.22de gsterilmitir.

ekil 1.22: MesajOku.aspx tasarm grnm.

btnYanitla button kontrolne tkland zaman ynlendirilecek olan cevapla.aspx sayfasn Kulla-
nici klasrne ekleyin. Sayfay eklerken masterpage setirmeyi unutmayn.

<%@ Page Language=C# MasterPageFile=~/herkesburada.


master AutoEventWireup=true CodeFile=cevapla.aspx.cs
Inherits=Kullanici_cevapla Title=Untitled Page %>

<%@ Register Assembly=AjaxControlToolkit Namespace=AjaxControl


Toolkit TagPrefix=cc1 %>
<%@ Register Src=../Controls/KullaniciSolMenu.ascx TagName=Kul
laniciSolMenu TagPrefix=uc1 %>

<asp:Content ID=Content1 ContentPlaceHolderID=AnaIcerik


Runat=Server>
<div class=SolMenu>
<uc1:KullaniciSolMenu ID=KullaniciSolMenu1 runat=server
/>

</div>
<div class=KullaniciIcerik>
<div style=text-align:left>
<table style=width: 423px>
<tr>
<td style=width: 55px>
</td>
<td style=width: 69px>
</td>
42 Proje 1

<td style=width: 69px>


</td>
<td style=width: 100px>
</td>
</tr>
<tr>
<td style=width: 55px>
Kime :
</td>
<td style=width: 69px>
<asp:TextBox ID=txtKime runat=server></
asp:TextBox></td>
<td style=width: 69px>
</td>
<td style=width: 100px>
</td>
</tr>
<tr>
<td style=width: 55px>
Konu :
</td>
<td colspan=3>
<asp:TextBox ID=txtBaslik runat=server
Width=100%></asp:TextBox></td>
</tr>
<tr>
<td style=width: 55px; height: 18px
valign=top>
Mesaj :
</td>
<td colspan=3 style=height: 18px>
<asp:TextBox ID=txtMesaj runat=server
Height=107px TextMode=MultiLine Width=100%></asp:TextBox></
td>
</tr>
<tr>
<td style=width: 55px>
</td>
<td style=width: 69px>
<asp:Button ID=btnGonder runat=server
Text=Gnder OnClick=btnGonder_Click />
</td>
<td style=width: 69px>
<asp:Button ID=btnIptal runat=server
Text=ptal OnClick=btnIptal_Click /></td>
herkesburada.com 43

<td style=width: 100px>


</td>
</tr>
<tr>
<td style=width: 55px; height: 18px>
</td>
<td style=height: 18px colspan=3>
&nbsp;<cc1:AutoCompleteExtender ID=AutoCompl
eteExtender1 runat=server ServiceMethod=GetCompletionList
UseContextKey=True TargetControlID=txt
Kime>
</cc1:AutoCompleteExtender>
</td>
</tr>
</table>

</div>
</div>
</asp:Content>

Liste 1.33: Cevapla.aspx sayfas html tasarm.

Bu sayfada mesaj gnderilecek kii kullancnn arkadaysa, mesaj gnderilecek kiinin ad oto-
matik tamamlanacaktr. Cevapla.aspx.cs dosyasna Liste 1.34de belirtilen metodu aynen yazn.

Sayfa ilk yklendiinde mesaja cevap yazlaca iin sessiondan gelen konu bilgisini ilgili textbox
kontrolne yazdrn ve btnGonder butonuna tkland zaman mesaj gnderme kodunu yazn.

protected void Page_Load(object sender, EventArgs e)


{
if (!Page.IsPostBack)
{
if (Session[cevap] != null)
{

txtBaslik.Text = Session[cevap].ToString().
Split(|)[0];
txtKime.Text = Session[cevap].ToString().
Split(|)[1];
}
}
}
protected void btnGonder_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(ConfigurationManage
r.ConnectionStrings[LocalSqlServer].ConnectionString);
44 Proje 1

SqlCommand cmd = new SqlCommand(Insert into mesajla


r(Kimden,Kime,MesajIcerik,Baslik,Tarih) values(@Kimden,dbo.
KullaniciIdAl(@Kime),@MesajIcerik,@Baslik,@Tarih), con);
cmd.Parameters.AddWithValue(@Kimden, Membership.
GetUser(User.Identity.Name).ProviderUserKey);
cmd.Parameters.AddWithValue(@Kime, txtKime.Text);
cmd.Parameters.AddWithValue(@MesajIcerik, txtMesaj.
Text);
cmd.Parameters.AddWithValue(@Baslik, txtBaslik.Text);
cmd.Parameters.AddWithValue(@Tarih, DateTime.Now);

int i = 0;
try
{
con.Open();
i = cmd.ExecuteNonQuery();
}
catch (SqlException ex)
{

throw ex;
}
finally
{
con.Close();
}

if (i == 1)
{
Response.Redirect(~/kullanici/mesajlarim.aspx);
}
}
protected void btnIptal_Click(object sender, EventArgs e)
{
Response.Redirect(~/kullanici/mesajlarim.aspx);
}

Liste 1.34: Cevapla.aspx sayfas Page_Load ve btnGonder button Click olaylar.

Cevapla.aspx sayfas tasarm grnm ekil 1.23de gsterilmitir.


herkesburada.com 45

ekil 1.23: Cevapla.aspx sayfa tasarm grnm.

Bu aamaya kadar yaplanlar test etmek iin uygulamay altrn ve kayt olun. Kendi kendinize
yeni bir mesaj gnderin. Gnderdiiniz mesaj gelen mesajlarda ve giden mesajlarda grnyor
ise, gelen mesajlardaki grnm okunmam mesaj olarak grnyor ve mesaj okuduktan sonra
okundu olarak iaretleniyorsa u ana kadar yaplanlar alyor demektir. Aksi bir durum var ise
yazdnz kodlar test edin.

Kullanclarn kiisel bilgilerini ve profil bilgilerini girebilecekleri bilgiler.aspx sayfasn Kullanici kla-
srne ekleyin. Bu sayfadaki baz bilgiler veritabanndan, dier bilgiler ise web.config dosyasnda
tanmlanan profile zerinden alnacaktr.

ekil 1.24: Bilgiler.aspx sayfa tasarm grnm.


46 Proje 1

Bilgiler.aspx sayfas zerindeki ehir, Eitm Durumu, Meslek ve Tuttuu Takm bilgisi veritaba-
nndan alnyor. Dier bilgiler ise profiledan alnyor.

<%@ Page Language=C# MasterPageFile=~/herkesburada.


master AutoEventWireup=true CodeFile=bilgiler.aspx.cs
Inherits=Kullanici_bilgiler Title=Untitled Page %>

<%@ Register Assembly=System.Web.Extensions, Version=3.5.0.0,


Culture=neutral, PublicKeyToken=31bf3856ad364e35
Namespace=System.Web.UI TagPrefix=asp %>
<%@ Register Src=../Controls/KullaniciSolMenu.ascx TagName=Kul
laniciSolMenu TagPrefix=uc1 %>
<asp:Content ID=Content1 ContentPlaceHolderID=AnaIcerik
Runat=Server>
<div class=SolMenu>
<uc1:KullaniciSolMenu ID=KullaniciSolMenu1 runat=server
/>

</div>
<div class=KullaniciIcerik>
<table style=width: 100%>
<tr>
<td style=width: 280px>
</td>
<td style=width: 530px>
</td>
<td style=width: 494px>
</td>
</tr>
<tr>
<td style=width: 280px; height: 26px;>
Ad :</td>
<td style=width: 530px; height: 26px;>
<asp:TextBox ID=txtAd runat=server
Width=100%></asp:TextBox></td>
<td style=width: 494px; height: 26px;>
</td>
</tr>
<tr>
<td style=width: 280px; height: 26px;>
Soyad :</td>
<td style=width: 530px; height: 26px;>
<asp:TextBox ID=txtSoyad runat=server
Width=100%></asp:TextBox></td>
<td style=width: 494px; height: 26px;>
</td>
herkesburada.com 47

</tr>
<tr>
<td style=width: 280px>
Doum Tarihi :</td>
<td style=width: 530px>
<asp:TextBox ID=txtDogumTarihi runat=server
Width=100%></asp:TextBox></td>
<td style=width: 494px>
</td>
</tr>
<tr>
<td style=width: 280px; height: 24px;>
Cinsiyet</td>
<td style=width: 530px; height: 24px>
<asp:DropDownList ID=drpCinsiyet runat=server>
<asp:ListItem Value=True>Bay</asp:ListItem>
<asp:ListItem Value=False>Bayan</asp:
ListItem>
</asp:DropDownList></td>
<td style=width: 494px; height: 24px;>
</td>
</tr>
<tr>
<td style=width: 280px; height: 1px;>
Yaadnz ehir :
</td>
<td style=width: 530px; height: 1px;>
<asp:DropDownList ID=drpYasadiginizSehir
runat=server DataSourceID=SqlDataSource1
DataTextField=SehirAdi DataValueField=SehirId>
</asp:DropDownList></td>
<td style=width: 494px; height: 1px;>
</td>
</tr>
<tr>
<td style=width: 280px>
Eitim Durumu :
</td>
<td style=width: 530px>
<asp:DropDownList ID=drpEgitimDurumu
runat=server DataSourceID=SqlDataSource2 DataTextField=Egiti
mDurumAdi DataValueField=EgitimDurumId>
</asp:DropDownList></td>
<td style=width: 494px>
</td>
48 Proje 1

</tr>
<tr>
<td style=width: 280px; height: 24px>
Meslek :
</td>
<td style=width: 530px; height: 24px>
<asp:DropDownList ID=drpMeslek runat=server
DataSourceID=SqlDataSource3 DataTextField=MeslekAdi DataValue
Field=MeslekId>
</asp:DropDownList></td>
<td style=width: 494px; height: 24px>
</td>
</tr>
<tr>
<td style=width: 280px>
Fobileriniz :
</td>
<td style=width: 530px>
<asp:TextBox ID=txtFobi runat=server
TextMode=MultiLine Width=100%></asp:TextBox></td>
<td style=width: 494px>
</td>
</tr>
<tr>
<td style=width: 280px>
Hobileriniz :
</td>
<td style=width: 530px>
<asp:TextBox ID=txtHobi runat=server
TextMode=MultiLine Width=100%></asp:TextBox></td>
<td style=width: 494px>
</td>
</tr>
<tr>
<td style=width: 280px; height: 40px;>
Kendinizi Anlatn :
</td>
<td style=width: 530px; height: 40px;>
<asp:TextBox ID=txtHakkinda runat=server
TextMode=MultiLine Width=100%></asp:TextBox></td>
<td style=width: 494px; height: 40px;>
</td>
</tr>
<tr>
<td style=width: 280px>
herkesburada.com 49

Okuduunuz Kitaplar :</td>


<td style=width: 530px>
<asp:TextBox ID=txtOkuduguKitaplar
runat=server TextMode=MultiLine Width=100%></asp:TextBox></
td>
<td style=width: 494px>
</td>
</tr>
<tr>
<td style=width: 280px>
Tuttuunuz Takm :
</td>
<td style=width: 530px>
<asp:DropDownList ID=drpTakim runat=server
DataSourceID=SqlDataSource4 DataTextField=TakimAdi DataValueF
ield=TakimId>
</asp:DropDownList></td>
<td style=width: 494px>
</td>
</tr>
<tr>
<td style=width: 280px; height: 40px;>
Yaptnz Sporlar</td>
<td style=width: 530px; height: 40px;>
<asp:TextBox ID=txtYaptigiSporlar runat=server
TextMode=MultiLine Width=100%></asp:TextBox></td>
<td style=width: 494px; height: 40px;>
</td>
</tr>
<tr>
<td style=width: 280px>
Sigara kullanrmsnz ? :</td>
<td style=width: 530px>
<asp:DropDownList ID=drpSigara runat=server>
<asp:ListItem Value=True>Evet</asp:ListItem>
<asp:ListItem Value=False>Hayr</asp:
ListItem>
</asp:DropDownList></td>
<td style=width: 494px>
</td>
</tr>
<tr>
<td style=width: 280px>
Alkol kullanrmsnz ?&nbsp; :</td>
<td style=width: 530px>
50 Proje 1

<asp:DropDownList ID=drpAlkol runat=server>


<asp:ListItem Value=True>Evet</asp:ListItem>
<asp:ListItem Value=False>Hayr</asp:
ListItem>
</asp:DropDownList></td>
<td style=width: 494px>
</td>
</tr>
<tr>
<td style=width: 280px>
Profilimi Arkadalarm Grsn</td>
<td style=width: 530px><asp:DropDownList
ID=drpYetki runat=server>
<asp:ListItem Value=True>Evet</asp:ListItem>
<asp:ListItem Value=False>Hayr</asp:ListItem>
</asp:DropDownList></td>
<td style=width: 494px>
</td>
</tr>
<tr>
<td style=width: 280px valign=top>
</td>
<td style=width: 530px>
&nbsp;</td>
<td style=width: 494px valign=top>
</td>
</tr>
<tr>
<td style=width: 280px>
</td>
<td style=width: 530px>
<asp:Button ID=btGuncelle runat=server
OnClick=btGuncelle_Click Text=Gncelle /></td>
<td style=width: 494px>
</td>
</tr>
<tr>
<td style=width: 280px>
</td>
<td style=width: 530px>
</td>
<td style=width: 494px>
</td>
</tr>
</table>
herkesburada.com 51

<asp:SqlDataSource ID=SqlDataSource1 runat=server


ConnectionString=<%$ ConnectionStrings:ConStrHerkesBurada %>
SelectCommand=SELECT [SehirId], [SehirAdi] FROM
[Sehirler]></asp:SqlDataSource>
<asp:SqlDataSource ID=SqlDataSource2 runat=server
ConnectionString=<%$ ConnectionStrings:ConStrHerkesBurada %>
SelectCommand=SELECT [EgitimDurumId], [EgitimDurumAdi]
FROM [EgitimDurumlari]>
</asp:SqlDataSource>
<asp:SqlDataSource ID=SqlDataSource3 runat=server
ConnectionString=<%$ ConnectionStrings:ConStrHerkesBurada %>
SelectCommand=SELECT [MeslekId], [MeslekAdi] FROM
[Meslekler]></asp:SqlDataSource>
<asp:SqlDataSource ID=SqlDataSource4 runat=server
ConnectionString=<%$ ConnectionStrings:ConStrHerkesBurada %>
SelectCommand=SELECT [TakimId], [TakimAdi] FROM
[Takimlar] ORDER BY [TakimAdi]></asp:SqlDataSource>
</div>
</asp:Content>

Liste 1.35: Bilgiler.aspx sayfas html grnm.

Sayfa ilk yklendiinde profil bilgilerinin grntlenmesini, guncelle butonuna tkland zaman
profil bilgilerinin gncellenecei Liste 1.36daki kodu Liste.aspx.cs dosyasna yazn.

protected void Page_Load(object sender, EventArgs e)


{
if (!Page.IsPostBack)
{
BilgileriGoster();
}
}

void BilgileriGoster()
{
txtAd.Text = Profile.KisiselBilgiler.Ad;
txtSoyad.Text = Profile.KisiselBilgiler.Soyad;
txtDogumTarihi.Text = Profile.KisiselBilgiler.DogumTarihi.
ToShortDateString();
drpCinsiyet.SelectedValue = Profile.KisiselBilgiler.
Cinsiyet.ToString();

// Eitim Durumu
if (!string.IsNullOrEmpty(Profile.EgitimDurumId))
{
drpEgitimDurumu.SelectedValue = Profile.EgitimDurumId;
}
52 Proje 1

// Takimlar
if (!string.IsNullOrEmpty(Profile.TuttuguTakimId))
{
drpTakim.SelectedValue = Profile.TuttuguTakimId;
}

// ehir
if (!string.IsNullOrEmpty(Profile.KisiselBilgiler.
YasadigiSehirId))
{
drpYasadiginizSehir.SelectedValue = Profile.
KisiselBilgiler.YasadigiSehirId;
}

// Meslek
if (!string.IsNullOrEmpty(Profile.MeslekId))
{
drpMeslek.SelectedValue = Profile.MeslekId;
}

txtYaptigiSporlar.Text = Profile.YaptigiSporlar;
txtFobi.Text = Profile.Fobileri;
txtHobi.Text = Profile.Hobileri;
txtOkuduguKitaplar.Text = Profile.OkuduguKitaplar;
txtHakkinda.Text = Profile.Hakkinda;
drpAlkol.SelectedValue = Profile.AlkolKullanirMi.
ToString();
drpSigara.SelectedValue = Profile.SigaraKullanirMi.
ToString();
drpYetki.SelectedValue = Profile.ProfilYetki.ToString();


protected void btGuncelle_Click(object sender, EventArgs e)
{

Profile.KisiselBilgiler.Ad = txtAd.Text;
Profile.AlkolKullanirMi = Convert.ToBoolean(drpAlkol.
SelectedValue);
Profile.SigaraKullanirMi = Convert.ToBoolean(drpSigara.
SelectedValue);
Profile.Fobileri = txtFobi.Text;
herkesburada.com 53

Profile.Hobileri = txtHobi.Text;
Profile.OkuduguKitaplar = txtOkuduguKitaplar.Text;
Profile.Hakkinda = txtHakkinda.Text;
Profile.KisiselBilgiler.Soyad = txtSoyad.Text;
Profile.KisiselBilgiler.DogumTarihi = Convert.ToDateTime(
txtDogumTarihi.Text);
Profile.KisiselBilgiler.Cinsiyet = Convert.
ToBoolean(drpCinsiyet.SelectedValue);
Profile.YaptigiSporlar = txtYaptigiSporlar.Text;
Profile.KisiselBilgiler.YasadigiSehirId =
drpYasadiginizSehir.SelectedValue;
Profile.MeslekId = drpMeslek.SelectedValue;
Profile.TuttuguTakimId = drpTakim.SelectedValue;
Profile.EgitimDurumId = drpEgitimDurumu.SelectedValue;
Profile.ProfilYetki = Convert.ToBoolean(drpYetki.
SelectedValue);
}

Liste 1.36: Bilgiler.aspx sayfas kod grnm.

Kendi kullanc bilgilerinizi girip bilgiler.aspx sayfasnn durumunu test edin. Profil bilgilerinde kul-
lancnn kendi resmini gncellemesini ve deitirmesini salamak iin Kullanici klasr ierisine
profilresmi.aspx sayfas ekleyin. Default.aspxte yapld gibi sayfay divlere bln. KullaniciSol-
Menu.ascx User Control ierisindeki Image kontrolne link verilmiti. Bu linke tkland zaman
eklenen sayfaya ynlendirilecektir. ProfilResmi.aspx sayfasna gerekli Label ve FileUpload kon-
troln ekleyin.

<%@ Page Language=C# MasterPageFile=~/herkesburada.


master AutoEventWireup=true CodeFile=profilresmi.aspx.cs
Inherits=Kullanici_profilresmi Title=Untitled Page %>
<%@ Register Src=../Controls/KullaniciSolMenu.ascx TagName=Kul
laniciSolMenu TagPrefix=uc1 %>

<asp:Content ID=Content1 ContentPlaceHolderID=AnaIcerik


Runat=Server>
<div class=SolMenu>
<uc1:KullaniciSolMenu ID=KullaniciSolMenu1 runat=server
/>

</div>
<div class=KullaniciIcerik>
<br />
<table style=width: 100%>
<tr>
<td rowspan=5 style=width: 100px>
<center><asp:Image ID=imgUser runat=server
AlternateText=Profil resminiz /></center></td>
<td style=width: 100px>
54 Proje 1

</td>
<td style=width: 100px>
</td>
<td style=width: 100px>
</td>
</tr>
<tr>
<td colspan=3>
Yeni Resim Se</td>
</tr>
<tr>
<td style=width: 100px>
</td>
<td style=width: 100px>
</td>
<td style=width: 100px>
</td>
</tr>
<tr>
<td colspan=2>
<asp:FileUpload ID=FileUpload1 runat=server
Width=345px /></td>
<td style=width: 100px>
</td>
</tr>
<tr>
<td style=width: 100px>
</td>
<td style=width: 100px>
</td>
<td style=width: 100px>
</td>
</tr>
<tr>
<td style=width: 100px>
</td>
<td style=width: 100px>
<asp:Button ID=btnGuncelle runat=server
OnClick=btnGuncelle_Click Text=Gncelle /></td>
<td style=width: 100px>
</td>
<td style=width: 100px>
</td>
</tr>
<tr>
herkesburada.com 55

<td style=width: 100px>


</td>
<td style=width: 100px>
</td>
<td style=width: 100px>
</td>
<td style=width: 100px>
</td>
</tr>
<tr>
<td style=width: 100px>
</td>
<td style=width: 100px>
</td>
<td style=width: 100px>
</td>
<td style=width: 100px>
</td>
</tr>
<tr>
<td style=width: 100px>
</td>
<td style=width: 100px>
</td>
<td style=width: 100px>
</td>
<td style=width: 100px>
</td>
</tr>
</table>

</div>
</asp:Content>

Liste 1.37: ProfilResmi.aspx html tasarm.

Gerekli html tasarm yapldktan sonra ekil 1.25deki grnty elde edeceksiniz.
56 Proje 1

ekil 1.25: ProfilResmi.aspx sayfa tasarm grnm.

Kullanclardan gelecek resimler farkl formatlarda olabilir. rnein bir kullanc kendi resmini *.gif
uzants ile gnderirken, dier kullanc *.jpg olarak gnderebilir. Bu sorun iin elinizde 2 alternatif
vardr. Bunlardan ilki kullancnn gnderdii dosyann uzantsn alp dosyay uzants ile kay-
detmek, dieri ise sabit bir uzant ismi vermektir. Bu uygulama ierisinde kullanc resimleri iin
*.uyeresim olarak bir uzant kullanlr. Herhangi bir resim formatnda olduu srece sabit bir for-
mat sorun karmayacaktr. Bunun haricinde karlalacak olduunuz sorun ise resimlerin isimle-
ridir. Kullanclarn gnderecei resimlerin isimlerini akmayacak ekilde yeniden adlandrmanz
gereklidir, bunun da en iyi yolu GUID kullanmaktr. btnGuncelle button kontrol Click olayna Liste
1.38deki kodu yazn.

protected void btnGuncelle_Click(object sender, EventArgs e)


{
string resimAdi = Guid.NewGuid().ToString();
try
{
FileUpload1.SaveAs(Server.MapPath(~/UyeResimleri/)
+ resimAdi + .uyeResim);
Profile.ProfilResmi = resimAdi + .uyeResim;
Response.Redirect(profilresmi.aspx);

}
catch (HttpException ex)
{
throw ex;
}

}

Liste 1.38: btnGuncelle button Click olay.


herkesburada.com 57

Form ilk yklendiinde mevcut resmi gsterebilmek iin ProfilResmi.aspx sayfasnn Load olayn-
da mevcut resmi gsterin.

protected void Page_Load(object sender, EventArgs e)


{
imgUser.ImageUrl = Server.MapPath(~/UyeResimleri/) +
Profile.ProfilResmi;
}

Liste 1.39: ProfilResmi.aspx Page Load olay.

Arkadalarn profil bilgilerinin ve albmlerinin grlecei ve mesaj gndermeyi salayacak olan


arkadaslarim.aspx sayfasn Kullanici klasrne ekleyin ve Default.aspx sayfasndaki gibi 2 par-
aya bln. Mterinin istediine gre arkada olabilmek iin bir kii dierine arkadalk teklif
edecek yani kontaklarna eklemek iin izin istemi olacak. Teklif etme ilemi ilerleyen blmlerde
yaplacak. lk nce kullancya kendine gelen teklifleri gsterecek olarak kontroller eklenecek.
Daha sonra kullanc listesini gsterecek olan DataList kontrol eklenecek. Bu kontrol ile arkada-
lara mesaj gnderimi, Profil grntleme ve Album grntleme yaplabilecek.

<%@ Page Language=C# MasterPageFile=~/herkesburada.


master AutoEventWireup=true CodeFile=arkadaslarim.aspx.cs
Inherits=Kullanici_arkadaslarim Title=Arkadalarm %>
<%@ Register Src=../Controls/KullaniciSolMenu.ascx TagName=Kul
laniciSolMenu TagPrefix=uc1 %>

<asp:Content ID=Content1 ContentPlaceHolderID=AnaIcerik


Runat=Server>
<div class=SolMenu>
<uc1:KullaniciSolMenu ID=KullaniciSolMenu1 runat=server
/>

</div>
<div class=KullaniciIcerik>
<br />
&nbsp;<asp:LinkButton ID=LinkButton2 runat=server
ForeColor=Blue OnClick=LinkButton2_Click>Gelen Teklifler</
asp:LinkButton>
<asp:LinkButton ID=lnkTeklifSayisi runat=server
ForeColor=Red OnClick=lnkTeklifSayisi_Click></asp:
LinkButton><br />
<br />
<asp:UpdatePanel ID=UpdatePanel1 runat=server>
<ContentTemplate>
<asp:DataList id=dtArkadaslar runat=server ForeColor=#333333
OnItemCommand=dtArkadaslar_ItemCommand Width=632px DataSource
ID=SqlDataSource1 CellPadding=4>
<FooterStyle BackColor=#5D7B9D Font-Bold=True
ForeColor=White></FooterStyle>
58 Proje 1

<AlternatingItemStyle BackColor=White ForeColor=#284775></


AlternatingItemStyle>

<ItemStyle BackColor=#F7F6F3 ForeColor=#333333></ItemStyle>

<SelectedItemStyle BackColor=#E2DED6 Font-Bold=True


ForeColor=#333333></SelectedItemStyle>

<HeaderStyle BackColor=#5D7B9D Font-Bold=True


ForeColor=White></HeaderStyle>
<ItemTemplate>
<table style=width: 100%>
<tr>
<td rowspan=2 style=width: 100px>


<img src=<%# ResimAdres(DataBinder.
Eval(Container.DataItem, UserName).ToString()) %> alt=<%#
Eval(UserName).ToString() %> resmi />
</td>

<td style=width: 100px>
</td>
<td rowspan=3 style=width: 100px
valign=top>
<asp:LinkButton ID=LinkButton3
runat=server ForeColor=Blue CommandName=MesajGonder
CommandArgument=<%# Eval(UserName) %>>Mesaj Gnder</asp:
LinkButton><br />
<asp:LinkButton ID=LinkButton4
runat=server ForeColor=Blue CommandName=Sil
CommandArgument=<%# Eval(KullaniciId) %> OnClientClick=return
confirm(Arkadan silmekten emin misiniz ?)>Sil</asp:
LinkButton><br />
<asp:LinkButton ID=LinkButton1
runat=server
CommandName=AlbumGoruntule
ForeColor=Blue CommandArgument=<%# DataBinder.Eval(Container.
DataItem, UserName)%>>Album Grntle</asp:LinkButton><br />
<asp:LinkButton ID=LinkButton5
runat=server CommandArgument=<%# DataBinder.Eval(Container.
DataItem, UserName) %>
CommandName=ProfilGoruntule
ForeColor=Blue>Profil Grntle</asp:LinkButton></td>
</tr>
<tr>
<td style=width: 100px>
</td>
herkesburada.com 59

</tr>
<tr>
<td style=width: 100px>
&nbsp;<asp:Label ID=UserNameLabel
runat=server Text=<%# Eval(UserName) %>></asp:Label></td>
<td style=width: 100px>
</td>
</tr>
</table>
<br />
<br />

</ItemTemplate>
</asp:DataList><asp:SqlDataSource id=SqlDataSource1
runat=server SelectCommandType=StoredProcedure SelectComm
and=ArkadasListem ConnectionString=<%$ ConnectionStrings:
ConStrHerkesBurada %>>
<SelectParameters>
<asp:SessionParameter Name=UserId
SessionField=UserId />
</SelectParameters>
</asp:SqlDataSource>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</asp:Content>

Liste 1.40: Arkadaslarim.aspx html tasarm grnts.

Sayfann grsel kts ekil 1.26da verilmitir.

ekil 1.26: Arkadaslarim.aspx sayfa kts.


60 Proje 1

Arkadaslarim.aspx sayfas ilk yklendii zaman sayfa zerinde kullancya gelen cevaplanmam
teklif saylarn gstermek iin TeklifSayisi() metodunu yazn ve ekrana teklif saysn yaz-
drn.

protected void Page_Load(object sender, EventArgs e)


{
if (!Page.IsPostBack)
{
TeklifSayisi();
}
}

void TeklifSayisi()
{
SqlConnection con = new SqlConnection(ConfigurationManage
r.ConnectionStrings[LocalSqlServer].ConnectionString);
SqlCommand cmd = new SqlCommand(Select Count(Kim) From
ArkadasListesi where kim=@UserId and OnaylandiMi = False,
con);
cmd.Parameters.AddWithValue(@UserId, Membership.
GetUser(User.Identity.Name).ProviderUserKey);
try
{
con.Open();
int i = Convert.ToInt32(cmd.ExecuteScalar());
if (i > 0)
{
lnkTeklifSayisi.Text = ( + i.ToString() + );
}
else
{
lnkTeklifSayisi.Text = ;
}
}
catch (Exception)
{

throw;
}
finally { con.Close(); }

Liste 1.41: Arkadaslarim.aspx.cs Page_Load olay ve TeklifSayisi metodu.


herkesburada.com 61

lnkTeklifSayisi ismindeki Linkbutton kontrolnn text zellii balangta bo brakld. Eer teklif
varsa Text dolacak ve dolaysyla tklanabilir bir hale gelecek. Eer tklanabiliniyor ise tekliflerim.
aspx sayfasna ynlendirin.

protected void lnkTeklifSayisi_Click(object sender, EventArgs


e)
{
Response.Redirect(~/Kullanici/Tekliflerim.aspx);
}

Liste 1.42: lnkTeklifSayisi linkbutton kontrol Click olay.

Arkadalar listeleyecek olan datalist kontrolnde bir eleman gsterilirken o elemana ait yani, sa-
tra ait bir ilem yaplacak ise RowCommand kullanlmas gerekir. Tanmlanan datalist kontroln-
de birden fazla ilem yaplacak ve yaplacak ilemler CommandName ierisinde tanmlanacak.
rnein:

<asp:LinkButton ID=LinkButton1 runat=server


CommandName=AlbumGoruntule
ForeColor=Blue CommandArgument=<%# DataBinder.Eval(Container.
DataItem, UserName)%>>Album Grntle</asp:LinkButton>

Liste 1.43: rnek bir Datalist Command tanmlamas.

Burada CommandName olarak AlbumGoruntule ismi verildi, Albumu grntlenecek olan kullanc
bilgisi ise CommandArgument ierisinde gnderildi. Bu ekilde Commandlere gre ilem yapa-
cak olan datalistin RowCommand olayn hazrlayn.

protected void dtArkadaslar_ItemCommand(object source,


DataListCommandEventArgs e)
{
if (e.CommandName == MesajGonder)
{
Session[cevap] = + | + e.CommandArgument.
ToString();
Response.Redirect(~/kullanici/cevapla.aspx);
}
else if (e.CommandName == AlbumGoruntule)
{
Response.Redirect(~/kullanici/albumler.aspx?album=
+ e.CommandArgument.ToString());
}
else if (e.CommandName == ProfilGoruntule)
{
Response.Redirect(profildetay.aspx?profil= +
e.CommandArgument.ToString());
}
else
{
62 Proje 1

SqlConnection con = new SqlConnection(ConfigurationMa


nager.ConnectionStrings[LocalSqlServer].ConnectionString);
SqlCommand cmd = new SqlCommand(delete from
ArkadasListesi Where Kim=@Kim And Kimin=@Kimin, con);
cmd.Parameters.AddWithValue(@Kim, new Guid(e.
CommandArgument.ToString()));
cmd.Parameters.AddWithValue(@Kimin, Membership.
GetUser(User.Identity.Name).ProviderUserKey);

try
{
con.Open();
cmd.ExecuteNonQuery();
}
catch (Exception)
{

throw;
}
finally
{
con.Close();
}

dtArkadaslar.DataBind();

}

}

Liste 1.44: dtArkadaslar datalist kontrol ItemCommand olay.

Kullanclarn resimlerini gsterebilmek iin Arkadaslar.aspx.cs ierisine ResimAdres() isminde


metod tanmlayn. Bu metod kullancnn resim adn alp datalist kontrol ierisinde gstermesini
salayacak. Kullancnn profil resmi veritaban yerine kullancnn Profile bilgisi ierisinde tutuldu-
u iin byle bir yntem kullanld.

// Arkada listesinde kullancnn resmini dndrr.


protected string ResimAdres(string username)
{
string resimAdres = Profile.GetProfile(username).
ProfilResmi;
return @../UyeResimleri/ + resimAdres;
}

Liste 1.45: Kullancnn resim adn dndrmeyi salayan metod.


herkesburada.com 63

Bu metod ise DataList ierisinde Liste 1.46daki ekilde kullanld.

<img src=<%# ResimAdres(DataBinder.Eval(Container.DataItem,


UserName).ToString()) %> alt=<%# Eval(UserName).ToString()
%> resmi />

Liste 1.46: Datalist ierisinden metod armak.

Kullancya gelen teklifleri gsterecek olan tekliflerim.aspx sayfasn Kullanici klasrne ekleyin.
Eklenen teliflerim.aspx sayfasnda kullancya gelen teklifler update panel ierisindeki datagrid
kontrol ierisinde gsteriliyor.

<%@ Page Language=C# MasterPageFile=~/herkesburada.


master AutoEventWireup=true CodeFile=tekliflerim.aspx.cs
Inherits=Kullanici_tekliflerim Title=Tekliflerim %>
<%@ Register Src=../Controls/KullaniciSolMenu.ascx TagName=Kul
laniciSolMenu TagPrefix=uc1 %>

<asp:Content ID=Content1 ContentPlaceHolderID=AnaIcerik


Runat=Server>
<div class=SolMenu>
<uc1:KullaniciSolMenu ID=KullaniciSolMenu1 runat=server
/>

</div>
<div class=KullaniciIcerik>
<br />
Teklif listeniz.<br />
<br />
<asp:UpdatePanel ID=UpdatePanel1 runat=server>
<ContentTemplate>
<asp:GridView ID=grdTeklifler runat=server
AllowPaging=True AllowSorting=True
AutoGenerateColumns=False CellPadding=4 DataSourceID=
SqlDataSource1 ForeColor=#333333
GridLines=None Width=606px DataKeyNames=Kim OnR
owCommand=grdTeklifler_RowCommand EmptyDataText=Listenizde
cevapsz teklifiniz bulunmuyor...>
<FooterStyle BackColor=#5D7B9D Font-Bold=True
ForeColor=White />
<Columns>
<asp:HyperLinkField DataNavigateUrlFields=UserName
DataNavigateUrlFormatString=~/kullanici/profildetay.aspx?type=r&
amp;value={0}
DataTextField=UserName HeaderText=Teklifte
Bulunan />
<asp:TemplateField ShowHeader=False>
<ItemTemplate>
64 Proje 1

<asp:LinkButton ID=LinkButton2
runat=server CausesValidation=False CommandName=Onayla
Text=Onayla CommandArgument=<%#
Eval(Kimin) %>></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField ShowHeader=False>
<ItemTemplate>
<asp:LinkButton ID=LinkButton1
runat=server OnClientClick=return
confirm(Bu teklifi reddetmek istediinizden emin misiniz?)
CausesValidation=False CommandName=Sil
CommandArgument=<%# Eval(Kimin) %>
Text=Sil></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<RowStyle BackColor=#F7F6F3 ForeColor=#333333 />
<EditRowStyle BackColor=#999999 />
<SelectedRowStyle BackColor=#E2DED6 Font-Bold=True
ForeColor=#333333 />
<PagerStyle BackColor=#284775 ForeColor=White
HorizontalAlign=Center />
<HeaderStyle BackColor=#5D7B9D Font-Bold=True
ForeColor=White />
<AlternatingRowStyle BackColor=White ForeColor=#284775
/>
</asp:GridView>
<asp:SqlDataSource ID=SqlDataSource1 runat=server
ConnectionString=<%$ ConnectionStrings:ConStrHerkesBurada %>
SelectCommand=SELECT aspnet_Users.UserName,
ArkadasListesi.Kim, ArkadasListesi.Kimin FROM ArkadasListesi
INNER JOIN aspnet_Users &#13;&#10;ON ArkadasListesi.Kimin
= aspnet_Users.UserId WHERE ArkadasListesi.OnaylandiMi =
&#13;&#10;False And (ArkadasListesi.Kim = @UserId)>
<SelectParameters>
<asp:SessionParameter Name=UserId
SessionField=UserId />
</SelectParameters>
</asp:SqlDataSource>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</asp:Content>

Liste 1.47: Tekliflerim.aspx html tasarm.


herkesburada.com 65

Eer kullancnn bir teklifi yoksa Listenizde cevapsz teklifiniz bulunmuyor... mesaj gsterilir.
Bu yazy datagrid kontrolnn EmptyDataText zelliini kullanarak yapn. Gelen teklifi onayla-
mak iin veya silmek iin DataList kontrolnn RowCommand olayn kullann.

protected void grdTeklifler_RowCommand(object sender,


GridViewCommandEventArgs e)
{

SqlConnection con = new SqlConnection(ConfigurationManage


r.ConnectionStrings[LocalSqlServer].ConnectionString);

SqlCommand cmd = new SqlCommand();



if (e.CommandName == Onayla)
{
cmd.CommandText = Update ArkadasListesi Set
OnaylandiMi=True Where Kim=@UserId And Kimin = @Isteyen And
OnaylandiMi=False;
}
else
{
cmd.CommandText = Delete from ArkadasListesi Where
Kim=@UserId And Kimin = @Isteyen And OnaylandiMi=False;

}
cmd.Parameters.AddWithValue(@UserId, new
Guid(Session[UserId].ToString()));
cmd.Parameters.AddWithValue(@Isteyen, e.CommandArgument.
ToString());


cmd.Connection = con;

try
{
con.Open();
cmd.ExecuteNonQuery();
}
catch (SqlException ex)
{

throw ex;
}
finally
{
con.Close();
66 Proje 1

Response.Redirect(tekliflerim.aspx);

Liste 1.48: Teklifleri listeleyen datalist kontrolnn RowCommand olay.

Tekliflerim.aspx sayfasnn grsel kts ekil 1.27de gsterilmitir.

ekil 1.27: Tekliflerim.aspx tasarm grnm.

Arkada listesindeki bir kullancnn profilini grntlemek iin veya arama sonrasnda kan kul-
lanclarn profillerini grntleyebilmek iin profildetay.aspx sayfasn Kullanici klasrne ekleyin.
Kullancnn profilindeki bilgileri gsterecek arayz tasarlayn.

<%@ Page Language=C# MasterPageFile=~/herkesburada.


master AutoEventWireup=true CodeFile=profildetay.aspx.cs
Inherits=Kullanici_profildetay Title=Untitled Page %>
<%@ Register Src=../Controls/KullaniciSolMenu.ascx TagName=Kul
laniciSolMenu TagPrefix=uc1 %>
<asp:Content ID=Content1 ContentPlaceHolderID=AnaIcerik
Runat=Server>
<div class=SolMenu>
<uc1:KullaniciSolMenu ID=KullaniciSolMenu1 runat=server
/>

</div>
<div class=KullaniciIcerik>
<table style=width: 100%>
<tr>
<td style=width: 118px>
herkesburada.com 67

</td>
<td style=width: 365px>
</td>
<td style=width: 494px>
</td>
</tr>
<tr>
<td rowspan=8 style=width: 118px valign=top>
<asp:Image ID=imgProfilResmi runat=server
Height=175px Width=145px /></td>
<td style=width: 365px; height: 12px; valign=top>
Ad :</td>
<td style=width: 530px; height: 12px;>
<asp:Label ID=lblAd runat=server></asp:
Label></td>
</tr>
<tr>
<td style=width: 365px; height: 8px; valign=top>
Soyad :</td>
<td style=width: 530px; height: 8px;>
<asp:Label ID=lblSoyad runat=server></asp:
Label></td>
</tr>
<tr>
<td style=width: 365px valign=top>
Doum Tarihi :</td>
<td style=width: 530px>
<asp:Label ID=lblDogumTarihi runat=server></
asp:Label></td>
</tr>
<tr>
<td style=width: 365px; height: 6px; valign=top>
Cinsiyet :</td>
<td style=width: 530px; height: 6px>
<asp:Label ID=lblCinsiyet runat=server></asp:
Label></td>
</tr>
<tr>
<td style=width: 365px; height: 1px; valign=top>
Yaad ehir :
</td>
<td style=width: 530px; height: 1px;>
<asp:Label ID=lblYasadigiSehir runat=server></
asp:Label></td>
</tr>
68 Proje 1

<tr>
<td style=width: 365px valign=top>
Eitim Durumu :
</td>
<td style=width: 530px>
<asp:Label ID=lblEgitimDurumu runat=server></
asp:Label></td>
</tr>
<tr>
<td style=width: 365px; valign=top>
Meslek :
</td>
<td style=width: 530px;>
<asp:Label ID=lblMeslek runat=server></asp:
Label></td>
</tr>
<tr>
<td style=width: 365px valign=top>
Fobileri :
</td>
<td style=width: 530px>
<asp:Label ID=lblFobileri runat=server></asp:
Label></td>
</tr>
<tr>
<td style=width: 118px>
</td>
<td style=width: 365px valign=top>
Hobileri :
</td>
<td style=width: 530px>
<asp:Label ID=lblHobileri runat=server></asp:
Label></td>
</tr>
<tr>
<td style=width: 118px;>
</td>
<td style=width: 365px; valign=top>
Hakknda :
</td>
<td style=width: 530px;>
<asp:Label ID=lblHakkinda runat=server></asp:
Label></td>
</tr>
<tr>
herkesburada.com 69

<td style=width: 118px>


</td>
<td style=width: 365px valign=top>
Okuduunu Kitaplar :</td>
<td style=width: 530px>
<asp:Label ID=lblOkuduguKitaplar
runat=server></asp:Label></td>
</tr>
<tr>
<td style=width: 118px>
</td>
<td style=width: 365px valign=top>
Tuttuu Takm :
</td>
<td style=width: 530px>
<asp:Label ID=lblTuttuguTakim runat=server></
asp:Label></td>
</tr>
<tr>
<td style=width: 118px;>
</td>
<td style=width: 365px; valign=top>
Yapt Sporlar</td>
<td style=width: 530px;>
<asp:Label ID=lblYaptigiSporlar
runat=server></asp:Label></td>
</tr>
<tr>
<td style=width: 118px>
</td>
<td style=width: 365px valign=top>
Sigara kullanrm ? :</td>
<td style=width: 530px>
<asp:Label ID=lblSigara runat=server></asp:
Label></td>
</tr>
<tr>
<td style=width: 118px>
</td>
<td style=width: 365px valign=top>
Alkol kullanrm ?&nbsp; :</td>
<td style=width: 530px>
<asp:Label ID=lblAlkol runat=server></asp:
Label></td>
</tr>
70 Proje 1

<tr>
<td style=width: 118px>
</td>
<td style=width: 365px>
</td>
<td style=width: 494px>
</td>
</tr>
<tr>
<td style=width: 118px>
</td>
<td style=width: 365px>
</td>
<td style=width: 494px>
</td>
</tr>
<tr>
<td style=width: 118px>
</td>
<td style=width: 365px>
</td>
<td style=width: 494px>
</td>
</tr>
<tr>
<td style=width: 118px>
</td>
<td style=width: 365px>
</td>
<td style=width: 494px>
</td>
</tr>
</table>
&nbsp;&nbsp;
</div>
</asp:Content>

Liste 1.49: ProfilDetay.aspx html tasarm.

Kullancnn baz bilgileri veritabanndan bazlar ise Profile zerinden alnacak. Kullanclarn
veritaban zerinden alnacak bilgileri iin veritaban sunucunuz zerinde KullaniciDetay stored
procedure oluturun.

Create Proc KullaniciDetay


(
@EgitimDurumId int,
herkesburada.com 71

@MeslekId int,
@TakimId int,
@SehirId int
)
AS
DECLARE @Egitim nvarchar(50)
DECLARE @Meslek nvarchar(50)
DECLARE @Takim nvarchar(50)
DECLARE @Sehir nvarchar(50)

Select @Egitim = EgitimDurumAdi From EgitimDurumlari Where


EgitimDurumId = @EgitimDurumId

Select @Meslek = MeslekAdi From Meslekler Where MeslekId = @


MeslekId

Select @Takim = TakimAdi From Takimlar Where TakimId = @TakimId

Select @Sehir = SehirAdi From Sehirler Where SehirId = @SehirId

Select @Egitim As Egitim, @Meslek As Meslek , @Takim as Takim, @


Sehir As Sehir

Liste 1.50: KullaniciDetay.sql stored procedure.

Kullancnn profilini gsterecek metodlar profildetay.aspx.cs dosyasna yazn. Burada dikkat


edilmesi gereken; profili grmek isteyen kullancnn, yani oturum aan kullancnn bu profili gr-
meye yetkisi olup olmamasdr. Eer profili grntlenmek istenen kullanc sadece arkadalar-
nn profili grntlemesine izin verdiyse, profili grntlemek isteyen kiinin arkada listesinde
olup olmadnn kontrolnn yaplmas gerekir. Kullanc profili grntlemeyi salayan kod Liste
1.51de verilmitir.

protected void Page_Load(object sender, EventArgs e)


{
if (Request.QueryString[profil] != null)
{
string kullanici = Request.QueryString[profil];

if (ProfilYetki(kullanici))
{
ProfilGoruntule(kullanici);
}
else
Response.Redirect(arkadaslarim.aspx);
}
else
{
72 Proje 1

Response.Redirect(arkadaslarim.aspx);
}

}
bool ProfilYetki(string kullanici)
{
if (Profile.GetProfile(kullanici).ProfilYetki)
{
SqlConnection con = new SqlConnection(ConfigurationMa
nager.ConnectionStrings[LocalSqlServer].ConnectionString);

SqlDataAdapter da = new SqlDataAdapter(ArkadasListem


, con);
da.SelectCommand.Parameters.AddWithValue(@
UserId,Membership.GetUser(kullanici).ProviderUserKey);
da.SelectCommand.CommandType = CommandType.
StoredProcedure;

DataTable dt = new DataTable();


da.Fill(dt);

bool sonuc = false;


foreach (DataRow dr in dt.Rows)
{
if (dr[Username].ToString() == kullanici)
{
sonuc = true;
}
}

return sonuc;
}
else
return true;
}
void ProfilGoruntule(string kullanici)
{
SqlConnection con = new SqlConnection(ConfigurationManage
r.ConnectionStrings[ConStrHerkesBurada].ConnectionString);
SqlCommand cmd = new SqlCommand(KullaniciDetay,con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue(@EgitimDurumId,Profile.
EgitimDurumId);
cmd.Parameters.AddWithValue(@MeslekId,Profile.MeslekId);
herkesburada.com 73

cmd.Parameters.AddWithValue(@TakimId,Profile.
TuttuguTakimId);
cmd.Parameters.AddWithValue(@SehirId,Profile.
KisiselBilgiler.YasadigiSehirId);
try
{
con.Open();
SqlDataReader rdr = cmd.ExecuteReader();
if (rdr.Read())
{
lblEgitimDurumu.Text = rdr[Egitim].ToString();
lblMeslek.Text = rdr[Meslek].ToString();
lblTuttuguTakim.Text = rdr[Takim].ToString();
lblYasadigiSehir.Text = rdr[Sehir].ToString();
}
}
catch (Exception)
{

throw;
}
finally
{
con.Close();
}

string url = @../UyeResimleri/ + Profile.


GetProfile(kullanici).ProfilResmi;
imgProfilResmi.ImageUrl = url;
lblAd.Text = Profile.GetProfile(kullanici).
KisiselBilgiler.Ad;
lblSoyad.Text = Profile.GetProfile(kullanici).
KisiselBilgiler.Soyad;
lblDogumTarihi.Text = Profile.GetProfile(kullanici).
KisiselBilgiler.DogumTarihi.ToShortDateString();
lblHakkinda.Text = Profile.GetProfile(kullanici).Hakkinda;
lblAlkol.Text = DurumGosterici(Profile.AlkolKullanirMi);
lblCinsiyet.Text = CinsiyetGosterici(Profile.
KisiselBilgiler.Cinsiyet);
lblHobileri.Text = Profile.GetProfile(kullanici).Hobileri;
lblFobileri.Text = Profile.GetProfile(kullanici).Fobileri;
lblOkuduguKitaplar.Text = Profile.GetProfile(kullanici).
OkuduguKitaplar;
lblSigara.Text = DurumGosterici(Profile.SigaraKullanirMi);

74 Proje 1

lblYaptigiSporlar.Text = Profile.GetProfile(kullanici).
YaptigiSporlar;

}
string CinsiyetGosterici(bool cinsiyet)
{
if (!cinsiyet)
return Bay;
else
return Bayan;

}
string DurumGosterici(bool durum)
{
if (durum)
return Evet;
else
return Hayr;
}

Liste 1.51: Profil grntleme kodu. (ProfilDetay.aspx.cs)s

ProfilDetay.aspx sayfasnn tasarm grnm ekil 1.28de verilmitir.

ekil 1.28: ProfilDetay.aspx sayfas tasarm grnm.

Kiisel albm oluturmay salamak ve ynetmek iin Kullanici klasr ierisine albumlerim.aspx
isimli bir sayfa ekleyin. Bu sayfa ierisine aynen mesaj gndermedeki gibi yeni bir albm olu-
herkesburada.com 75

turma linki ekleyin ve bu linkte yeni mesaj gndermedeki gibi popup penceresinde yeni album
sayfas an.

<%@ Page Language=C# MasterPageFile=~/herkesburada.master


AutoEventWireup=true
CodeFile=albumlerim.aspx.cs Inherits=Kullanici_albumlerim
Title=Albmlerim %>

<%@ Register Assembly=System.Web.Extensions, Version=3.5.0.0,


Culture=neutral, PublicKeyToken=31bf3856ad364e35
Namespace=System.Web.UI TagPrefix=asp %>
<%@ Register Src=../Controls/KullaniciSolMenu.ascx TagName=Kul
laniciSolMenu TagPrefix=uc1 %>
<asp:Content ID=Content1 ContentPlaceHolderID=AnaIcerik
runat=Server>
<div class=SolMenu>
<uc1:KullaniciSolMenu ID=KullaniciSolMenu1
runat=server />
</div>
<div class=KullaniciIcerik>

<script language=javascript type=text/javascript>



function YeniMesajGoster()
{

window.open(yenialbum.aspx,yenimesaj,width=350,h
eight=80);

}

</script>

<asp:LinkButton ID=lnkYeniAlbum runat=server OnClient


Click=YeniMesajGoster(); return false;>Yeni Album Olutur</asp:
LinkButton><br />
&nbsp;<asp:UpdatePanel id=UpdatePanel1 runat=server><
contenttemplate>
<asp:GridView ID=grdAlbumler runat=server AutoG
enerateColumns=False CellPadding=4
DataKeyNames=AlbumId EmptyDataText=Tanmlanm
albmnz bulunmuyor
ForeColor=#333333 GridLines=None Width=100%
OnRowDeleting=grdAlbumler_RowDeleting OnRowEditing=
grdAlbumler_RowEditing
OnRowUpdating=grdAlbumler_RowUpdating OnRowCancelin
gEdit=grdAlbumler_RowCancelingEdit>
76 Proje 1

<FooterStyle BackColor=#5D7B9D Font-Bold=True


ForeColor=White />
<RowStyle BackColor=#F7F6F3 ForeColor=#333333 />
<Columns>
<asp:TemplateField>
<EditItemTemplate>
<asp:TextBox ID=txtAlbumAdi
runat=server Text=<%# DataBinder.Eval(Container.
DataItem,AlbumAdi) %> ></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<a href=album.aspx?album=<%# DataBinder.
Eval(Container.DataItem,AlbumId) %>>
<asp:Label ID=lblAlbumAdi
runat=server Text=<%# Eval(AlbumAdi) %> ></asp:Label></a>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField=OlusturulmaTarihi
DataFormatString={0:d} HeaderText=Oluturulma Tarihi
HtmlEncode=False ReadOnly=True SortExpres
sion=OlusturulmaTarihi />
<asp:HyperLinkField DataNavigateUrlFields=albumI
d DataNavigateUrlFormatString=resimekle.aspx?albumId={0}
Text=Resim Ekle />
<asp:TemplateField ShowHeader=False>
<EditItemTemplate>
<asp:LinkButton ID=lnkGuncelle
runat=server CausesValidation=True CommandName=Update
Text=Gncelle>
</asp:LinkButton>
<asp:LinkButton ID=lnkIptal
runat=server CausesValidation=False CommandName=Cancel
Text=ptal></asp:LinkButton>
</EditItemTemplate>
<ItemTemplate>
<asp:LinkButton ID=LinkButton3
runat=server CausesValidation=False CommandName=Edit
Text=Dzenle></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField ShowHeader=False>
<ItemTemplate>
<asp:LinkButton ID=LinkButton1
runat=server
CausesValidation=False
CommandName=Delete OnClientClick=return confirm(Bu albm
herkesburada.com 77

silmek istediinizden eminmisiniz\rAlbm silerseniz albmdeki


resimler de silinecek)
Text=Sil></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<PagerStyle BackColor=#284775 ForeColor=White
HorizontalAlign=Center />
<SelectedRowStyle BackColor=#E2DED6 Font-Bold=True
ForeColor=#333333 />
<HeaderStyle BackColor=#5D7B9D Font-Bold=True
ForeColor=White />
<EditRowStyle BackColor=#999999 />
<AlternatingRowStyle BackColor=White
ForeColor=#284775 />
</asp:GridView></contenttemplate>
</asp:UpdatePanel>
</div>
</asp:Content>

Liste 1.52: Albumlerim.aspx html tasarm.

Yaplan tasarm sonucu albumlerim.aspx sayfas tasarm grnm ekil 1.29da gsterilmitir.

ekil 1.29: albumlerim.aspx sayfas tasarm grnm.

Sayfa ilk yklendiinde gerekli datagrid kontrolne verileri doldurmak iin gerekli kodlar Liste
1.53deki ekilde yazn.

protected void Page_Load(object sender, EventArgs e)


{
if (!Page.IsPostBack)
78 Proje 1

VerileriDoldur();
}
void VerileriDoldur()
{
SqlConnection con = new SqlConnection(ConfigurationManag
er.ConnectionStrings[LocalSqlServer].ConnectionString);
SqlDataAdapter da = new SqlDataAdapter(SELECT
[AlbumId], [AlbumAdi], [KullaniciId], [OlusturulmaTarihi],
[SadeceArkadaslarGorsun] FROM [Albumler] WHERE ([KullaniciId] = @
KullaniciId), con);
da.SelectCommand.Parameters.AddWithValue(@KullaniciId,
Membership.GetUser(User.Identity.Name).ProviderUserKey);
DataTable dt = new DataTable();
da.Fill(dt);

grdAlbumler.DataSource = dt;
grdAlbumler.DataBind();
}
Liste 1.53: albumlerim.aspx sayfasnda album listesini dolduran metodlar.

Albm dzenleme ve silme ilemleri iin grdAlbumler datagridview kontrolnn RowEditing,


RowUpdating, RowCancelEditing ve RowDeleting olaylarna gerekli kodlar Liste 1.54deki ekil-
de yazn.

protected void grdAlbumler_RowEditing(object sender,


GridViewEditEventArgs e)
{
grdAlbumler.EditIndex = e.NewEditIndex;
VerileriDoldur();

}
protected void grdAlbumler_RowCancelingEdit(object sender,
GridViewCancelEditEventArgs e)
{
grdAlbumler.EditIndex = -1;
VerileriDoldur();
}
protected void grdAlbumler_RowUpdating(object sender,
GridViewUpdateEventArgs e)
{
SqlConnection con = new SqlConnection(ConfigurationManage
r.ConnectionStrings[LocalSqlServer].ConnectionString);
SqlCommand cmd = new SqlCommand(update Albumler set
AlbumAdi = @AlbumAdi where albumId=@AlbumId, con);
cmd.Parameters.AddWithValue(@AlbumAdi,
((TextBox)grdAlbumler.Rows[e.RowIndex].FindControl(txtAlbumAdi)
).Text);
herkesburada.com 79

cmd.Parameters.AddWithValue(@AlbumId, new
Guid(grdAlbumler.DataKeys[e.RowIndex].Value.ToString()));
try
{
con.Open();
cmd.ExecuteNonQuery();
}
catch (Exception)
{
throw;
}
finally
{
con.Close();
}
grdAlbumler.EditIndex = -1;
VerileriDoldur();
}
protected void grdAlbumler_RowDeleting(object sender,
GridViewDeleteEventArgs e)
{
SqlConnection con = new SqlConnection(ConfigurationManage
r.ConnectionStrings[LocalSqlServer].ConnectionString);
SqlCommand cmd = new SqlCommand(delete from Albumler
where albumId=@albumId, con);
cmd.Parameters.AddWithValue(@albumId, new
Guid(grdAlbumler.DataKeys[e.RowIndex].Value.ToString()));
try
{
con.Open();
cmd.ExecuteNonQuery();
}
catch (Exception)
{

throw;
}
finally
{
con.Close();
VerileriDoldur();
}
}

Liste 1.54: grdAlbumler datagridview kontrol olaylar.


80 Proje 1

Yeni albm eklemek iin Kullanici klasr ierisine yenialbum.aspx sayfasn ekleyin. Bu sayfay
eklerken yenimesaj.aspx sayfasnda olduu gibi master page setirmeyin. Sayfa ierisinde albm
adnn yazlaca bir textbox kontrol ve albm izninin verilecei bir dropdownlist kontrol ekleyin.
Dropdownlist kontrolne Herkes Grebilsin ve Sadece Arkadalarm olmak zere 2 eleman ekle-
yin ve value zelliklerini true, false verin. Bo braklmamas gereken yerler iin gerekli validation
kontrolleri kullann.

<%@ Page Language=C# AutoEventWireup=true CodeFile=yenialbum.


aspx.cs Inherits=Kullanici_yenialbum %>

<!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN


http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd>

<html xmlns=http://www.w3.org/1999/xhtml >


<head runat=server>
<title>Yeni Albm Olutur</title>
<link href=../Style/Genel.css rel=stylesheet type=text/
css />
<script language=javascript type=text/javascript>

function Kapat()
{
window.opener.location.reload(true);
}
</script>

</head>
<body style=text-align:left onunload=Kapat();>
<form id=form1 runat=server>
<div>
<br />
&nbsp;&nbsp;
<asp:Label ID=Label1 runat=server Text=Album Ad :
></asp:Label>
<asp:TextBox ID=txtAlbum runat=server></asp:
TextBox>&nbsp;
<asp:RequiredFieldValidator ID=RequiredFieldValidator1
runat=server ControlToValidate=txtAlbum
ErrorMessage=Albm adn bo brakmayn>!</asp:Req
uiredFieldValidator><asp:Button ID=btnYeniAlbum runat=server
Text=Olutur OnClick=btnYeniAlbum_Click />&nbsp;&nbsp;<br />
&nbsp;&nbsp; zin:
<asp:DropDownList ID=drpIzinler runat=server>
<asp:ListItem Selected=True Value=False>Herkes
G&#246;rebilsin</asp:ListItem>
herkesburada.com 81

<asp:ListItem Value=True>Sadece Arkadalarm</asp:


ListItem>
</asp:DropDownList><br />
&nbsp;&nbsp;
<asp:Label ID=lblSonuc runat=server Font-Size=Small
ForeColor=Red></asp:Label><br />
<asp:ValidationSummary ID=ValidationSummary1
runat=server ShowMessageBox=True
ShowSummary=False />
</div>
</form>
</body>
</html>

Liste 1.55: Yenialbum.aspx html tasarm.

Bu sayfa ierisinde Kapat isminde bir javascript metodu kullanld. Bu metod sayfa kapatlrken
veya body elementinin unload olay arldnda popup olarak kendini atran sayfay, yani al-
bumlerim.aspx sayfasn yenileyecek ve dolaysyla popup ekrann eklenen albm bilgisi otomatik
olarak albumlerim.aspx sayfasnda grnecek. Bunu salayan ise window.opener.locati-
on.reload(true); kodu yani javascript ile yazlan Kapat metodudur.

btnYeniAlbum button kontrolnn Click olayna Liste 1.56daki kodu yazn.

protected void btnYeniAlbum_Click(object sender, EventArgs e)


{
SqlConnection con = new SqlConnection(ConfigurationManage
r.ConnectionStrings[LocalSqlServer].ConnectionString);
SqlCommand cmd = new SqlCommand(insert into Albumler(A
lbumAdi,KullaniciId, OlusturulmaTarihi,SadeceArkadaslarGorsun)
values(@AlbumAdi,@KullaniciId,@OlusturulmaTarihi,@Izin), con);
cmd.Parameters.AddWithValue(@AlbumAdi, txtAlbum.Text);
cmd.Parameters.AddWithValue(@KullaniciId, Membership.
GetUser(User.Identity.Name).ProviderUserKey);
cmd.Parameters.AddWithValue(@OlusturulmaTarihi,
DateTime.Now);
cmd.Parameters.AddWithValue(@Izin, Convert.
ToBoolean(drpIzinler.SelectedValue));
try
{

con.Open();
int i = cmd.ExecuteNonQuery();
if (i > 0)
{
lblSonuc.Text = Albm eklendi;
}
82 Proje 1

}
catch (Exception ex)
{
throw;
}
finally
{
con.Close();
}

}

Liste 1.56: btnYeniAlbum kontrol Click olay.

Yeni albm ekleme sayfas tasarm grnm ekil 1.30da verilmitir.

Bu aamadan sonra eklenen her albmden sonra bu say-


fay atran albumlerim.aspx sayfas da otomatik olarak
gncellenecek ve yeni eklenen albm eklendii an gr-
necektir. Albumlerim.aspx sayfasnda Resim Ekle buto-
nuna tkland zaman resimekle.aspx sayfasna ynlen-
dirme yapld. Kullanici klasrne resimekle.aspx sayfas
ekleyin ve an. Bu sayfa QueryString ile gelen veriye gre
ekil 1.30: YeniAlbum.aspx tasarm grnm. resim ekleyecek, yani querystringden gelen AlbumIdye
sahip albme resim ekleyecek. Gelen AlbumIdnin istenen
formatta olup olmadn kontrol etmelisiniz. Eer Int32 tipinden AlbumId varsa numeric olup ol-
madnn kontrol edilmesi gerekir. Bu projede AlbumId stun tipi veritabannda uniqueidentifier,
yani C#taki veri tipinde GUIDe karlk gelir. Page_Load olaynda gelen parametrenin GUID olup
olmadn kontrol edin.

protected void Page_Load(object sender, EventArgs e)


{
if (Request.QueryString[albumId] != null)
{
try
{
Guid album = new Guid(Request.
QueryString[albumId]);
}
catch (Exception)
{
Response.Redirect(~/kullanici/albumlerim.aspx);
}
}
else
Response.Redirect(~/kullanici/albumlerim.aspx);
}

Liste 1.57: Resimekle.aspx Page_Load olay QueryString kontrol.


herkesburada.com 83

Kontrol yapldktan sonra sayfa tasarm yapn. ProfilResmi.aspx sayfasndaki tasarma yakn bir
tasarm yapn. Gerekli FileUpload ve dier kontrolleri ekleyin.

<%@ Page Language=C# MasterPageFile=~/herkesburada.


master AutoEventWireup=true CodeFile=resimekle.aspx.cs
Inherits=Kullanici_resimekle Title=Untitled Page %>
<%@ Register Src=../Controls/KullaniciSolMenu.ascx TagName=Kul
laniciSolMenu TagPrefix=uc1 %>

<asp:Content ID=Content1 ContentPlaceHolderID=AnaIcerik


Runat=Server>
<div class=SolMenu>
<uc1:KullaniciSolMenu ID=KullaniciSolMenu1 runat=server
/>

</div>
<div class=KullaniciIcerik>
<br />
<table style=width: 100%>
<tr>
<td style=width: 100px>
<asp:Label ID=lblSonuc runat=server
ForeColor=Red></asp:Label></td>
<td style=width: 100px>
</td>
<td style=width: 100px>
</td>
</tr>
<tr>
<td colspan=3>
Resim Se</td>
</tr>
<tr>
<td style=width: 100px>
</td>
<td style=width: 100px>
</td>
<td style=width: 100px>
</td>
</tr>
<tr>
<td colspan=2>
<asp:FileUpload ID=FileUpload1 runat=server
Width=492px /></td>
<td style=width: 100px>
</td>
84 Proje 1

</tr>
<tr>
<td style=width: 100px>
</td>
<td style=width: 100px>
</td>
<td style=width: 100px>
</td>
</tr>
<tr>
<td style=width: 100px>
<asp:Button ID=btnEkle runat=server
OnClick=btnEkle_Click Text=Ekle Width=156px /></td>
<td style=width: 100px>
</td>
<td style=width: 100px>
</td>
</tr>
<tr>
<td style=width: 100px>
</td>
<td style=width: 100px>
</td>
<td style=width: 100px>
</td>
</tr>
<tr>
<td style=width: 100px>
</td>
<td style=width: 100px>
</td>
<td style=width: 100px>
</td>
</tr>
<tr>
<td style=width: 100px>
</td>
<td style=width: 100px>
</td>
<td style=width: 100px>
</td>
</tr>
</table>

herkesburada.com 85

</div>
</asp:Content>

Liste 1.58: ResimEkle.aspx html tasarm.

Yaplan html tasarm sonucu ortaya kan sayfa ekil 1.31de gsterilmitir.

ekil 1.31: ResimEkle.aspx sayfas tasarm grnm.

Ekle butonuna tkland zaman resmi siteye ykleyecek kodu Liste 1.59daki ekilde yazn.

protected void btnEkle_Click(object sender, EventArgs e)


{
string resimAdi = Guid.NewGuid().ToString();
SqlConnection con = new SqlConnection(ConfigurationManage
r.ConnectionStrings[LocalSqlServer].ConnectionString);
try
{
string resimUrl = Server.MapPath(~/Albumler/) +
resimAdi + .albumresmi;
FileUpload1.SaveAs(resimUrl);

SqlCommand cmd = new SqlCommand(Insert into fotogra


flar(AlbumId,ResimUrl,EklenmeZamani) values(@AlbumId,@ResimUrl,@
EklenmeZamani), con);
cmd.Parameters.AddWithValue(@AlbumId, new
Guid(Request.QueryString[albumId]));
cmd.Parameters.AddWithValue(@ResimUrl, resimAdi+.
albumresmi);
cmd.Parameters.AddWithValue(@EklenmeZamani,
DateTime.Now);
con.Open();
86 Proje 1

cmd.ExecuteNonQuery();
lblSonuc.Text = Resim eklendi;


}
catch (HttpException ex)
{
lblSonuc.Text = Hata olutu;

}
finally
{
con.Close();
}

}

Liste 1.59: ResimEkle.aspx btnEkle button kontrol Click olay.

Albumlerim.aspx sayfasnda listelenen bir albm adna tkland zaman albmdeki resimleri gs-
teren album.aspx sayfasn Kullanici klasrne ekleyin. Eklenen album.aspx sayfasnda da gelen
parametrenin GUID tipinde olup olmadn kontrol edin.

protected void Page_Load(object sender, EventArgs e)


{
if (Request.QueryString[album] != null)
{
try
{
Guid g = new Guid(Request.QueryString[album]);
}
catch
{
Response.Redirect(albumlerim.aspx);

}
}
}

Liste 1.60: Album.aspx Page_Load olay.

Albm ierisindeki resimleri listelemek iin sayfaya gridview ekleyip kullanaca Data Sourceu
yaplandrn. Resim gsterilecei iin TemplateField ierisinde resmi gsterin.

<%@ Page Language=C# MasterPageFile=~/herkesburada.


master AutoEventWireup=true CodeFile=album.aspx.cs
Inherits=Kullanici_album Title=Untitled Page %>
herkesburada.com 87

<%@ Register Src=../Controls/KullaniciSolMenu.ascx TagName=Kul


laniciSolMenu TagPrefix=uc1 %>

<asp:Content ID=Content1 ContentPlaceHolderID=AnaIcerik


Runat=Server>
<div class=SolMenu>
<uc1:KullaniciSolMenu ID=KullaniciSolMenu1 runat=server
/>

</div>
<div class=KullaniciIcerik>
<br />
<asp:Hyperlink ID=lnkYeniResim runat=server
NavigateUrl=resimekle.aspx>Yeni Resim Ekle</asp:Hyperlink><br
/>
<br />
<asp:GridView ID=GridView1 runat=server AutoGenerateColum
ns=False CellPadding=4
DataKeyNames=FotografId DataSourceID=SqlDataSource1
ForeColor=#333333 GridLines=None
Width=100% AllowPaging=True>
<FooterStyle BackColor=#5D7B9D Font-Bold=True
ForeColor=White />
<Columns>
<asp:TemplateField HeaderText=ResimUrl SortExpressi
on=ResimUrl>
<EditItemTemplate>
<asp:TextBox ID=TextBox1 runat=server
Text=<%# Bind(ResimUrl) %>></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<img src=../Albumler/<%# DataBinder.
Eval(Container.DataItem,ResimUrl) %> alt= height=60
width=60 />
</ItemTemplate>
</asp:TemplateField>
<asp:CommandField DeleteText=Sil
ShowDeleteButton=True />
</Columns>
<RowStyle BackColor=#F7F6F3 ForeColor=#333333 />
<EditRowStyle BackColor=#999999 />
<SelectedRowStyle BackColor=#E2DED6 Font-Bold=True
ForeColor=#333333 />
<PagerStyle BackColor=#284775 ForeColor=White
HorizontalAlign=Center />
<HeaderStyle BackColor=#5D7B9D Font-Bold=True
ForeColor=White />
88 Proje 1

<AlternatingRowStyle BackColor=White ForeColor=#284775


/>
</asp:GridView>
<asp:SqlDataSource ID=SqlDataSource1 runat=server
ConnectionString=<%$ ConnectionStrings:ConStrHerkesBurada %>
SelectCommand=SELECT [FotografId], [AlbumId], [ResimUrl],
[EklenmeZamani] FROM [Fotograflar] WHERE ([AlbumId] = @AlbumId)
DeleteCommand=DELETE FROM [Fotograflar] WHERE [FotografId]
= @FotografId InsertCommand=INSERT INTO [Fotograflar]
([FotografId], [AlbumId], [ResimUrl], [EklenmeZamani])
VALUES (@FotografId, @AlbumId, @ResimUrl, @EklenmeZamani)
UpdateCommand=UPDATE [Fotograflar] SET [AlbumId] = @AlbumId,
[ResimUrl] = @ResimUrl, [EklenmeZamani] = @EklenmeZamani WHERE
[FotografId] = @FotografId>
<SelectParameters>
<asp:QueryStringParameter Name=AlbumId
QueryStringField=album Type=String />
</SelectParameters>
<DeleteParameters>
<asp:Parameter Name=FotografId Type=Object />
</DeleteParameters>
<UpdateParameters>
<asp:Parameter Name=AlbumId Type=Object />
<asp:Parameter Name=ResimUrl Type=String />
<asp:Parameter Name=EklenmeZamani Type=DateTime
/>
<asp:Parameter Name=FotografId Type=Object />
</UpdateParameters>
<InsertParameters>
<asp:Parameter Name=FotografId Type=Object />
<asp:Parameter Name=AlbumId Type=Object />
<asp:Parameter Name=ResimUrl Type=String />
<asp:Parameter Name=EklenmeZamani Type=DateTime
/>
</InsertParameters>
</asp:SqlDataSource>
</div>
</asp:Content>

Liste 1.61: Album.aspx html tasarm.

Yaplan html tasarm sonucu Album.aspx sayfas tasarm grnm ekil 1.32de gsterilmi-
tir.
herkesburada.com 89

ekil 1.32: Album.aspx sayfa tasarm grnm.

Arkadaslarim.aspx sayfasndan herhangi bir arkadan albm bilgileri grntlenmek istendii


zaman albmleri grntleyecek olan albumler.aspx sayfasn Kullanici klasrne ekleyin. Bu
sayfa ilk bata albm grntlenmek istenen kullancnn albmleri iin hangi izinleri verdiini
kontrol edecek. Albmlere bakan kii, kullancnn arkada ise hepsi, deilse sadece izinli olan-
lar grntlenecektir. Sayfaya DataList kontrol ekleyerek albmleri listeleyin. Hangi kullancnn
albm olduu bilgisi QueryString zerinden alnacak.

<%@ Page Language=C# MasterPageFile=~/herkesburada.


master AutoEventWireup=true CodeFile=albumler.aspx.cs
Inherits=Kullanici_albumler Title=Kullanc Albmleri %>
<%@ Register Src=../Controls/KullaniciSolMenu.ascx TagName=Kul
laniciSolMenu TagPrefix=uc1 %>

<asp:Content ID=Content1 ContentPlaceHolderID=AnaIcerik


Runat=Server>
<div class=SolMenu>
<uc1:KullaniciSolMenu ID=KullaniciSolMenu1 runat=server
/>

</div>
<div class=KullaniciIcerik>
<br />
<asp:DataList ID=DataList1 runat=server CellPadding=4
DataKeyField=AlbumId ForeColor=#333333 RepeatColumns=5
RepeatDirection=Horizontal
Width=100%>
<FooterStyle BackColor=#5D7B9D Font-Bold=True
ForeColor=White />
90 Proje 1

<AlternatingItemStyle BackColor=White
ForeColor=#284775 />
<ItemStyle BackColor=#F7F6F3 ForeColor=#333333 />
<SelectedItemStyle BackColor=#E2DED6 Font-Bold=True
ForeColor=#333333 />
<HeaderStyle BackColor=#5D7B9D Font-Bold=True
ForeColor=White />
<ItemTemplate>
<img src=../SiteResimleri/ok.gif />
<a href=albumgoruntule.aspx?album=<%# Eval(AlbumId)
%>>
<asp:Label ID=AlbumAdiLabel runat=server Text=<%#
Eval(AlbumAdi) %>></asp:Label></a><br />
</ItemTemplate>
</asp:DataList>
</div>
</asp:Content>

Liste 1.62: Albumler.aspx html tasarm.

Albumler.aspx sayfasnn grsel kts ekil 1.33deki gibidir.

ekil 1.33: Albumler.aspx sayfas tasarm grnm.

Albumler.aspx sayfasna gelen parametrenin doru olup olmadn kontrol edin. Daha sonra
albm grntlemek iin gerekli izin olup olmadnn kontroln yapn.

protected void Page_Load(object sender, EventArgs e)


{
if (Request.QueryString[album] == null)
{
Response.Redirect(arkadaslarim.aspx);
herkesburada.com 91

}
AlbumGoruntule();
}
void AlbumGoruntule()
{
SqlConnection con = new SqlConnection(ConfigurationManage
r.ConnectionStrings[LocalSqlServer].ConnectionString);
SqlDataAdapter da = new SqlDataAdapter(select AlbumId,A
lbumAdi,SadeceArkadaslarGorsun from albumler where kullaniciId =
dbo.KullaniciIdAl(@KullaniciAdi),con);
da.SelectCommand.Parameters.AddWithValue(@KullaniciAdi,
Request.QueryString[album]);
DataTable dt = new DataTable();
da.Fill(dt);

SqlDataAdapter daArkadasListesi = new SqlDataAdapter(Ark


adasListem, con);
daArkadasListesi.SelectCommand.Parameters.AddWithValue(@
UserId, Membership.GetUser(User.Identity.Name).ProviderUserKey);
daArkadasListesi.SelectCommand.CommandType = CommandType.
StoredProcedure;
DataTable dtArkadaslar = new DataTable();
daArkadasListesi.Fill(dtArkadaslar);

bool arkadasmiyiz = false;


for (int i = 0; i < dt.Rows.Count; i++)
{
if (Convert.ToBoolean(dt.Rows[i][SadeceArkadaslarGor
sun]))
{
foreach (DataRow dr2 in dtArkadaslar.Rows)
{
if (dr2[UserName].ToString() == Request.
QueryString[album])
{
arkadasmiyiz = true;
}
}
}

if (!arkadasmiyiz)
dt.Rows.Remove(dt.Rows[i]);

if (dt.Rows.Count == i )
break;
}
92 Proje 1

DataList1.DataSource = dt;
DataList1.DataBind();
}

Liste 1.63: Albumler.aspx Page_Load olay ve AlbumGoruntule metodu.

Uygulama: Seilen albme ait resimleri gsteren albumgoruntule.aspx sayfasn yapn. Gerekli
izinleri kontrol edin.

Kullanclara gsterilen KullaniciSolMenu.ascx User Control an. Kullanc aramak iin btnAra
button kontrolnn Click olayn hazrlayn. Arama kriterini uyeara.aspx sayfasna ynlendirin.

protected void btnAra_Click(object sender, EventArgs e)


{
Response.Redirect(uyeara.aspx?ara= + txtRumuz.Text);
}

ye arama sonularn listeleyecek olan uyeara.aspx sayfasn Kullanici klasrne ekleyin. Kul-
lanc listesini gsterecek olan datalist kontroln ekleyin ve bu kontrol ile kullancya arkadalk
teklif edebilmeyi ve mesaj gndermeyi salayn.

<%@ Page Language=C# MasterPageFile=~/herkesburada.


master AutoEventWireup=true CodeFile=uyeara.aspx.cs
Inherits=Kullanici_uyeara Title=Untitled Page %>
<%@ Register Src=../Controls/KullaniciSolMenu.ascx TagName=Kul
laniciSolMenu TagPrefix=uc1 %>

<asp:Content ID=Content1 ContentPlaceHolderID=AnaIcerik


Runat=Server>
<div class=SolMenu>
<uc1:KullaniciSolMenu ID=KullaniciSolMenu1 runat=server
/>

</div>
<div class=KullaniciIcerik>
&nbsp;<br />
&nbsp;<asp:Label ID=lblSonuc runat=server ForeColor=Red
Text=Aradnz kritere ait kullanc bulunamad
Visible=False></asp:Label><br />
<br />
<asp:DataList ID=dtSonuclar runat=server CellPadding=4
ForeColor=#333333 OnItemCommand=dtSonuclar_ItemCommand
Width=632px>
<FooterStyle BackColor=#5D7B9D Font-Bold=True
ForeColor=White />
<SelectedItemStyle BackColor=#E2DED6 Font-Bold=True
ForeColor=#333333 />
<ItemTemplate>
<table style=width: 100%>
herkesburada.com 93

<tr>
<td rowspan=2 style=width: 100px>
<img alt=<%# Eval(UserName).ToString()
%> resmi src=<%# ResimAdres(DataBinder.Eval(Container.DataItem,
UserName).ToString()) %> />
</td>
<td style=width: 100px>
</td>
<td rowspan=3 style=width: 100px
valign=top>
<asp:LinkButton ID=LinkButton3
runat=server CommandArgument=<%# Eval(UserName) %>
CommandName=MesajGonder
ForeColor=Blue>Mesaj Gnder</asp:LinkButton><br />
<asp:LinkButton ID=LinkButton4
runat=server CommandArgument=<%# Eval(UserName) %>
CommandName=Teklif ForeColor=Blue
>Arkadalk Teklif Et</asp:LinkButton></td>
</tr>
<tr>
<td style=width: 100px>
</td>
</tr>
<tr>
<td style=width: 100px>
&nbsp;<asp:Label ID=UserNameLabel
runat=server Text=<%# Eval(UserName) %>></asp:Label></td>
<td style=width: 100px>
</td>
</tr>
</table>
<br />
<br />
</ItemTemplate>
<AlternatingItemStyle BackColor=White
ForeColor=#284775 />
<ItemStyle BackColor=#F7F6F3 ForeColor=#333333 />
<HeaderStyle BackColor=#5D7B9D Font-Bold=True
ForeColor=White />
</asp:DataList><br />
</div>
</asp:Content>

Liste 1.64: uyeara.aspx sayfas html tasarm.

Uyeara.aspx sayfas tasarm grnm ekil 1.34de gsterilmitir.


94 Proje 1

ekil 1.34: Uyeara.aspx sayfas tasarm grnm.

Kullanclar arama ilemini Membership snf zerinden yapn nk hzl arama ilemi yaplr-
ken ihtiya duyulan sadece kullanc addr. Kullanc listeleyecek olan datalist kontrolnn Item-
Command olaynda ise mesaj gndermeyi ve arkadalk teklif etmeyi salayn.

protected void Page_Load(object sender, EventArgs e)


{
if (Request.QueryString[ara] != null)
{
if (!Page.IsPostBack)
{
VerileriListele(Request.QueryString[ara]);
}
}
}

void VerileriListele(string kriter)


{

MembershipUserCollection kullanicilar = Membership.
GetAllUsers();
ArrayList sonuc = new ArrayList();
foreach (MembershipUser kullanici in kullanicilar)
{
if (kullanici.UserName.StartsWith(kriter) ||
kullanici.UserName.EndsWith(kriter))
{
sonuc.Add(kullanici);
herkesburada.com 95

}
}

dtSonuclar.DataSource = sonuc;
dtSonuclar.DataBind();

if (sonuc.Count == 0)
lblSonuc.Visible = true;
else
lblSonuc.Visible = false;

// Arkada listesinde kullancnn resmini dndrr.


protected string ResimAdres(string username)
{
string resimAdres = Profile.GetProfile(username).
ProfilResmi;
return @../UyeResimleri/ + resimAdres;
}

protected void dtSonuclar_ItemCommand(object source,


DataListCommandEventArgs e)
{
if (e.CommandName == MesajGonder)
{
Session[cevap] = + | + e.CommandArgument.
ToString();
Response.Redirect(~/kullanici/cevapla.aspx);
}
else
{
// Arkadalk teklif et.
SqlConnection con = new SqlConnection(ConfigurationMa
nager.ConnectionStrings[LocalSqlServer].ConnectionString);
SqlCommand cmd = new SqlCommand(insert into Ark
adasListesi(Kim,Kimin,OnaylandiMi,TeklifTarihi) Values(dbo.
KullaniciIdAl(@Kim),@Kimin,@OnaylandiMi,@TeklifTarihi),con);
cmd.Parameters.AddWithValue(@Kim,e.CommandArgument.
ToString());
cmd.Parameters.AddWithValue(@Kimin,Membership.
GetUser(User.Identity.Name).ProviderUserKey);
cmd.Parameters.AddWithValue(@OnaylandiMi,false);
cmd.Parameters.AddWithValue(@TeklifTarihi,DateTime.
Now);
int i = 0;
96 Proje 1

try
{
con.Open();
i = cmd.ExecuteNonQuery();
}
catch (Exception)
{
lblSonuc.Text = Bu kiiye daha nceden teklifte
bulunulmu...;
}
finally
{
con.Close();
}

Liste 1.65: Uyeara.aspx metodlar.

Detayl arama yapabilmek iin Kullanici klasrne detayliarama.aspx isimli bir sayfa ekleyin. Bu
sayfada eitli kriterlere gre arama yaplacak. Detayl arama yapmak iin Liste 1.66 da belirtilen
tasarm yapn.

<%@ Page Language=C# MasterPageFile=~/herkesburada.


master AutoEventWireup=true CodeFile=detayliarama.aspx.cs
Inherits=Kullanici_detayliarama Title=Detayl Arama %>
<%@ Register Src=../Controls/KullaniciSolMenu.ascx TagName=Kul
laniciSolMenu TagPrefix=uc1 %>

<asp:Content ID=Content1 ContentPlaceHolderID=AnaIcerik


Runat=Server>
<div class=SolMenu>
<uc1:KullaniciSolMenu ID=KullaniciSolMenu1 runat=server
/>

</div>
<div class=KullaniciIcerik>

<fieldset style=height: auto; width: auto>


<legend><font style=font-size:smaller>ye Ara</font></legend>
<asp:TextBox ID=txtRumuz runat=server Width=385px Valid
ationGroup=Arama></asp:TextBox>&nbsp;<asp:RequiredFieldValidator
ID=RequiredFieldValidator1 runat=server ControlToVali
date=txtRumuz ErrorMessage=Bo Brakmayn ValidationGroup=Ar
ama></asp:RequiredFieldValidator><br />
herkesburada.com 97

&nbsp;<br />
Fotoraf &nbsp; &nbsp; &nbsp; &nbsp; :
<asp:CheckBox ID=chcSadeceFotografli runat=server
Text=Sadece Fotorafl />&nbsp;<br />
Aranacak Alan:
<asp:CheckBox ID=chcAdSoyad runat=server Text=Ad ve
Soyadn da ara /><br />
Cinsiyet &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;:
<asp:DropDownList ID=drpCinsiyet runat=server>
<asp:ListItem Value=True>Bay</asp:ListItem>
<asp:ListItem Value=False>Bayan</asp:ListItem>
</asp:DropDownList>
<br />
Online &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; :
<asp:DropDownList ID=drpDurum runat=server>
<asp:ListItem Value=false>T&#252;m Kullanclar</asp:
ListItem>
<asp:ListItem Selected=True Value=true>Sadece Online
Olanlar</asp:ListItem>
</asp:DropDownList><br />
<br />
<asp:Button ID=btnAra runat=server Text=Ara
OnClick=btnAra_Click ValidationGroup=Arama /><br /></fieldset>
<asp:DataList ID=DataList1 runat=server CellPadding=4
ForeColor=#333333 OnItemCommand=DataList1_ItemCommand
Width=100%>
<FooterStyle BackColor=#5D7B9D Font-Bold=True
ForeColor=White />
<SelectedItemStyle BackColor=#E2DED6 Font-Bold=True
ForeColor=#333333 />
<ItemTemplate>
<table style=width: 100%>
<tr>
<td rowspan=2 style=width: 100px>
<img alt=<%# Eval(UserName).ToString()
%> resmi src=<%# ResimAdres(DataBinder.Eval(Container.DataItem,
UserName).ToString()) %> />
</td>
<td style=width: 100px>
</td>
<td rowspan=3 style=width: 100px
valign=top>
<asp:LinkButton ID=LinkButton3
runat=server CommandArgument=<%# Eval(UserName) %>
CommandName=MesajGonder
ForeColor=Blue>Mesaj Gnder</asp:LinkButton><br />
98 Proje 1

<asp:LinkButton ID=LinkButton4
runat=server CommandArgument=<%# Eval(UserId) %>
CommandName=Teklif ForeColor=Blue
>Arkadalk Teklif Et</asp:LinkButton></td>
</tr>
<tr>
<td style=width: 100px>
</td>
</tr>
<tr>
<td style=width: 100px>
&nbsp;<asp:Label ID=UserNameLabel
runat=server Text=<%# Eval(UserName) %>></asp:Label></td>
<td style=width: 100px>
</td>
</tr>
</table>
<br />
<br />
</ItemTemplate>
<AlternatingItemStyle BackColor=White
ForeColor=#284775 />
<ItemStyle BackColor=#F7F6F3 ForeColor=#333333 />
<HeaderStyle BackColor=#5D7B9D Font-Bold=True
ForeColor=White />
</asp:DataList></div>
</asp:Content>

Liste 1.66: Detayliarama.aspx html tasarm.

Yaplan html tasarm sonras detayliarama.aspx sayfa tasarm ekil 1.35de verilmitir.

Uygulama: Detayl arama yapmay salayan arama ilemini yapn.

Uygulama ierisinde oluabilecek hatalar, zelletirilen hata sayfalarnda gsterilir. Oluan hatay
sistem yneticisine bildirmek iin uygulamaya Global Application Class dosyas yani, global.asax
dosyas ekleyin. Application_Error olaynda uygulama oluan hatalar mail atar. Oluan hata ise
Server.GetLastError() ile alnr. Application_Error olayn Liste 1.67deki ekilde zelleti-
rin.

try
{
System.Net.Mail.MailMessage mail = new System.Net.Mail.
MailMessage();
mail.From = new System.Net.Mail.MailAddress(hataci@
herkesburada.com);
mail.To.Add(admin@herkesburada.com);
mail.Subject = Site Hatas;
mail.Priority = System.Net.Mail.MailPriority.High;
herkesburada.com 99

mail.Body = Mesaj : + Server.GetLastError().Message


+ Environment.NewLine + Trace : + Server.GetLastError().
StackTrace;
System.Net.Mail.SmtpClient client = new System.Net.
Mail.SmtpClient(localhost);
client.Send(mail);

}
catch (Exception ex)
{
throw ex;
}

ekil 1.35: Detayliarama.aspx sayfa tasarm.

Liste 1.67: Global.asax Application_Error.

Controls klasr ierisine AdminSolMenu.ascx isminde bir User Control ekleyin. Bu menu sadece
admin rolndeki kullanclara gsterilecek. Admin rol grubuna ait kullanclarn dzenleyebilecei
bilgiler iin meny Liste 1.68de gsterildii gibi ekillendirin.

<%@ Control Language=C# AutoEventWireup=true


CodeFile=AdminSolMenu.ascx.cs Inherits=Controls_AdminSolMenu
%>
<fieldset style=width: 129px; height: 69px>
<legend>ye Ara</legend>
<asp:TextBox ID=txtRumuz runat=server Width=125px></
asp:TextBox><br />
&nbsp;<asp:Button ID=btnAra runat=server OnClick=btnAra_
Click Text=Ara /></fieldset>
100 Proje 1

&nbsp;<br />
<br />
<asp:Menu ID=Menu1 runat=server BackColor=#E3EAEB
DynamicHorizontalOffset=2
Font-Names=Verdana Font-Size=0.8em ForeColor=#666666
Height=105px StaticSubMenuIndent=10px
Width=134px>
<StaticMenuItemStyle HorizontalPadding=5px
VerticalPadding=2px />
<DynamicHoverStyle BackColor=#666666 ForeColor=White />
<DynamicMenuStyle BackColor=#E3EAEB />
<StaticSelectedStyle BackColor=#1C5E55 />
<DynamicSelectedStyle BackColor=#1C5E55 />
<DynamicMenuItemStyle HorizontalPadding=5px
VerticalPadding=2px />
<Items>
<asp:MenuItem NavigateUrl=~/Admin/Default.aspx
Text=Admin Ana Sayfa Value=Admin Ana Sayfa>
</asp:MenuItem>
<asp:MenuItem Text=&#220;ye Y&#246;netimi
Value=Mesajlarm>
<asp:MenuItem NavigateUrl=~/Admin/uyeler.aspx
Text=&#220;yeler Value=&#220;yeler>
</asp:MenuItem>
<asp:MenuItem NavigateUrl=~/Admin/albumler.aspx
Text=Alb&#252;mler Value=Alb&#252;mler>
</asp:MenuItem>
</asp:MenuItem>
<asp:MenuItem Text=Tanmlamalar Value=Arkadalarm>
<asp:MenuItem Text=ehirler Value=ehirler
NavigateUrl=~/Admin/sehirler.aspx></asp:MenuItem>
<asp:MenuItem NavigateUrl=~/Admin/takimlar.aspx
Text=Takmlar Value=Takmlar></asp:MenuItem>
<asp:MenuItem Text=Meslekler Value=Meslekler
NavigateUrl=~/Admin/meslekler.aspx></asp:MenuItem>
<asp:MenuItem Text=Eitim Durumlar Value=Eitim
Durumlar NavigateUrl=~/Admin/egitimler.aspx></asp:MenuItem>
</asp:MenuItem>
</Items>
<StaticHoverStyle BackColor=#666666 ForeColor=White />
</asp:Menu>
<br />

Liste 1.68: AdminSolMenu.ascx html tasarm.

Aynen KullaniciSolMenu.ascx User Controlne benzeyen bu menu sayfasnn tasarm grnm


ekil 1.36te gsterilmitir.
herkesburada.com 101

Uygulama ierisine Admin klasr ekleyin. Bu klasr ierisine takimlar.aspx


sayfas ekleyin. Admin klasrne sadece admin rol grubuna ait olan kullan-
clar eriecek ve buradaki sayfalar sayesinde site ynetimi yaplacak. Ekle-
nen takimlar.aspx sayfasnda GridView kontrol sayesinde verileri listeleyin,
DetailsView kontrol sayesinde yeni kayt ekleyin ve gncelleyin.

Takimlar.aspx sayfas html tasarm Liste 1.69da gsterilmitir.

<%@ Page Language=C# MasterPageFile=~/ ekil 1.36: AdminSol-


herkesburada.master AutoEventWireup=true Menu.ascx tasarm g-
CodeFile=takimlar.aspx.cs Inherits=Admin_ rnm.
takimlar Title=Untitled Page %>
<%@ Register Src=../Controls/AdminSolMenu.ascx
TagName=AdminSolMenu TagPrefix=uc1 %>

<asp:Content ID=Content1 ContentPlaceHolderID=AnaIcerik


Runat=Server>
<div class=SolMenu>
<uc1:AdminSolMenu id=AdminSolMenu1 runat=server>
</uc1:AdminSolMenu></div>
<div class=KullaniciIcerik>
<asp:UpdatePanel ID=UpdatePanel1 runat=server>
<ContentTemplate>
<asp:GridView ID=GridView1 runat=server
AllowPaging=True AllowSorting=True
AutoGenerateColumns=False BackColor=White
BorderColor=#DEDFDE BorderStyle=None
BorderWidth=1px CellPadding=4
DataKeyNames=TakimId DataSourceID=SqlDataSource1
ForeColor=Black GridLines=Vertical
Width=512px>
<FooterStyle BackColor=#CCCC99 />
<Columns>
<asp:BoundField DataField=TakimAdi
HeaderText=TakimAdi SortExpression=TakimAdi />
<asp:CommandField CancelText=ptal
DeleteText=Sil EditText=D&#252;zenle InsertText=Ekle
SelectText=Se&#231;
ShowDeleteButton=True ShowEditButton=True UpdateText=G&#252;
ncelle />
</Columns>
<RowStyle BackColor=#F7F7DE />
<SelectedRowStyle BackColor=#CE5D5A Font-
Bold=True ForeColor=White />
<PagerStyle BackColor=#F7F7DE ForeColor=Black
HorizontalAlign=Right />
<HeaderStyle BackColor=#6B696B Font-Bold=True
ForeColor=White />
102 Proje 1

<AlternatingRowStyle BackColor=White />


</asp:GridView>
<asp:LinkButton ID=LinkButton1 runat=server
OnClick=LinkButton1_Click ForeColor=Blue>Yeni</asp:
LinkButton><br />
</ContentTemplate>
</asp:UpdatePanel>
<asp:UpdatePanel ID=UpdatePanel2 runat=server>
<ContentTemplate>
<asp:DetailsView ID=DetailsView1 runat=server
AutoGenerateRows=False CellPadding=4
DataKeyNames=TakimId DataSourceID=SqlDataSourc
e1 ForeColor=#333333 GridLines=None
Height=49px Width=297px OnItemCommand=Detail
sView1_ItemCommand OnItemInserted=DetailsView1_ItemInserted>
<FooterStyle BackColor=#507CD1 Font-Bold=True
ForeColor=White />
<CommandRowStyle BackColor=#D1DDF1 Font-
Bold=True />
<EditRowStyle BackColor=#2461BF />
<RowStyle BackColor=#EFF3FB />
<PagerStyle BackColor=#2461BF ForeColor=White
HorizontalAlign=Center />
<Fields>
<asp:BoundField DataField=TakimAdi
HeaderText=Takm Ad SortExpression=TakimAdi />
<asp:CommandField ShowInsertButton=True
CancelText=ptal InsertText=Ekle />
</Fields>
<FieldHeaderStyle BackColor=#DEE8F5 Font-
Bold=True />
<HeaderStyle BackColor=#507CD1 Font-Bold=True
ForeColor=White />
<AlternatingRowStyle BackColor=White />
</asp:DetailsView>
</ContentTemplate>
</asp:UpdatePanel>
<br />
<asp:SqlDataSource ID=SqlDataSource1 runat=server Conflic
tDetection=CompareAllValues
ConnectionString=<%$ ConnectionStrings:ConStrHerkesBurada
%> DeleteCommand=DELETE FROM [Takimlar] WHERE [TakimId] = @
original_TakimId AND [TakimAdi] = @original_TakimAdi
InsertCommand=INSERT INTO [Takimlar] ([TakimAdi]) VALUES
(@TakimAdi) OldValuesParameterFormatString=original_{0}
SelectCommand=SELECT [TakimId], [TakimAdi] FROM
[Takimlar] UpdateCommand=UPDATE [Takimlar] SET [TakimAdi] = @
herkesburada.com 103

TakimAdi WHERE [TakimId] = @original_TakimId AND [TakimAdi] = @


original_TakimAdi>
<DeleteParameters>
<asp:Parameter Name=original_TakimId Type=Int32
/>
<asp:Parameter Name=original_TakimAdi Type=String
/>
</DeleteParameters>
<UpdateParameters>
<asp:Parameter Name=TakimAdi Type=String />
<asp:Parameter Name=original_TakimId Type=Int32
/>
<asp:Parameter Name=original_TakimAdi Type=String
/>
</UpdateParameters>
<InsertParameters>
<asp:Parameter Name=TakimAdi Type=String />
</InsertParameters>
</asp:SqlDataSource>
</div>
</asp:Content>

Liste 1.69: Admin\Takimlar.aspx sayfas html tasarm.

Html tasarm yaplan takimlar.aspx sayfasnn tasarm grnm ekil 1.37da gsterilmitir.

Uygulama: Takimlar.aspx sayfas haricindeki dier ynetim sayfalarn yapn.

ekil 1.37: Admin\Takimlar.aspx sayfa tasarm grnm.


2 Proje 2: Otobs
Otomasyonu
2 Proje 2: Otobs
Otomasyonu
Genel Bak

Grmeler

Uygulama Tasarm
Proje 2: Otobs Otomasyonu
Genel Bak
Hzl Tur A. Trkiyenin drt bir yanna otobs seferleri dzenleyen bir otobs firmasdr. Yakla-
k olarak bir ay ncesine kadar sadece iki ehre sefer dzenleyen Hzl Tur, artk lkenin drt
bir yanna seferler dzenlemeye balad. imdiye kadar kesilen biletlerin hepsi bilgisayar ortam
olmadan elle kesildii iin takibinde zorluklar yaanyor, mteri kaydnn tutulmamas yzn-
den mteri profili bilinmiyor ve herhangi zel bir promosyon yaplamyor, personel takibinde ve
otobs seferlerinde de karklklar oluuyor. Bu sorunlar zmek iin yeni bir ynetim sistemi
yazlm yaptrlmak isteniyor.

Grmeler
zgr Koluksa (Genel Mdr)
Bugne kadar sadece iki ehre sefer dzenlediimiz iin elle bilet kesmek bize yetiyordu fakat
yaptmz yatrmlar sonucu artk her ehre sefer dzenliyoruz. Mevcut sistem ile bu iin altn-
dan kalkma imkanmz yok ve yeni bir uygulama yazdrmak istiyoruz. Benim zellikle istediim,
herhangi tarih aralnda hangi ehirden hangi ehre ka yolcu gittiini grmektir. Uygulama ie-
risinde iki adet yetki olacak. Bunlardan biri ynetici iin dieri ise bilet kesecek olan banko al-
an iin. Yneticilerin hepsi ayn yetkide olacak, bankoda alacak personelin ise yetkileri ayn
olacak.Bu ayrm sonucu bankoda grevli personel, yani ynetici rolne sahip olmayan personel
bilet ilemleri ve mteri ilemleri yapabilecek, dier ilemleri yapamayacak ve o ilemlere ait
menleri gremeyecek.

Seluk Huysuz (Mteri Hizmetleri Mdr)


Yaplacak temel seferleri, ekstra bir durum ortaya kmad srece 1 aylk olarak planlyoruz.
Mterilerimiz bu 1 aylk sre iinde herhangi bir tarih iin bilet rezervasyonu yaptrabilmeli veya
istedii tarihe bilet al yapabilmeli. Rezervasyon ilemi iin eer rezerve edilmi bilet otobs
kalk zamanndan 10 dakika ncesine kadar alnmamsa rezervasyon otomatik olarak iptal edi-
lecek. Mmkn olan her mterimizin kaydn tutmak istiyoruz. Eer daha nceden bizde kayd
yoksa kayd alnmal fakat bu kural bilet sat veya rezervasyon ilemleri iin zorunlu olmamal.
Telefon ap bilet alacak mteri iin de mteri kart amak zor olduundan direk ad ve soyad ile
ilem yapabilmeliyiz ama eer imkan varsa mteri kart oluturmak istiyoruz. Sistem tarafndan
otomatik olarak verilecek olan kart numaras sayesinde daha sonradan barkod okuyucu kullana-
rak direk o mteriye bilet sat veya rezervasyon yapabilmeliyiz. Kartn asl amac ise belirli bir
sayda bilet alan mterilerimize bilet hediye etmektir. rnein her 10 bilette 1 bilet bedava gibi
ama bu kriter sabit deil ileride belki 7 bilette 1 bilet hediye edebiliriz. Ald her bilet cretinin belli
bir orann mterinin kartna geri ykleyeceiz.Yeterli kredisi olduu zaman bunu kullanabilecek
ama bir artmz var. rnein 40 YTL kredisi var alaca bilet 65 YTL. Eer mevcut kredisi alaca-
biletten az ise kredi kullanm yapamayacak.Mterimizin bu hediye puan kullandktan sonra
bu puan ne zaman kullanm bilgisi iimize yaramyor grmesek de olur sadece bilet satnda
bildirilsin yeter. Detayl yolcu profilimizi grebilmek asndan yolcularmzn ya, cinsiyeti vb. gibi
bilgileri de grmek istiyorum.

Baki okbilmi (Personel Sorumlusu)


Bir bilet sat veya rezervasyonu yaplrken hangi ehirdeki hangi ubeden ilemin gerekletiril-
diini ve hangi personelin bu ilemi gerekletirdiini grebilmeliyim. Her personele bir kullanc
ad ve ifre vermeliyim. Personelin ie balama veya vardiya devralma zamann takip etme zor-
luu yaadmz iin programda kullanc ad ve ifresini girip oturum at saatleri de grmek
istiyorum. Bu sayede hangi personelin hangi ubede hangi saatler arasnda altn bileceim.
Personel takibinin yan sra sefer ilemleri de bana bal.stediim tarihte istediim seferi tanm-
layp, istediim otobs ve ofr grevlendirme imkanm olmal.
108 Proje 2

Vildan Parasever (Muhasebe Sorumlusu)


Mterilerin ald biletlerin gnlk, aylk raporlarn ve otobslerin seferlerde yapt harcama tu-
tarlarn grebilmeliyim. u an iin otoban masraflar, terminal giri k masraflar, yemek cret-
leri ve trafik cezas kalemlerini masraf olarak kabul ediyoruz ama ileride yeni harcama kalemleri
ekleme imkan da olmal.

Uygulama Analizi
Hzl Tur A.nin isteklerine ynelik bir analiz yaplacak olursa;

Farkl ubelerde alan personelin ne zaman hangi ilemi yaptnn kayd tutulacak.
Bilet sat esnasnda eer mteriye bilet sat yaplyorsa mteri kartna kredi yklenecek.
Mterimiz deilse normal sat yaplacak.
Bilet sat esnasnda mterimizin yeterli kredisi varsa krediden dlecek ve bileti cretsiz
alm olacak.
Otobs kaytlar, otobste alan personel kayd ve sefer esnasndaki harcama bilgileri kayt
altna alnacak.
Aylk olarak istenen ehre istenen sefer tanmlamas yaplabilecek.
Uygulama yetki baz alnarak alacak ve yetkilere gre kullanan kiiye baz menler gste-
rilmeyecek.Yetki ise 2 trl olacak.
ube, Sefer, Otobs ve Personel tanmlamalar yaplabilecek.

Uygulama Tasarm
Veritaban Tasarm
Veritaban sunucunuza balanp HizliTur isminde veritaban oluturun.
Veritabannda kullanlacak olan tablolar, veri tipleri ve ek zellikleri ekil 2.1 ile ekil 2.15
arasnda gsterilmekte.

ekil 2.1: OtobusMasraflari tablosu. ekil 2.2: PersonelGirisCikis tablosu.

IslemZamani stunu iin default tanmlayn ve GetDate() olarak verin.

ekil 2.3: Default tanmlamas.


Otobs Otomasyonu 109

ekil 2.4: Seferler tablosu. ekil 2.5: Sehirler tablosu.

ekil 2.6: Subeler tablosu. ekil 2.7: Ayarlar tablosu.

Biletler tablosundaki YolcuId ilemi yaptran kiinin kaytl olup olmadn belirtiyor. Eer YolcuId
mevcut ise o yolcuya belirtilen oranda puan hediye edilecek.

ekil 2.8: Biletler tablosu. ekil 2 9: Calisanlar tablosu.

Biletler tablosundaki SatisTip stunu yaplan satn mterideki kredi kullanlarak m yapldn
belirtiyor. False normal sat, true kredili sat anlamna gelmektedir.

ekil 2.10: CalisanTipleri tablosu. ekil 2.11: Hatalar tablosu.

ekil 2.12: Markalar tablosu. ekil 2.13: MasrafTipleri tablosu.

ekil 2.14: Musteriler tablosu.


110 Proje 2

Tm tablolardaki primary key sutunlarnnn Mteriler tablosundaki KartDurumu stunu mteri-


identity specification Yes yaplmal ve identitty
ye kartn teslim edilip edilmediinin bilgisini tutacak.
increment ve seed 1 olarak belirtilmelidir.
Mteriler tablosundaki MevcutPara stunu mteri-
nin hediye para durumunu tutacak.

Uygulamann baz ayarlar veritaban zerinde tutulmak


zorundadr. Bunun sebebi ise client makine denen u-
belerdeki uygulamalar ilem yaparken sunucu zerinden
bilgileri alp o bilgilere gre ilem yapmaldr. Bu yzden
zm olarak veritaban zerinde ayarlar tablosu tutul-
mu ve bu ayarlar tablosuna sabit deerler girilmitir. Bu
ekil 2.15: Otobusler tablosu.
ekilde farkl ubelerdeki uygulamalarn da belirli ayarla-
ra gre almas salanmtr.

Ayarlar tablonuza mteri satlar iin bir bilete ne kadar puan


aktarm yapacamz belirleyen anahtar tanmlayn. Tanmla-
maktan kast yeni bir kayt girin.
Insert into ayarlar values(BiletGeriOdemeOrani,0,1)
Artk BiletGeriOdemeOrani anahtar veritaban zerinde tanmla-
nan bir ayar olmutur.
Bu anahtar sayesinde program ilk altnda her 10 bilete 1 bilet
hediye edilecek ekilde yaplandrld. Bilet sat esnasnda a-
lacak olan trigger buradaki oran okuyup mterinin hesabna
okunan orana gre puan aktarm yapacak.
14 tablodan oluan veritabann tasarladktan sonra veritaban-
ekil 2.16: Veritaban tablo yaps.
tablo kts ekil 2. 16da gsterilmektedir.

Tablolarn hepsini ayn anda diyagrama ekleyip a- Veritaban tablo tasarm yapldktan sonra HizliTur
lmak kark gelebilir. allacak tablolar tek tek veritabanna yeni bir veritaban diyagram ekleyin.
eklemek diagramda almay kolaylatracaktr.
Tablolarnz diagrama ekleyin.

Oluturulan diagram zerinde Tablo 2.1deki ilikileri yaplandrn.

Tablo 2.1: Veritaban likileri


Kaynak Tablo Kaynak Stun Hedef Tablo Hedef Stun
Markalar MarkaId Otobusler MarkaId
Otobusler OtobusId OtobusMasraflari OtobusId
MasrafTipleri MasrafTipId OtobusMasraflari MasrafTipId
Seferler SeferId OtobusMasraflari SeferId
Sehirler SehirId Seferler KalkisSehirId
Sehirler SehirId Seferler VarisSehirId
Otobusler OtobusId Seferler OtobusId
Calisanlar PersonelId Seferler SoforId
Calisanlar PersonelId Seferler MuavinId
Subeler SubeId Calisanlar SubeId
Sehirler SehirId Subeler SehirId
Sehirler SehirId Musteriler SehirId
Calisanlar PersonelId PersonelGirisCikis PersonelId
Musteriler MusteriId Biletler YolcuId *
Calisanlar PersonelId Biletler IslemiYapanPersonelId
Seferler SeferId Biletler SeferId
CalisanTipleri CalisanTipId Calisanlar CalisanTipId
Otobs Otomasyonu 111

* Bu ilikiyi kurarken Enforce Foreign Key Constraint zel- Veritabannz zerindeki ilikileri gr-
mek iin select * from sys.objects whe-
liini False yapn. Bileti alan kii eer mteri ise MusteriId re type=F sorgusunu yrtebilirsiniz.
kayd girilecek, ama mteriye sat yaplmyorsa bo gei-
lebilecek ve bilgi tutarll zorlanmayacak.

Veritaban diagram ekil 2.17de verilmitir.

ekil 2.17: HizliTur veritaban diagram.

HizliTur veritaban zerinde sa tklayn ve New Query mensne tklayn.


Proje altyapsnda kullanlacak olan standart ilemler iin stored procedure (sakl yordam)
oluturun. Liste 2.1 ile Liste 2.5 arasnda Subeler tablosu rnek alnarak gerekli stored
procedureler oluturulmutur. Dier tablolar iin de ayn yapda ekleme, silme, gncelleme,
tm kaytlar listeleme ve bir kaydn detayn grntleme stored procedureleri oluturun. Bu
ilem sonucu 70 adet stored procedure olacak.

CREATE PROC SubeEkle


(
@SubeAdi nvarchar(50),
@SehirId int
)
AS
INSERT INTO Subeler(SubeAdi,SehirId) VALUES(@SubeAdi,@SehirId)
Liste 2.1: SubeEkle stored procedure.

CREATE PROC SubeGuncelle


(
@SubeId int,
@SubeAdi nvarchar(50),
@SehirId int
)
AS
112 Proje 2

UPDATE Subeler SET SubeAdi = @SubeAdi , SehirId = @SehirId WHERE


SubeId = @SubeId
Liste 2.2: SubeGuncelle stored procedure.

CREATE PROC SubeSil


(
@SubeId int
)
AS
DELETE FROM Subeler Where SubeId = @SubeId
Liste 2.3: SubeSil stored procedure.

CREATE PROC SubeListesi

AS
SELECT SubeId, SubeAdi, SehirId From Subeler
Liste 2.4: SubeListesi stored procedure.

CREATE PROC SubeDetay


(
@SubeId int
)
As
Select SubeId, SubeAdi, SehirId From Subeler Where SubeId = @SubeId

Liste 2.5: SubeDetay stored procedure.

Hazrlanan bu 70 stored procedure yaplacak temel ilemler iin oluturulmutur. Bunlarn ha-
ricinde proje ierisinde farkl ilemleri yapacak stored procedurelere ihtiya duyulacak ,ve bu
stored procedureler yeri geldike oluturulacaktr.

Uygulama Tasarm
Gnmzde uygulama mimarisi, katmanl yap zerine oluturulur. Katmanl yap ayn ilemi ya-
pan kodlar tekrar yazma sorununu ortadan kaldrr. Sonradan yaplan bir deiikliin, uygulama-
nn tamamn direk etkilemesi salanr. Farkl platformlar iin (web, windows) ayn kodlar tekrar
yazmamza gerek kalmaz. Uygulama ynetiminin kolay yaplmasn, oluacak bir sorun esnasn-
da mdahale edilecek yere direk ulam salar. Uygulama testlerinin daha kolay yaplabilmesini
de salar.

Uygulama katman yapsnn belirli bir standard yoktur. eitli katman yaplar kullanlr. Bun-
lardan en yaygn olarak kullanlan Entity Facade yapsdr. Bunun haricinde de eitli yaplar
kullanlr ve bu yaplara Pattern denilir. Bu projede Entity Facade yaps kullanlacaktr. Entity
katmanndan kast veritaban ile uygulama arasnda kullanlacak olan tiplerin (type) tanmland
katmandr. Facade katman ise belirlenen bu tiplerin veritaban ile haberlemesini salayacak
olan katmandr.
Otobs Otomasyonu 113

Visual Studio .Net programn an.


File > New > Project menlerini takip ederek proje oluturma ekrann an.
Project Types blmnden Other Project Types mensn geniletin.
Visual Studio Solutions mensn sein.
Solution ismi olarak HizliTurSln girin. (ekil 2.18 Yeni bo solution oluturma ekran.)

ekil 2.18: Yeni bo solution oluturma ekran.

Oluturulan solutiona yeni bir Class Library


Katmanl bir uygulama tasarlarken namespace isimleri ProjeA-
projesi ekleyip ismini HizliTur.Entity olarak d.Katman (HizliTur.Entity) eklinde tanmlanrsa uygulamann
belirleyin. Bu proje veritaban ilemleri iin yazm ve classlarn anlalrl daha da rahat olacaktr.
kullanlacak olan classlar ve propertyleri
barndracak olan katmandr.

Eklenen projedeki class1 ismindeki class silin. Bir solutiona ilk proje eklendii zaman solution
dosyas (*.sln uzantl dosya) Solution Explorer penceresinde gizlenir. kinci proje eklendii za-
man bu dosya Solution Explorer penceresinde grnr. Bu dosyann srekli grnmesi iin Tools
> Options > Projects and Solutions > Always show solution mens seilmelidir.

Oluturulan solutiona yeni bir Class Library projesi ekleyip ismini HizliTur.Facede oalark belirle-
yin. Bu proje veritaban balantlarnda ekleme, silme vb. ilemleri yapacak olan katmandr.

Eklenen projedeki class1 ismindeki class silin.


Oluturulan solutiona yeni bir windows projesi ekleyip ismini Hiz-
liTur.WinUI olarak belirleyin.
HizliTur.WinUI projeniz zerinde sa tklayn, Set As Startup Pro-
ject mensne tklayn. Bu seenek sayesinde uygulama derlen-
dii zaman (F5 tuuna basld zaman) Startup Project olarak
seilen proje balatlr.
Oluturulan proje kts ekil 2.19da gsterilmitir. ekil 2.19: HizliTurSln proje dos-
ya yaps.
114 Proje 2

Veri Katman Tasarm


HizliTur.Entity Class projesine veritabanndaki her tabloya karlk gelecek bir class, bu class
ierisine her stuna karlk gelecek property oluturun. Class isimlerini tekil olacak ekilde verin.
rnein veritabannda bulunan Subeler tablosu iin olacak class ad Sube olmal. Nesneye daha
sonra deer atamak veya sadece istenen bir property kullanabilmek iin bo bir constructor olu-
turun. Bunun haricinde tek satrda bir nesneye deer atayabilmeyi salamak iin iindeki her pro-
perty iin parametre alan bir constructor oluturun. Bylece tek bir satrda nesneye deer atanm
olacaktr ve daha az yazm olacaktr. rnein Sehir sehir = new Sehir(Ankara);
gibi.

Unutulmamaldr ki isimlendirilen her uzun veritaban stun ad, property, class veya metot daha sonra yine
sizin tarafnzdan yazlacak. Ne kadar uzun isimlendirme veya yanl yap tasarlarsanz o kadar ok kod yazar-
snz fakat ksa isimlendirme olacak diye de ok ksa yazlp anlamsz isimlendirme tekniine gidilmemelidir.

Projede kullanlacak yapya rnek olarak Sube class Liste 2.6da verilmitir.

using System;
using System.Collections.Generic;
using System.Text;

namespace HizliTur.Entity
{
public class Sube
{

private int _SubeId;


private string _SubeAdi;
private int _SehirId;

public int SubeId


{
get { return _SubeId; }
set { _SubeId = value; }
}

public string SubeAdi
{
get { return _SubeAdi; }
set { _SubeAdi = value; }
}

public int SehirId


{
get { return _SehirId; }
set { _SehirId = value; }
Otobs Otomasyonu 115

public Sube()
{

public Sube(int subeId, string subeAdi, int sehirId)


{
this._SubeId = subeId;
this._SubeAdi = subeAdi;
this._SehirId = sehirId;
}

}
}

Liste 2.6: rnek Sube class.

HizliTur.Entity proje kts ekil 2.20de verilmitir.

ekil 2.20: HizliTur.Entity proje kts. ekil 2.21: Referans ekleme.

HizliTur.Facade projesine gein. Bu projenin zerinde sa tklayn .


Add Reference mensne tklayn.
Alan pencereden Projects tabna gein.
HizliTur.Entity proje ktsn sein ve OK butonuna tklayn. (ekil 2. 21)
HizliTur.Facade projenize Util isminde bir class ekleyin. Bu class sklkla yaplan database i-
lemlerinin tek bir noktadan ynetilmesini salayacak. erisindeki Yurut(SqlCommand cmd)
olarak tanmlanan metot SqlCommand tipinden bir parametre alacak ve bu parametrede gelen
komutun(SqlCommand) ExecuteNonQuery() metodunu altracak. Bylece her Exucute-
NonQuery() metodunun kullanlmas gereken metodda, try catch hata yakalama mekanizma-
s kullanlmayacak, tek bir yerde kullanlacak ve ynetim tek bir yerden olacak. Metodun static
yaplmasnn sebebi ise bu metodu kullanabilmek iin bulunduu classn yeni bir instancenn
116 Proje 2

oluturulmasna gerek duyulmamasdr. Bu sayede her Yurut() metodu armnda Util class
tipinden yeni bir instance oluturmaya gerek duyulmaz. Util class ierii Liste 2.7de verilmitir.

using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;

namespace HizliTur.Facade
{
public class Util
{

// Projenin genelinde kullanilacak olan balant


tanimlamasi.
public static string ConnectionString = server=.;
database=HizliTur;Integrated Security=SSPI;pooling=true;Min Pool
Size=100;Max Pool Size=200;

public static int Yurut(SqlCommand cmd)


{
int etkilenenSatirSayisi = -1;
try
{
cmd.Connection.Open();
etkilenenSatirSayisi = cmd.ExecuteNonQuery();
}
catch (SqlException)
{
//throw
}
finally
{
cmd.Connection.Close();
}

return etkilenenSatirSayisi;
}
}
}

Liste 2.7: HizliTur.Facade projesi ierisindeki Util class.

etkilenenSatirSayisi isminde bir deiken tanmlanp dndrlmesinin sebebi etkilenen


satr saysn renebilmektir. Eer ilem ekleme, silme ve gncelleme iin baarl olur ise 1
deeri dnecektir. Eer herhangi bir satr etkilenmez ama sorgu baarl bir ekilde yrtlrse 0
deeri dnecektir. Hata olmas durumunda ise -1 deeri dndrlr. Baarl ilem sonucu etkile-
Otobs Otomasyonu 117

necek satr says 0 ve daha fazla olmal bu yzden eer bir hata olursa -1 dndrlr ki arayz
tarafndan bu hatay yakalayp kullancya hata ile ilgili mesaj gsterilebilsin.

Uygulama gelitirme aamasndayken kullanlan catch scopelar ierisinde throw kullanmak,


oluan hatalarn zlmesi iin ok baarl bir yntemdir. Fakat uygulama gelitirme aamas
tamamlanp production denilen srm ortaya ktktan sonra bu throwlarn silinmesi gerekir ki
kullanclara oluan hatalar kt bir biimde aktarlmasn.

Yazlan binlerce kodun arasnda nerede throw kullanldnn tespiti zor olacaktr. Bunu kolay-
latrmak iin her throw bana #warning nilemci direktifi kullanlrsa derledikten sonra Error
List penceresinde bu ksmlar uyar olarak bize gsterilecek ve ok rahat bir ekilde deiiklikler
yaplabilecektir. rnein:

catch (SqlException ex)


{
#warning Buray Silmeyi Unutma!
throw ex;
}

Oluabilecek hata kaytlarn tutmak iin HizliTur.Facade projesine Hataci isminde bir class ekle-
yin. Hata kaytlarn tutmay salayacak olan YeniHataKaydi(SqlException hata) meto-
dunu yazn. (Liste 2.8)

using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;

namespace HizliTur.Facade
{
public class Hataci
{
public static void YeniHataKaydi(SqlException hata)
{
SqlConnection con = new SqlConnection(Util.
ConnectionString);
SqlCommand cmd = new SqlCommand(HataKaydiEkle,
con);
cmd.CommandType = System.Data.CommandType.
StoredProcedure;
cmd.Parameters.AddWithValue(@Numara,hata.Number);
cmd.Parameters.AddWithValue(@Mesaj,hata.Message);
cmd.Parameters.AddWithValue(@Procedure, hata.
Procedure);
try
{
con.Open();
cmd.ExecuteNonQuery();
}
118 Proje 2

catch (SqlException ex)


{
#warning Silmeyi unutma !
throw ex;
}
finally
{
con.Close();
}

}
}
}

Liste 2.8: Hata kaytlarn tutmay salayan class ve metod.

HizliTur.Facade projesi ierisindeki Util classndaki Yurut metodu ierisindeki catch scopeunu
Liste 2.9daki ekilde deitirin.

catch (SqlException ex)


{
Hataci.YeniHataKaydi(ex);
#warning Silmeyi unutma !
throw;
}

Liste 2.9: rnek hata yakalama mekanizmas.

Bir proje ierisinde kullanlan her metoda Summary bilgisinin yazlmas hangi metodun hangi
amala kullandnn not edilmesini ve projeye daha sonradan katlan programclarn ok abuk
adapte olmalarn salar. Bunun haricinde zellikle dokmantasyon iin SandCastle, Ndoc tarz
programlar bu summary bilgilerine gre yazlan kodlarn dokmantasyonun ok kolay bir ekilde
otomatik karmaktadr. Summary kullanlmad taktirde uygulama dkmantasyonu tek tek elle
yazlmak zorundadr. Proje dkmantasyonu iin SandCastle uygulamas kullanlabilir. (www.
sandcastleproject.org)

HizliTur.Facade projesine her tabloya karlk bir class ekleyin, classlarn isimlerini tekil veri ve
standart ilemler iin (ekleme-silme-gncelleme-tmn listeleme ve detay grntleme) stored
procedurelerini altrp gerekli sonular dndren metodlar yazn. ube ilemlerini yapacak
olan Sube class Liste 2.10da rnek olarak gsterilmitir.

using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Collections;

namespace HizliTur.Facade
{
Otobs Otomasyonu 119

public class Sube


{

public static int Ekle(Entity.Sube sube)
{
SqlConnection con = new SqlConnection(Util.
ConnectionString);
SqlCommand cmd = new SqlCommand(SubeEkle, con);
cmd.CommandType = System.Data.CommandType.
StoredProcedure;

cmd.Parameters.AddWithValue(@SubeAdi, sube.SubeAdi);
cmd.Parameters.AddWithValue(@SehirId, sube.SehirId);

return Util.Yurut(cmd);
}

public static int Guncelle(Entity.Sube sube)


{
SqlConnection con = new SqlConnection(Util.
ConnectionString);
SqlCommand cmd = new SqlCommand(SubeGuncelle, con);
cmd.CommandType = System.Data.CommandType.
StoredProcedure;

cmd.Parameters.AddWithValue(@SubeId,sube.SubeId);
cmd.Parameters.AddWithValue(@SubeAdi,sube.SubeAdi);
cmd.Parameters.AddWithValue(@SehirId,sube.SehirId
);

return Util.Yurut(cmd);
}

public static int Sil(Entity.Sube sube)


{
SqlConnection con = new SqlConnection(Util.
ConnectionString);
SqlCommand cmd = new SqlCommand(SubeSil, con);
cmd.CommandType = System.Data.CommandType.
StoredProcedure;

cmd.Parameters.AddWithValue(@SubeId, sube.SubeId);

return Util.Yurut(cmd);
120 Proje 2

}
public static ArrayList SubeListesi()
{
SqlConnection con = new SqlConnection(Util.
ConnectionString);
SqlCommand cmd = new SqlCommand(SubeListesi, con);
cmd.CommandType = System.Data.CommandType.
StoredProcedure;
ArrayList subeListesi = new ArrayList();
try
{
con.Open();
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
Entity.Sube sube = new Entity.Sube();
sube.SubeId = Convert.ToInt32(rdr[SubeId]);
sube.SubeAdi = rdr[SubeAdi].ToString();
sube.SehirId = Convert.
ToInt32(rdr[SehirId]);

subeListesi.Add(sube);
}
}
catch (SqlException ex)
{

Hataci.YeniHataKaydi(ex);
#warning Silmeyi unutma !
throw;

}

finally
{
con.Close();
}

return subeListesi;
}

public static Entity.Sube DetayGoruntule(int subeId)


{
Otobs Otomasyonu 121

SqlConnection con = new SqlConnection(Util.


ConnectionString);
SqlCommand cmd = new SqlCommand(SubeDetay, con);
cmd.CommandType = System.Data.CommandType.
StoredProcedure;
cmd.Parameters.AddWithValue(@SubeId, subeId);
Entity.Sube sube = null;
try
{
con.Open();
SqlDataReader rdr = cmd.ExecuteReader();
sube = new HizliTur.Entity.Sube();
if (rdr.Read())
{

sube.SehirId = Convert.
ToInt32(rdr[SehirId]);
sube.SubeAdi = rdr[SubeAdi].ToString();
sube.SubeId = Convert.ToInt32(rdr[SubeId]);

}
}
catch (SqlException ex)
{
Hataci.YeniHataKaydi(ex);
#warning Buray Silmeyi Unutma !
throw ex;
}
finally
{
con.Close();
}

return sube;
}
}
}

Liste 2.10: rnek Sube class.

HizliTur.Facade projesi ierisindeki dier classlar da Liste 2.10daki class rnek alarak yaplan-
drn. Veritaban tasarm bal altnda oluturulan standart ilemleri yapan stored procedureleri
altran standart classlar ve metodlar hazrlandktan sonra, daha sonradan kullanlacak metod-
lar yeri geldike classlara eklenecektir.
122 Proje 2

Arayz Tasarm
HizliTur.WinUI projenize gein. References mens zerinde sa tklayn.
Add References mensne tklayn.Projects sekmesinden HizliTur.Entity ve HizliTur.Facade
projelerini sein. OK tuuna basn. Form1 isimli formu FrmMain olarak yeniden adlandrn.
HizliTur.WinUI projesi ierisindeki Form1 ierisine static Entiy.Calisan tipinde global bir dei-
ken oluturun. Bu deiken oturum aan kullancnn bilgisini tutacak.

public static Entity.Calisan calisan = null;

HizliTur.WinUI projenize yeni bir Windows Form ekleyin. smini FrmGiris olarak belirleyin.
Formun Text zelliini Kullanc Girii olarak deitirin ve ekil 2.22deki tasarm yapn.

ekil 2.22: Kullanc giri ekran.

FrmGiris formu zerindeki kontroller ve zellikleri Tablo 2.2de verilmitir.

Tablo 2.2: Kullanc Giri Ekran Kontrolleri


Kontrol zellik zellik Deeri
TextBox Name txtKullaniciAdi
TextBox Name txtSifre
UseSystemPasswordChar True
Label Name lblKullaniciAdi
Text Kullanc Ad:
Label Name lblSifre
Text ifre:
Button Name btnGiris
Text Giri

Kullanclarn giri yapmasn salayan ara yz yaptktan sonra veritaban zerinde kullanc
kontrol yapan CalisanGiris stored proceduren oluturun.

CREATE PROC CalisanGiris


(
@KullaniciAdi nvarchar(15),
@Sifre nvarchar(20)
)
AS
SELECT PersonelId ,YoneticiMi,SubeId,CalisanTipId FROM calisanlar
WHERE KullaniciAdi = @KullaniciAdi And Sifre=@Sifre

Liste 2.11: CalisanGiris stored procedure.


Otobs Otomasyonu 123

Liste 2.11de tanmlanan stored procedure altran Login() metodunu HizliTur.Facade projesi
ierisindeki Calisan classna ekleyin.

public static Entity.Calisan Login(Entity.Calisan calisan)


{

SqlConnection con = new SqlConnection(Util.


ConnectionString);

SqlCommand cmd = new SqlCommand(CalisanGiris, con);


cmd.CommandType = System.Data.CommandType.
StoredProcedure;

cmd.Parameters.AddWithValue(@KullaniciAdi, calisan.
KullaniciAdi);
cmd.Parameters.AddWithValue(@Sifre, calisan.Sifre);
Entity.Calisan donecekCalisan = null;
try
{
con.Open();
SqlDataReader rdr = cmd.ExecuteReader();
if (rdr.Read())
{
donecekCalisan = new HizliTur.Entity.
Calisan();
donecekCalisan.PersonelId = Convert.ToInt32(r
dr[PersonelId]);
donecekCalisan.YoneticiMi = Convert.ToBoolean
(rdr[YoneticiMi]);
donecekCalisan.SubeId = Convert.
ToInt32(rdr[SubeId]);
donecekCalisan.CalisanTipId = Convert.ToInt32
(rdr[CalisanTipId]);
}
}
catch (SqlException ex)
{
Hataci.YeniHataKaydi(ex);
#warning Silmeyi unutma !
throw;
}

finally
{
con.Close();
}
124 Proje 2

return donecekCalisan;
}

Liste 2.12: Calisan class Login metodu.

HizliTur.WinUI projesi ierisindeki FrmGiris formuna geri dnn. btnGiris button kontrolnn
Click olayn hazrlayn HizliTur.Facade.Calisan.Login() metodunu altrn.alan-
larn giri k bilgilerinin de tu-
PersonelGirisCikis tablosunda IslemZamani stununda default deer tanmlan- tulmas istendii iin giri yapan
d iin yazlan stored procedure (PersonelGirisCikisEkle) ve gerekli metod ie-
risinden (Facade.PersonelGirisCikisEkle) IslemZamani parametrelerini kaldrn. kullancnn kaydn gerekli tab-
loya ekleyin.(Liste 2.13)

private void btnGiris_Click(object sender, EventArgs e)


{

Entity.Calisan kullanici = new HizliTur.
Entity.Calisan();
kullanici.KullaniciAdi = txtKullaniciAdi.Text;
kullanici.Sifre = txtSifre.Text;

HizliTur.Entity.Calisan calisanBilgi = HizliTur.


Facade.Calisan.Login(kullanici);

if (calisanBilgi != null)
{
// Personelin oturum acma bilgisini kaydet
Entity.PersonelGirisCikis girisBilgileri = new
HizliTur.Entity.PersonelGirisCikis();
girisBilgileri.PersonelId = calisanBilgi.
PersonelId;
girisBilgileri.IslemTipi = true;
Facade.PersonelGirisCikis.PersonelGirisCikisEkle(
girisBilgileri);

// Oturum acan personeli belirle


FrmMain.calisan = calisanBilgi;
this.DialogResult = DialogResult.OK;
}
else
MessageBox.Show(Kullanc ad veya ifre hatal,
Hata, MessageBoxButtons.OK, MessageBoxIcon.Error);

Liste 2.13: Kullanc giri ilemini yapan btnGiris button kontrol kodu.

FrmMain isimli forma gein. Tablo 2.3de belirtilen zellikleri ayarlayn.


Otobs Otomasyonu 125

Tablo 2.3: FrmMain Formu zellikleri


zellik zellik Deeri
Text Hzl Tur Otobs Otomasyonu
IsMdiContainer True
StartPosition CenterScreen
WindowState Maximized

FrmMain isimli forma gein. FrmMain _Load olaynda FrmGiris formunu ShowDialog() metodu
ile an. Bylece kullanc girii yaplmaz ise uygulama almayacaktr (Liste 2. 14).

private void FrmMain_Load(object sender, EventArgs e)


{
this.Hide();
FrmGiris frm = new FrmGiris();
if (frm.ShowDialog() == DialogResult.OK)
{
this.Show();
}
else
Application.Exit();
}

Liste 2.14: FrmMain Load olay.

Artk uygulamaya giriler sadece kullanc ad ve ifresi belirtilerek yaplabiliyor. Test etmek amal
veritabannda rnek bir kullanc tanmlayn. rnek bir alan tanmlamayabilmek iin nce veri-
taban zerindeki ilikilerden dolay srasyla Sehir, Sube ve CalisanTip tablolarna veri girin daha
sonra alanlar tanmlayn.

FrmMain formuna menu strip ekleyin.Name zelliini anaMenu olarak deitirin.Tablo 2.4de ve-
rildii gibi menleri ekleyin.

Tablo 2.4: FrmMain zerindeki Menler


Menu Eleman Text Name
lemler lemler islemlerMenusu
Bilet Sat biletSatis
Ynetimsel Aralar Ynetimsel Aralar yonetimselAraclar
Sefer lemleri seferIslemleri
ube lemleri subeIslemleri
Personel lemleri personelIslemleri
Otobs lemleri otobusIslemleri
Mteri lemleri musteriIslemleri
Raporlar Raporlar raporIslemleri
Tarih Bazl tarihBazli
Sefer Bazl seferBazli

Program kullanan personelin en fazla yapaca ilem bilet sat olaca iin Bilet Sat men-
sne ksayol tuu olarak F2 tuunu sein. (Bilet Sati mensne sa tklayarak zellikler pence-
resine gein ve ShortCutKeys zelliini F2 olarak deitirin.) Menlerin eklendikten sonraki form
grnts ekil 2.23de grlmektedir.
126 Proje 2

ekil 2.23: FrmMain ekran grnts.

Alan uygulama yetki bazl yaplmakta, yani oturum aan kullancnn yetkisine gre ynetimsel
aralar mens ierisinde baz men elemanlar gsterilmeyecektir. Yetkiye gre men gizlemesi
iin FrmMain ierisine YetkiyeGoreMenuGoster() metodu oluturun ve FrmMain_Load ola-
ynda bu metodu arn. FrmMain son hali Liste 2.15de verilmitir.

public static Entity.Calisan calisan = null;

void YetkiyeGoreMenuGoster()
{
if (!calisan.YoneticiMi)
{
seferIslemleri.Visible = false;
subeIslemleri.Visible = false;
personelIslemleri.Visible = false;
otobusIslemleri.Visible = false;
raporIslemleri.Visible = false;
}
}
private void FrmMain_Load(object sender, EventArgs e)
{
this.Hide();
FrmGiris frm = new FrmGiris();
if (frm.ShowDialog() == DialogResult.OK)
{
this.Show();
YetkiyeGoreMenuGoster();
}
else
Application.Exit();
}

Liste 2.15: FrmMain_Load olay ve YetkiyeGoreMenuGoster metodu.


Otobs Otomasyonu 127

Uygulamada oturum aan ve kapatan kullancnn bilgileri tutulmak istendii iin, uygulamadan
k yaplrken hangi kullancnn k yaptn veritabanna kaydettirin. Bu ilem FrmMain_Clo-
sing olay ierisinde yaplacaktr. Burada calisan deikeninin null olup olmad kontrol edilmitir.
Eer kontrol edilmemi olursa giri ekrannda direk olarak X tuuna baslmas, yani formun ka-
patlmas sonucu yine bu olay alacak ve calisan deikeninin deeri null olduu iin uygulama
hata verecektir. Hata ile karlamamak iin calisan deikeninin deerini kontrol edin.

private void FrmMain_FormClosing(object sender,


FormClosingEventArgs e)
{
if (FrmMain.calisan != null)
{
Entity.PersonelGirisCikis cikisBilgileri = new
HizliTur.Entity.PersonelGirisCikis();
cikisBilgileri.PersonelId = FrmMain.calisan.
PersonelId;
cikisBilgileri.IslemTipi = false;
Facade.PersonelGirisCikis.PersonelGirisCikisEkle(
cikisBilgileri);

}
}

Liste 2.16: FrmMain formu FormClosing olay.

Yaplan proje ierisinde kullanlacak olan form says fazladr. Fazla form barndracak uygulama-
lar ile alrken allacak olan formlar klasrler ierisinde kategoriletirmek uygulama yazmay
kolaylatracaktr. Solution Explorer pencersinde HizliTur.WinUI projesi zerinde sa tklayn Add
> New Folder mensne tklayn. Bu ekilde uygulama ierisine Musteri, Otobus, Personel, Ra-
porlar, Sefer ve Sube klasrleri ekleyin. Uygulamann son hali ekil 2.24de belirtilmitir.

ekil 2.24: HizliTur.WinUI projesi klasr yaps. ekil 2.25: rnek ube ynetim formu.

WinUI projesi ierisinde de artk kullanlacak olan formlar kategorilendirilmitir. Bu kategoriler


altnda gerekli formlar oluturulacak ve klasr isimlerinin getii ekilde yaplandrma ilemleri
yaplacaktr. rnein ube tanmlama ve dzenleme gibi ube ile ilgili tm ilemrleri yapacak
formlar Sube klasrnn ierisine eklenecek.
Uygulama ierisindeki Sube klasrne bir adet Windows Form Bir klasr ierisine eklenen for-
mun namespace bilgisi KlasorAdi.
ekleyin.smini FrmSubeIslemleri verin. ekil 2.25de gsterildii
FormAdi eklinde olacaktr.
tasarm yapn.
128 Proje 2

Form zerindeki kontroller ve zellikleri Tablo 2.5de gsterilmitir.

Tablo 2.5: FrmSubeIslemleri Form Kontrol Listesi


Kontrol zellik Deer
GroupBox Name grpSube
Label Text Mevcut ubeler
Combobox Name cmbSubeListesi
Button Text Yeni
Name btnYeniSube
Label Text ube Ad :
Label Text ehir :
TextBox Name txtSubeAdi
ComboBox Name cmbSehirListesi
Button Text Gncelle
Name btnGuncelle
Button Text ube Sil
Name btnSil

Bir ube tanmlamas yapabilmek iin ehirlere ihtiya duyulur. Veritaban ilikileri yznden form
zerinde mevcut ehirler de listelenmektedir. Form ilk yklendiinde form zerindeki ubeleri ve
ehirleri listeleyecek olan combobox kontrollerini doldurun (Liste 2. 17).

private void FrmSubeIslemleri_Load(object sender, EventArgs e)


{
cmbSehirListesi.DisplayMember = SehirAdi;
cmbSehirListesi.ValueMember = SehirId;
cmbSehirListesi.DataSource = Facade.Sehir.
SehirListesi();

cmbSubeListesi.DisplayMember = SubeAdi;
cmbSubeListesi.ValueMember = SubeId;
cmbSubeListesi.DataSource = Facade.Sube.SubeListesi();

}

Liste 2.17: ube ilemlerini yapmay salayan FrmSubeIslemleri form load.

zerinde ilem yapabilmek iin global Entity.Sube tipinden bir deiken oluturun.

Entity.Sube sube;

Seilen bir ubenin detayn getiren metodu cmbSubeListesi combobox kontrolnn SelectedIn-
dexChanged olaynda arn.

private void cmbSubeListesi_SelectedIndexChanged(object sender,


EventArgs e)
{
Entity.Sube sube = Facade.Sube.DetayGoruntule(Convert.
ToInt32(cmbSubeListesi.SelectedValue));
if (sube != null)
Otobs Otomasyonu 129

{
txtSubeAdi.Text = sube.SubeAdi;
cmbSehirListesi.SelectedValue = sube.SehirId;
}
}

Liste 2.18: ube seme ilemi.

ube bilgisi gncellemeyi salayacak btnGuncelle kontrolnn Click olayn yazn.

private void btnGuncelle_Click(object sender, EventArgs e)


{
sube.SubeAdi = txtSubeAdi.Text;
sube.SehirId = Convert.ToInt32(cmbSehirListesi.
SelectedValue);
sube.SubeId = Convert.ToInt32(cmbSubeListesi.
SelectedValue);
if (Facade.Sube.Guncelle(sube) > 0)
{
FrmSubeIslemleri_Load(null, null);
}
else
{
MessageBox.Show(Hata Olutu);
}
}

Liste 2.19: ube gncelleme ilemi.

ube silmeyi salayan kodu btnSil kontrolnn Click olayna yazn. Eer bu ubeye bal perso-
nel veya baka kaytlar mevcut ise ube silinemeyecektir. Silme esnasnda hata oluursa ekran-
da hata mesaj grnecektir.

private void btnSil_Click(object sender, EventArgs e)


{
if (Facade.Sube.Sil(sube) > 0)
{
MessageBox.Show(ube Silindi);
FrmSubeIslemleri_Load(null, null);
}
else
MessageBox.Show(ube Silinemedi.\rBu ubeye
bal personel olabilir.);

Liste 2.20: ube silme ilemi.


130 Proje 2

Yeni ube ekleyebilmek iin WinUI projesi ierisindeki Sube klasrne FrmYeniSube isminde bir
Windows Form ekleyin.

ekil 2.26: Yeni ube ekleme formu.

ekil 40de belirtilen tasarm iin Tablo 2.6daki kontrolleri ekleyin.

Tablo 2.6: Yeni ube Ekleme Formu zerindeki Kontroller


Kontrol zellik Deer
Label Text ube Ad
Label Text ehir
TextBox Name txtSubeAdi
Combobox Name cmbSehirListesi
Button Name btnEkle
Text Ekle
Button Name btnIptal
Text ptal

Bir ube ekleyebilmek iin ehirlere ihtiya duyulduundan dolay form ilk yklendiinde ehir
listesini combobox kontrolne doldurun.

private void FrmYeniSube_Load(object sender, EventArgs e)


{