Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
Okan Tekeli
Rev: 00
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.
Grmeler3
Uygulama Analizi3
Uygulama Tasarm4
Veritaban Tasarm4
Arayz Tasarm5
Genel Bak107
Grmeler107
Uygulama Tasarm108
Veritaban Tasarm108
Arayz Tasarm122
Uygulama166
Proje 3: DVDDukkani.com169
Grmeler169
Uygulama Tasarm169
Veritaban Tasarm169
Arayz Tasarm172
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.
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.
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
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.
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.
<connectionStrings>
<clear/>
<add name=LocalSqlServer connectionString=server=.;data
base=HerkesBuradaDb;user id=dbUser;password=123/>
</connectionStrings>
Uygulamay yaplandrmak iin Asp.Net Configuration aracn an. Bu arac amak iin Web Site
> Asp.Net Configuration mensn takip edebilirsiniz.
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
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>
<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>
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
<authentication mode=Forms>
<forms defaultUrl=~/kullanici/default.aspx></
forms>
</authentication>
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: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;
}
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)
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.)
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.
kayit.aspx ierisine bir fieldset ekleyin. Eklenecek fieldseti Content Place Holder ierisine ekleyi
unutmayn.
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.
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.
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.
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.
Bir ziyareti web sitesine ilk girdii zaman kullancy karlayacak olan default.aspx sayfasn
uygulamaya ekleyin.
btnKaydol button kontrolnn Click olaynda giri sayfasna ynlendirme yapn. Load olaynda ise
eer kullanc giri yapmsa Kullanici klasrne ynlendirin.
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.
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.
</center>
<center>
Hata olutu ve yneticiye bildirildi.
<br />
leminizi tekrar deneyin.
</center></font>
</asp:Content>
Web.config dosyasn ap oluturulan hata sayfalarn tantn. Artk IIS kendi hata mesajlar yeri-
ne sizin zelletirdiiniz hata sayfalarn (custom error page) gsterecek.
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.
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.
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.
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.
</div>
<div class=KullaniciIcerik>
</div>
</asp:Content>
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.
</div>
<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
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] FROM [Mesajlar] m Inner
Join aspnet_Users a on a.UserId = m.Kime 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: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>
<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
if (!neymis)
{
e.Row.BackColor = Color.Brown;
e.Row.ForeColor = Color.White;
}
}
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.
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();
}
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
AS
BEGIN
Declare @MesajId uniqueidentifier
END
Yeni mesaj gnderebilmek iin Kullanici klasr ierisine yenimesaj.aspx isimli bir sayfa ekleyin
fakat bu sayfay eklerken master page semeyin.
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.
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)
return @userId
end
Arkada listesini doldurduktan sonra yeni mesaj gndermek iin btnGonder button kontrolnn
Click olaynda yeni mesaj gnderme kodlarn yazn.
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);
}
}
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.
<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>
Yeni Mesaj button kontrolnn Click olaynda yenimesaj.aspx sayfasna ynlendirme yapn.
</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> <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.
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();
throw ex;
}
finally { con.Close(); }
}
catch (FormatException ex)
{
Response.Redirect(mesajlarim.aspx);
}
}
}
Okunan mesaj cevaplamak ve silmek iin btnSil ve btnCevapla button kontrol Click olaylarna
Liste 1.32deki kodu ekleyin.
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);
}
btnYanitla button kontrolne tkland zaman ynlendirilecek olan cevapla.aspx sayfasn Kulla-
nici klasrne ekleyin. Sayfay eklerken masterpage setirmeyi unutmayn.
</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
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.
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);
}
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.
Bilgiler.aspx sayfas zerindeki ehir, Eitm Durumu, Meslek ve Tuttuu Takm bilgisi veritaba-
nndan alnyor. Dier bilgiler ise profiledan alnyor.
</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
Sayfa ilk yklendiinde profil bilgilerinin grntlenmesini, guncelle butonuna tkland zaman
profil bilgilerinin gncellenecei Liste 1.36daki kodu Liste.aspx.cs dosyasna yazn.
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);
}
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.
</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
Gerekli html tasarm yapldktan sonra ekil 1.25deki grnty elde edeceksiniz.
56 Proje 1
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.
Form ilk yklendiinde mevcut resmi gsterebilmek iin ProfilResmi.aspx sayfasnn Load olayn-
da mevcut resmi gsterin.
</div>
<div class=KullaniciIcerik>
<br />
<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
</tr>
<tr>
<td style=width: 100px>
<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>
Arkadaslarim.aspx sayfas ilk yklendii zaman sayfa zerinde kullancya gelen cevaplanmam
teklif saylarn gstermek iin TeklifSayisi() metodunu yazn ve ekrana teklif saysn yaz-
drn.
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(); }
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.
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:
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.
try
{
con.Open();
cmd.ExecuteNonQuery();
}
catch (Exception)
{
throw;
}
finally
{
con.Close();
}
dtArkadaslar.DataBind();
}
}
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.
</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 ON ArkadasListesi.Kimin
= aspnet_Users.UserId WHERE ArkadasListesi.OnaylandiMi =
False And (ArkadasListesi.Kim = @UserId)>
<SelectParameters>
<asp:SessionParameter Name=UserId
SessionField=UserId />
</SelectParameters>
</asp:SqlDataSource>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</asp:Content>
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.
cmd.Connection = con;
try
{
con.Open();
cmd.ExecuteNonQuery();
}
catch (SqlException ex)
{
throw ex;
}
finally
{
con.Close();
66 Proje 1
Response.Redirect(tekliflerim.aspx);
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.
</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
<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>
</div>
</asp:Content>
Kullancnn baz bilgileri veritabanndan bazlar ise Profile zerinden alnacak. Kullanclarn
veritaban zerinden alnacak bilgileri iin veritaban sunucunuz zerinde KullaniciDetay stored
procedure oluturun.
@MeslekId int,
@TakimId int,
@SehirId int
)
AS
DECLARE @Egitim nvarchar(50)
DECLARE @Meslek nvarchar(50)
DECLARE @Takim nvarchar(50)
DECLARE @Sehir nvarchar(50)
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);
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();
}
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;
}
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.
Yaplan tasarm sonucu albumlerim.aspx sayfas tasarm grnm ekil 1.29da gsterilmitir.
Sayfa ilk yklendiinde gerekli datagrid kontrolne verileri doldurmak iin gerekli kodlar Liste
1.53deki ekilde yazn.
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.
}
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();
}
}
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.
function Kapat()
{
window.opener.location.reload(true);
}
</script>
</head>
<body style=text-align:left onunload=Kapat();>
<form id=form1 runat=server>
<div>
<br />
<asp:Label ID=Label1 runat=server Text=Album Ad :
></asp:Label>
<asp:TextBox ID=txtAlbum runat=server></asp:
TextBox>
<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 /> <br />
zin:
<asp:DropDownList ID=drpIzinler runat=server>
<asp:ListItem Selected=True Value=False>Herkes
Görebilsin</asp:ListItem>
herkesburada.com 81
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.
con.Open();
int i = cmd.ExecuteNonQuery();
if (i > 0)
{
lblSonuc.Text = Albm eklendi;
}
82 Proje 1
}
catch (Exception ex)
{
throw;
}
finally
{
con.Close();
}
}
Kontrol yapldktan sonra sayfa tasarm yapn. ProfilResmi.aspx sayfasndaki tasarma yakn bir
tasarm yapn. Gerekli FileUpload ve dier kontrolleri ekleyin.
</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>
Yaplan html tasarm sonucu ortaya kan sayfa ekil 1.31de gsterilmitir.
Ekle butonuna tkland zaman resmi siteye ykleyecek kodu Liste 1.59daki ekilde yazn.
cmd.ExecuteNonQuery();
lblSonuc.Text = Resim eklendi;
}
catch (HttpException ex)
{
lblSonuc.Text = Hata olutu;
}
finally
{
con.Close();
}
}
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.
Albm ierisindeki resimleri listelemek iin sayfaya gridview ekleyip kullanaca Data Sourceu
yaplandrn. Resim gsterilecei iin TemplateField ierisinde resmi gsterin.
</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
Yaplan html tasarm sonucu Album.aspx sayfas tasarm grnm ekil 1.32de gsterilmi-
tir.
herkesburada.com 89
</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>
Albumler.aspx sayfasna gelen parametrenin doru olup olmadn kontrol edin. Daha sonra
albm grntlemek iin gerekli izin olup olmadnn kontroln yapn.
}
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);
if (!arkadasmiyiz)
dt.Rows.Remove(dt.Rows[i]);
if (dt.Rows.Count == i )
break;
}
92 Proje 1
DataList1.DataSource = dt;
DataList1.DataBind();
}
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.
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.
</div>
<div class=KullaniciIcerik>
<br />
<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>
<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>
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.
}
}
dtSonuclar.DataSource = sonuc;
dtSonuclar.DataBind();
if (sonuc.Count == 0)
lblSonuc.Visible = true;
else
lblSonuc.Visible = false;
try
{
con.Open();
i = cmd.ExecuteNonQuery();
}
catch (Exception)
{
lblSonuc.Text = Bu kiiye daha nceden teklifte
bulunulmu...;
}
finally
{
con.Close();
}
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.
</div>
<div class=KullaniciIcerik>
<br />
Fotoraf :
<asp:CheckBox ID=chcSadeceFotografli runat=server
Text=Sadece Fotorafl /> <br />
Aranacak Alan:
<asp:CheckBox ID=chcAdSoyad runat=server Text=Ad ve
Soyadn da ara /><br />
Cinsiyet :
<asp:DropDownList ID=drpCinsiyet runat=server>
<asp:ListItem Value=True>Bay</asp:ListItem>
<asp:ListItem Value=False>Bayan</asp:ListItem>
</asp:DropDownList>
<br />
Online :
<asp:DropDownList ID=drpDurum runat=server>
<asp:ListItem Value=false>Tü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>
<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>
Yaplan html tasarm sonras detayliarama.aspx sayfa tasarm ekil 1.35de verilmitir.
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
}
catch (Exception ex)
{
throw ex;
}
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.
<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=Üye Yönetimi
Value=Mesajlarm>
<asp:MenuItem NavigateUrl=~/Admin/uyeler.aspx
Text=Üyeler Value=Üyeler>
</asp:MenuItem>
<asp:MenuItem NavigateUrl=~/Admin/albumler.aspx
Text=Albümler Value=Albü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 />
Html tasarm yaplan takimlar.aspx sayfasnn tasarm grnm ekil 1.37da gsterilmitir.
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.
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.
Biletler tablosundaki YolcuId ilemi yaptran kiinin kaytl olup olmadn belirtiyor. Eer YolcuId
mevcut ise o yolcuya belirtilen oranda puan hediye edilecek.
Biletler tablosundaki SatisTip stunu yaplan satn mterideki kredi kullanlarak m yapldn
belirtiyor. False normal sat, true kredili sat anlamna gelmektedir.
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.
* 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.
AS
SELECT SubeId, SubeAdi, SehirId From Subeler
Liste 2.4: SubeListesi 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
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.
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
{
public Sube()
{
}
}
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
{
return etkilenenSatirSayisi;
}
}
}
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.
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:
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
HizliTur.Facade projesi ierisindeki Util classndaki Yurut metodu ierisindeki catch scopeunu
Liste 2.9daki ekilde deitirin.
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
cmd.Parameters.AddWithValue(@SubeAdi, sube.SubeAdi);
cmd.Parameters.AddWithValue(@SehirId, sube.SehirId);
return Util.Yurut(cmd);
}
cmd.Parameters.AddWithValue(@SubeId,sube.SubeId);
cmd.Parameters.AddWithValue(@SubeAdi,sube.SubeAdi);
cmd.Parameters.AddWithValue(@SehirId,sube.SehirId
);
return Util.Yurut(cmd);
}
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;
}
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;
}
}
}
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.
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.
Kullanclarn giri yapmasn salayan ara yz yaptktan sonra veritaban zerinde kullanc
kontrol yapan CalisanGiris stored proceduren oluturun.
Liste 2.11de tanmlanan stored procedure altran Login() metodunu HizliTur.Facade projesi
ierisindeki Calisan classna ekleyin.
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;
}
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)
Liste 2.13: Kullanc giri ilemini yapan btnGiris button kontrol kodu.
FrmMain isimli forma gein. FrmMain _Load olaynda FrmGiris formunu ShowDialog() metodu
ile an. Bylece kullanc girii yaplmaz ise uygulama almayacaktr (Liste 2. 14).
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.
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
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.
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();
}
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.
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.
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).
cmbSubeListesi.DisplayMember = SubeAdi;
cmbSubeListesi.ValueMember = SubeId;
cmbSubeListesi.DataSource = Facade.Sube.SubeListesi();
}
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.
{
txtSubeAdi.Text = sube.SubeAdi;
cmbSehirListesi.SelectedValue = sube.SehirId;
}
}
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.
Yeni ube ekleyebilmek iin WinUI projesi ierisindeki Sube klasrne FrmYeniSube isminde bir
Windows Form ekleyin.
Bir ube ekleyebilmek iin ehirlere ihtiya duyulduundan dolay form ilk yklendiinde ehir
listesini combobox kontrolne doldurun.