26 Kas 2006 ASP.NET 2.0 ile Mail Gönderme Kategori: ASP.NET Etiketler: ASP.NETASP.NET 2.0 3 Yorum ASP.NET’ den önce mail göndermek için bir mail componentine(bileşenine) ihtiyaç duyuyorduk. Ama .net ile gelen yenilikler sayesinde herhangi bir componente(bileşene) ihtiyaç duymadan Sadece Mail Sınıfını Projemizde dahil ederek mail gönderme işlemimizi gerçekleştirebiliriz.System.Web.Mail System.Web System System.Web.Mail Altında 6 adet sınıf bulunmaktadır, bu sınıflar CdoNtsHelper CdoSysHelper LateBoundAccessHelper MailAttachment MailMessage SmtpMail Evet sınıfımızı tanıdıktan sonra mail atma isleminin nasıl yaptıgına geçelim. Bunun için Visual Studio .net'i açalım ve yeni bir web projesi olusturalım. Projemize 5 adet label, 4 adet textbox, 1 adet de buton ekliyoruz. Daha Sonra formumuzu kendimize göre dizayn edelim. Benim yapmıs oldugum Form Tasarımı asagıdaki gibidir. Formumuz olusturduktan sonra artık mailimizi gönderme islemimize geçebiliriz. Bunun için ilk yapmamız gereken System.Web.Mail Sınıfını projemize eklememiz gerekir. using System.Web.Mail; Evet projemize Mail sınıfımızı ekledigimize göre artık mail göndermek için gerekli voidimizide yazabiliriz. Not= Mail gönderme islemini bir void seklinde olusturarak farklı sayfalarda kullanabiliriz. System.Web.Message message ; public void SendMesaj(string MessageFrom, string MessageTo, string MessageSubject, string MessageBody) { message.From = MessageFrom; message.To = MessageTo; message.Subject = MessageSubject; message.Body = MessageBody; try { lblUyari.Text = "Mail Gitti"; SmtpMail.Send(message); } catch (Exception ex) { lblUyari.Text = "Mail Gönderirken Bi Problem Olu?tu:" + ex.Message; } } Maili göndermek için gerekli voidi olusturduktan sonra butona ait event'a gidip sadece bu voidi oradan çagırmak kalacak. protected void btnGonder_Click(object sender, EventArgs e) { SendMesaj(txtGonderen.Text, txtAlici.Text, txtKonu.Text, txtMesaj.Text); } Evet kodumuzu tamamladıktan sonra ilk mailimizi gönderelim, web projemizi çalıstıralım bilgileri girelim ve mailimizi gönderelim. Gönder butotuna tıklıyoruz ve sonuç asagıda. Evet simdi mail kutumuza gidelim ve mailin gelip gelmedigini kontrol edelim Görüldügü gibi mailimiz basarı ile gönderilmistir. Evet arkadaslar bir sonraki makalemizde görüsmek üzere. Umarım Faydalı bir makale olmustur. Herkese Basarılar diliyorum.
26 Kas 2006 DATALİST İLE NUMERİC BAZLI SAYFALAMA Kategori: ASP.NET Etiketler: ASP.NETASP.NET 2.0ASP.NET 4.0 7 Yorum Merhaba arkadaşlar bu makalemde Datalist nesnesinde Numeric(1.2.3...) bazlı sayfalamanın nasıl yapılacağına bakacağız. Datalist ve Repeater nesnelerin de görüntülenecek kayıt sayısının çok fazla oldugu durumlar da kayıtlarımızı sayfalama ihtiyacı duyarız. Bu bize kayıtların daha hızlı görüntülenmesini saglar ve aynı zamanda kullanıcıya gösterilmek istenilen bilgi daha derli toplu gösterilir. Ben bu makalede sayfaları Numeric olarak listeletecegim ve gitmek istedigimiz sayfaya tıkladıgımızda o sayfaya gidebilecegiz. Örnek vermek gerekirse google' da "sem göksu" diye arama yaptıgımızda sayfaların Numeric olarak listelendigini görecegiz. Ön bilgiyi verdikten sonra makalemize baslayabiliriz. Bunun için projemize ilk olarak bir adet Datalist nesnesi ekleyelim. Datalist nesnesinde ben Northwind database'deki Customers tablosunu kullanacagım. Datalist nesnesi içerisinde de CustomerID, CompanyName ve ContactName Fieldlerini görüntüleyecegim. Benim düzenlemis oldugum Datalist Nesnesinin son hali asagıdaki gibidir; DatalistNesnesinin HTML Kodları; <asp:DataList ID="DataList1" runat="server" BackColor="White" BorderColor="#E7E7FF" BorderStyle="None" BorderWidth="1px" CellPadding="3" Font-Names="Verdana" Font-Size="X-Small" GridLines="Horizontal" RepeatLayout="Flow"> <FooterStyle BackColor="#B5C7DE" ForeColor="#4A3C8C" /> <SelectedItemStyle BackColor="#738A9C" Font-Bold="True" ForeColor="#F7F7F7" /> <ItemTemplate> <table border="0" cellpadding="0" cellspacing="0" style="width: 392px"> <tr> <td style="width: 129px; height: 19px"> <asp:Label ID="Label3" runat="server" Font-Bold="True" Font-Names="Tahoma" Font-Size="Small" Text="Customer ID"></asp:Label></td> <td style="width: 17px; height: 19px"> :</td> <td style="width: 300px; height: 19px"> <asp:Label ID="lblCustomerID" Text=’<%# DataBinder.Eval(Container.DataItem,"CustomerID") %>’ runat="server" Font-Names="Tahoma" Font-Size="Small"></asp:Label></td> </tr> <tr> <td style="width: 129px; height: 19px"> <asp:Label ID="Label2" runat="server" Font-Bold="True" Font-Names="Tahoma" Font-Size="Small" Text="Company Name"></asp:Label></td> <td style="width: 17px; height: 19px"> .</td> <td style="width: 300px; height: 19px"> <asp:Label ID="lblCompanyName" runat="server" Text=’<%# DataBinder.Eval(Container.DataItem,"CompanyName") %>’ Font-Names="Tahoma" Font-Size="Small"></asp:Label></td> </tr> <tr> <td style="width: 129px; height: 19px"> <asp:Label ID="Label1" runat="server" Font-Bold="True" Font-Names="Tahoma" Font-Size="Small" Text="Contact Name"></asp:Label></td> <td style="width: 17px; height: 19px"> :</td> <td style="width: 300px; height: 19px"> <asp:Label ID="lblContactName" runat="server" Font-Names="Tahoma" Text=’<%# DataBinder.Eval(Container.DataItem,"ContactName") %>’ Font-Size="Small"></asp:Label></td> </tr> <tr> <td style="width: 129px; height: 19px"> </td> <td style="width: 17px; height: 19px"> </td> <td align="right" style="width: 300px; height: 19px"> </tr> </table> </ItemTemplate> <AlternatingItemStyle BackColor="#F7F7F7" /> <HeaderStyle BackColor="#4A3C8C" Font-Bold="True" ForeColor="#F7F7F7" /> <ItemStyle BackColor="#E7E7FF" ForeColor="#4A3C8C" /> <EditItemTemplate> </EditItemTemplate> </asp:DataList> Simdi datalistimizi görüntüleyecegimiz bir void yazalım. protected string ConnectionDegiskeni() { //Connection String return "Data Source=.; Initial Catalog=Northwind; uid=sa; pwd="; } protected void DatayiDoldur() { Baslangic = Convert.ToInt32(txtStart.Text); BaslangicKaydi = (Baslangic * SayfadakiKayitSayisi) - SayfadakiKayitSayisi; SqlConnection Cnn = new SqlConnection(ConnectionDegiskeni()); Cnn.Open(); SqlDataAdapter Da =new SqlDataAdapter("Select * From Customers", Cnn); DataSet Ds = new DataSet(); Da.Fill(Ds, BaslangicKaydi, SayfadakiKayitSayisi, "Customers"); DataList1.DataSource = Ds.Tables[0].DefaultView; DataList1.DataBind(); Cnn.Close(); } Daha Sonra bu void'i Formun load'da çagıralım. protected void Page_Load(object sender, EventArgs e) { DatayiDoldur(); } Evet projemizi çalıstırdıgımızda tüm verilerin ekrana geldigini ve verilerin yavas yüklendigini göreceksiniz. Evet kayıtlarımızı listeledikten sonra artık sayfalam islemine geçebiliriz. Bunun için datalistimizin altına bir adet label alalım ve text özelligini bosaltalım. Bu label üzerinde numeric degerleri gösterecegiz. (1 | 2 | 3 | 4 .. gibi) Projemize bir adet textbox ekleyelim adını txtStart yapalım ve visible özelligini false yapalım. Bu textbox içerisinde sayfa sayısını saklayacagız. Code kısmına geçip asagıdaki degiskenleri tanımlayalım. private int Baslangic=1; // Görüntülenecek olan Sayfanın numarası private int SayfadakiKayitSayisi = 4;//Sayfada görüntülenecek olan kayıt sayısı private int BaslangicKaydi;//Databaseden çekilen datada baslanacak olan kaydın sayısı private int ToplamSayfaSayisi;//Toplam sayfa sayısı private int ToplamKayitSayisi()// Toplam kayıt sayısını geri döndüren bir fonksiyon yazarız. { SqlConnection Cnn = new SqlConnection(ConnectionDegiskeni()); Cnn.Open(); SqlCommand myComm =new SqlCommand("Select Count(*) From Customers", Cnn); int GeciciKayitSayisi = Convert.ToInt32(myComm.ExecuteScalar()); Cnn.Close(); return iTempRecordCount; } protected void Page_Load(object sender, EventArgs e) { //Toplam Sayfa Sayısı Alınıyor if (ToplamKayitSayisi() % SayfadakiKayitSayisi == 0) //toplam Kayıt Sayısının Sayfadaki Kayıt sayısına göre modunu alırız. Eger tam sonuç verirse Toplam kayıt sayısına, Sayfadaki Kayıt Sayısını bölmesi yeterli olur ancak tam sonuç vermezse sayfa sayısı 1 eksik çıkar bunu önlemek için ToplamSayfaSayisi'nı 1 arttırırız. { ToplamSayfaSayisi = ToplamKayitSayisi() / SayfadakiKayitSayisi; } { ToplamSayfaSayisi = ToplamKayitSayisi() / SayfadakiKayitSayisi + 1; } DatayiDoldur(); // Datayı ekrana getiririz. if (!Page.IsPostBack) { // Numeric Sayfalama Bilgileri Olusturuluyor int i; for (i = 1; i <= ToplamSayfaSayisi; i++) { Label5.Text = Label5.Text + "<a href=default.aspx?sayfa=" + i + ">" + i + "</a>|"; //Label5 içerisine 1 den Toplam Sayfa Sayısına Kadar numeric degerler olusturuluyor. Sayıları olusturuyoruz ve bu sayılara link veriyoruz. Link yine aynı sayfaya gidiyor ve sayfa adında bir querystring içerisinde sayfaya ait degeri gönderiyor. } try { //olusturulan numeric degerin gönderdigi querystring’e göre o sayfaya gidiliyor Baslangic = int.Parse(Request.QueryString["sayfa"].ToString()); // burada queryden gelen degeri alıyoruz txtStart.Text = Baslangic.ToString(); DatayiDoldur();//data yenileniyor } Catch //sayfa ilk açıldıgında querystring bos olacagından hata vermemesi için ve ilk kayıttan baslaması için basalangic degiskenine 1 degerini atarız. { Baslangic = 1; } } Bilgiler(); } // Yaptıklarımızı daha iyi anlamak için forma 4 adet label ekleyelim ve asagıdaki voidi yazalım.daha sonra voidimizi form_Load da çagıralım. protected void Bilgiler() { //Konuyu daha iyi anlamak için kullandıgımız degiskenleri ekrana bastık lblBaslangicKaydi.Text = BaslangicKaydi.ToString(); lblGoruntulenecekKayitSayisi.Text = SayfadakiKayitSayisi.ToString(); ; lblToplamKayitSayisi.Text = ToplamKayitSayisi().ToString(); lblToplamSayfaSayisi.Text = ToplamSayfaSayisi.ToString(); } Numeric Sayfalama islemini tamamladık ve artık yaptıgımız sayfayı görelim (: Evet 5 numaralı sayfayatıklayalım ve o sayfaya gidelim. Madem Google örnegini verdik, Önceki ve sonraki butonlarınıda ekleyelim (: Sayfamıza 2 adet link buton ekleyelim ve Text özelliklerini Önceki ve Sonraki olarak belirleyelim. protected void lblOnceki_Click(object sender, EventArgs e) { // Önceki kayda gider if (Baslangic > 1) { Baslangic = Baslangic - 1; txtStart.Text = Baslangic.ToString(); DatayiDoldur(); Label4.Text = ""; Bilgiler(); } } protected void lbSonraki_Click(object sender, EventArgs e) { // Sonraki kayda gider if (Baslangic < ToplamSayfaSayisi) { Baslangic = Baslangic + 1; txtStart.Text = Baslangic.ToString(); DatayiDoldur(); Label4.Text = ""; Bilgiler(); } } Son kez projemizi çalıstıralım ve sonucu görelim. Bu makalenin de sonuna geldik baska bir makalede görüsmek dilegiyle, basarılar dilerim. Sem GÖKSU MCP | MCAD.NET askisem@hotmail.com Not: Selçuk Yavuz'un yazmıs oldugu Datalist ile Sayfalama makalesi bu makaleye kaynak olmustur. Diger Kaynaklar; Codeproject - Paging with Repeater control in ASP.NET
26 Kas 2006 ASP.NET 2.0 ile Localization (Yerelleştirme) Kategori: ASP.NET Etiketler: ASP.NETASP.NET 2.0 2 Yorum Merhaba arkadaşlar bu makalemizde ASP.NET içerisinde Localization (Yerelleştirme) işleminin nasıl yapıldığına göz atacağız. Localization Farklı kültür özelliklerine göre tasarlanmış web siteleri oluşturmamıza sağlayan Framework’un bir özelliğidir.Visual Studio da Localization Visual Studio 2005 herhangi bir Kaynak dosyası (Resource file *.resx) içinde herhangi bir kaynagı eklememize ve düzenlememize izin veren yeni bir kaynak editörü sundu. Web formumuz dizayn zamanındayken(Design time) basit adımlarla yeni kaynak dosyaları olusturmamızı saglıyor. Bu kaynak dosyaları, içerisinde ekleyecegimiz özelliklerin kullanıcı kültür özelliklerine göre sayfaya uygulanmasını saglar. Kaynak editörü bir grid gibidir. Name, value ve comment olmak üzere 3 sütundan olusur. Name belirleyecegimiz kaynagın adını, value kaynakta görüntüleyecegimiz degeri ve comment'de açıklama satırıdır. Visual studio 2005 WebForm'larını Localize etmek için 2 yol sunar. Birincisi Lokal kaynaklar (Local Resources), ikinciside Global kaynaklar(Global Resources). Lokal kaynak dosyalarında, kaynak dosyalar asp.net sayfaları içerisine eklenir. Global kaynaklarda ise ortak ayarların tutuldugu tek bir kaynak dosya olusturulur. Kısaca özetlersek; Web Uygulamaları için kaynak dosyaları olusturmamızı, Kaynaklara erismek için Çalısma zamanında yeni tanımlamalar yapmamızı, Kullanıcı istekleri için geçerli kültür özelliklerini otomatik olarak uygulamamızı saglar. (Tarih-saat, para birimi, web formlardaki bilgiler) Özellikle çok uluslu firmalar için düsünürsek, örnegin Microsoft için her dil için ayrı ayrı uygulama gelistirmek hem zaman kaybı hemde gereksiz is yüküdür. Bu durumda local kaynak dosyalarını kullanarak uygulamanın çalısacagı kültür özelliklerine gore tarih-saat, para birimi, kullanıcı formlarındaki bilgilerin vb. gibi bilgilerin otomatik olarak ayarlanmasını saglayabiliriz. Küçük çaplı projeler için düsünürsek projeyi compile etmeden kaynak dosyaları degistirerek site üzerinde güncelleme islemleri yapılabilir. Örnek Uygulama Localization özelliklerini anlatan bir örnek yapalım. Örnegimizde Tarih-saat, para birimi ve kullanıcı ara yüzlerini dil seçeneklerine göre otomatik olarak uygulandıgını görecegiz. Ilk olarak visual studio 2005 içinde Localize Adında bir proje açalım. Açılan web formumuza bir adet label ekleyelim. Text özelligini silelim ve adını lblHosgeldiniz olarak belirleyelim. Daha sonra Solution Explorerdan, Add Asp.NET Folder diyerek projemize Local Kaynak klasörü ekleyelim. Bu klasör üzerinde sag tıklayarak projemize bir adet kaynak dosyası ekleyelim ve adını "default.aspx.resx" olarak belirleyelim. Açılan sayfa da kaynagımızın adı(name) ve içerisinde tutacagımız deger saklanacaktır(Value). Kültür özelliklerimiz Türkçe oldugunu için bu kaynak dosyası içerisine Türkçe bilgiler girecegiz. Evet, simdi Ingilizce için kaynak dosyamızı olusturalım adını "default.aspx.en.resx" yapalım ve özelliklerimizi belirleyelim. Kültür özelliklerimizi belirledik. Simdi web formumuza gidip sayfamızın Kültür ayarlarını yapalım. <Page Language ="VB" AutoEventWireup ="false" CodeFile ="Default.aspx.vb" Inherits ="_Default" Culture="Auto" UICulture="Auto" > <! 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 > Untitled Page</ title > </ head > < body > < form id ="form1" runat ="server"> < div > < asp : Label ID ="lblHosgeldiniz" runat ="server" Font-Names ="Verdana" Font-Size ="X-Large" meta:resourceKey="lblHosgeldiniz"></ asp : Label >< br /> < br /> </ div > </ form > </ body > </ html > Ilk olarak kültür özelliklerini Auto özelligi verdik. Label'ın meta:resourcekey özelligini belirttik. Simdi sayfamızı çalıstırabiliriz. Evet sayamızı çalıstırdık ve "Selam Türk" Diye Bizi Karsıladı. Simdi sayfamızın dil ayarını ingilizce yapalım. Sayfamızı Refresh edelim. Karsılama mesajı bu kez "Selam Ingiliz" oldu. Projemizi biraz daha genisletelim. Sayfamıza bir adet DropdownList, bir adet calendar ve bir adet label ekleyelim. Dropdown içerisinde Dil seçenekleri olacak ve seçtigimiz dile göre de Tarih-Saat, Para Birimi, ve Karsılama Mesajı degisecek. Dropdown dilleri ekleyelim. < asp : DropDownList ID ="DropDownList1" runat ="server" AutoPostBack ="True" OnSelectedIndexChanged ="DropDownList1_SelectedIndexChanged" meta : resourcekey ="DropDownList1Resource1"> < asp : ListItem Selected ="True" Value ="Auto" Text ="Lütfen Dil Seçiniz"></ asp : ListItem > < asp : ListItem Value ="Auto" Text ="Türkçe"></ asp : ListItem > < asp : ListItem Value ="en-US" Text ="Ingilizce"></ asp : ListItem > < asp : ListItem Value ="fr-FR" Text ="Fransızca"></ asp : ListItem > < asp : ListItem Value ="ar-EG" Text ="Arapça"></ asp : ListItem > </ asp : DropDownList > < asp : DropDownList ID ="DropDownList1" runat ="server" AutoPostBack ="True" OnSelectedIndexChanged ="DropDownList1_SelectedIndexChanged" meta : resourcekey ="DropDownList1Resource1"> < asp : ListItem Selected ="True" Value ="Auto" Text ="Lütfen Dil Seçiniz"></ asp : ListItem > < asp : ListItem Value ="Auto" Text ="Türkçe"></ asp : ListItem > < asp : ListItem Value ="en-US" Text ="Ingilizce"></ asp : ListItem > < asp : ListItem Value ="fr-FR" Text ="Fransızca"></ asp : ListItem > < asp : ListItem Value ="ar-EG" Text ="Arapça"></ asp : ListItem > </ asp : DropDownList > Ekledigimiz label içerisinde de para degerini tutacak kodumuzu yazalım. Burada da kültür özelliklerine göre para formatı ve para birimi gelecek. Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim parabirimi As Double = 575757.57 Label1.Text = String.Format("{0:c}", parabirimi) End Sub Dropdownd da listeledigimiz dillerden seçtigimiz dile göre istedigimiz ayarları vermesini isteyelim. Bunun için InitializeCulture() metodunu ezelim. Protected Overrides Sub InitializeCulture() Dim dil As String = Request("DropDownList1")' dropdowndan gelen deger If String.IsNullOrEmpty(dil) Then dil = "Auto" ' eger dil bossa otamatik olarak belirle UICulture = dil Culture = dil End Sub Simdi Dropdownumuzda Dil Seçimi yapıldıgında çalısacak kodu yazalım. Burada Seçilen Dile Göre InitializeCulture() metodu çalısacak ve seçilen dile göre Kültür özelliklerini uygulacak. Projemizi çalıstıralım. Simdi dillerden ingilizce Seçelim. Listeden bu kezde Arapçayı seçelim. Evet, Arapça seçenegini seçtik ve sayfamızın Arapça kültür ayarlarına geldigini gördük. Bu sekilde tüm kullanıcı ekranlarımızı kaynak dosyalarımız içerisinden belirleyebilir çok kolay bir sekilde projemize birçok dil seçenegi ile çalısma imkânı saglayabiliriz. Bu makalenin de sonuna geldik, baska bir makalede görüsmek üzere basarı ve iyi günler dilerim. Sem GÖKSU MCP | MCAD.NET | MCTSKaynaklarhttp://msdn.com http://www.codeproject.com http://aspalliance.com
26 Kas 2006 Koleksiyonlar Kategori: C#.NET Etiketler: .NET FrameworkC# 0 Yorum Collectionlar bize Datasetlerden bağımsız çalışmamızı sağlar ve buda bize çok büyük performans kazancı sağlar. Collection lar arraylere benzer ve Classlar içerisine nesneleri yerleştirmemizi sağlar. System.Collection NameSpace'i içerisindeki Collection Classının bazıları; ArrayList BirArray CollectionBase DictionaryBase Hashtable Queue dir. Biz bu makalemizde CollectionBase sınıfına deginecegiz. Ilk olarak bir C# Windows application projesi açalım. Projemizde anlasılması kolay olsun diye SQL Server 2000 da Northwind içerisindeki Kategoriler tablosunu kullanacagız. Ilk olarak projemize bir adet Class ekliyoruz. Clasın adını Kategori olarak belirliyoruz. Buradaki amacımız kategori sınıfına ait bir kategori nesnesi olusturmaktır. Çünkü Collectionlar nesnelerden türerler. Classımızı ekledikten sonra veritabanımıza bir göz atalım. Veritabanımızda var olan alanlar, CategoryID, CategoryName ve Description alanlarıdır. Artık Kategori Classımızı yazabiliriz Kategori.cs using System; namespace Collection { public class Kategori { private int tKategoriNo; private string tKategoriAdi; private string tKategoriAciklama; public Kategori(){} public Kategori(string kategoriadi, string kategoriAciklama) { this.tKategoriAdi=kategoriadi; this.tKategoriAciklama=kategoriAciklama; } public int KategoriNo { get { return tKategoriNo; } set { tKategoriNo=value; } } public Kategori(){} public string KategoriAciklama { get { return tKategoriAciklama; } set { tKategoriAciklama=value; } } public string KategoriAdi { get { return tKategoriAdi; } set { tKategoriAdi=value; } } } } Kategori classı içerisinde Kategoriler tablosuna ait bir kategori nesnesi olusturduk. Simdi bu nesneye ait bir Collection olusturabiliriz. Projemize bir adet daha class ekleyelim ve adını KategoriCollection.cs verelim. using System; using System.Collections; namespace Collection { public class KategoriCollection:CollectionBase //Collection Classları CollectionBase sınıfından türer ve Collection base System.Collections namespace i içerisinde yer alır. { public KategoriCollection(){} /*Burada Collecsiyonunuza bir eleman eklemek için Add Fonksiyonu olusturuyoruz. Dısarıdan Kategori türünde bir kategori nesnesi alır.*/ public int Add(Kategori kategori) { return this.List.Add(kategori); } public int Add(string KategoriAdi, string KategoriAciklama) { Kategori Kategori =new Kategori(KategoriAdi,KategoriAciklama); return this.List.Add(Kategori); } public int Add(int kategorino, string KategoriAdi, string KategoriAciklama) { Kategori Kategori =new Kategori(kategorino,KategoriAdi,KategoriAciklama); return this.List.Add(Kategori); } /* Collectionumuzdan bir eleman silmek için bir void olustururuz. */ public void Remove(Kategori kategori) { this.List.Remove(kategori); } /*Kategori türünde this adında özel bir property olustururuz*/ public Kategori this[int index] { get {return (Kategori)this.List[index];} set{this.List[index]=value;} } } } Kategori Nesnemizi ve Kategori Collectionumuzu olusturdugumuza göre artık bu collectionu kullanabiliriz. Projemize bir adet daha class ekleyelim ve adını KategoriProvider.cs olarak verelim. using System; namespace Collection { public class KategoriProvider { /* Static bir Connection olusturulur */ private static System.Data.SqlClient.SqlConnection Cnn=new System.Data.SqlClient.SqlConnection(Genel.ConnectionString); public KategoriProvider(){} /* Verileri çekmek için GetAllKategori adında bir function olustururuz. Function KategoriCollection türndedir. */ public static KategoriCollection GetAllKategori() { KategoriCollection kc=new KategoriCollection(); System.Data.SqlClient.SqlCommand Cmd=new System.Data.SqlClient.SqlCommand ("Select * from Categories ",Cnn); System.Data.SqlClient.SqlDataReader Dr; Cnn.Open(); Dr=Cmd.ExecuteReader(); while (Dr.Read()) { kc.Add( (int)Dr["CategoryID"], (string)Dr["CategoryName"], (string)Dr["Description"] ); } Dr.Close(); Cnn.Close(); return kc; } } } Evet simdi her sey hazır. Artık collectionumuzu form üzerinde kullanabiliriz. Bunun için formumuza bir adet Datagrid ekleyelim. Gridimizi ekledikten sonra form yüklenirken verileri göstermek için Form_Load eventi içerisine asagıda kodları yazarsak projemizi tamamlamıs olacagız. private KategoriCollection Kc=new KategoriCollection();//Collectionumuzun instance ni olusturduk private void Form1_Load(object sender, System.EventArgs e) { Kc=KategoriProvider.GetAllKategori(); dataGrid1.DataSource=Kc; } Evet projemizi tamamladıgımıza göre artık projeyi çalıstırabiliriz. Iste sonuç Evet arkadaslar makalemizin sonuna geldik bir sonraki makalemizde görüsmek üzere.
26 Kas 2006 Namespace Nedir, Value ve Reference Type’ları Nedir? Kategori: C#.NET Etiketler: .NET FrameworkC# 0 Yorum Namespaces Diger .Net dilleri gibi C#'ta .NET base class library'sinde tanımlanmıs datatype'ları kullanır. Bu classlar namespace adı altında gruplanmıstır. Namespace'e diger bir tanımlama ile classları kullanırken fonksiyonel bir sekilde ulasmamızı saglayan logic containerlar diyebiliriz. Örnek olarak System.Windows.Forms namespace'i ni verebilirim namespace Desta.Deneme.DenemeClasses { public class a() { Public a(){} private string dbname; public string dbName { Get{return dbname;} Set{dbname=value;} } } } using kelimesi ile de namespaceler içerisinde bulunan classları projemize dajil etmis oluruz.. namespace using ile projeye dahil edildikten sonra herhangi bir period belirtmeden namespace içerisinde bulunan tanımlamalara ulasabiliriz. using Desta.Deneme.DenemeClasses; böylece deneme namespace içindeki tüm classlara ve içinde bulunan property ve fonksiyonlara erisebiliriz. using ile compile islemi sırasında modüller arasında herhangi bir link tanımlamıs olmayız. using ile ilgili ilginç bir sey ise onu alias type tanımlamak için kullanabilmemiz. Asagıdaki örnek System.Int32 type'ını intecir adıyla kullanmamızı saglar. using intecir=System.Int32; public class AliasOrnek { public static intecir Main() { intecir i=1; intecir j=i+1; System.Console.WriteLine(j); return 0; } } System Namespace Common Laguage Specification (CLS) bir programlama dili tarafından desteklenmesi kaçınılmaz olan bir çok datatype'ı tanımlayan zengin bir library'e sahiptir. Bu libraryde bulunan Boolean, string, integer, kronolojik ve finansal valueların hepsi System namespace'inin içerisinde yer alır. Bütün typelar object type'ından inherit edilir. Böylece bir object'in referansı herhangi bir tipdeki degiskeni tutmak için kullanılabilir. Long type'ın bit olarak büyüklügü 64'e çıkarılmıstır. Bu sayede Whistler ve XP platformlarında 64 bitlik programlar için bir hazırlık saglanmıstır. (64 bitlik olan bu isletim sistemleri Intel'in yeni nesil 64 bitlik islemcisi Itanium uyumludur) System NameSpace i birçok alt kullanıcı barındırır. System.Web HTML ve Web kontrollerini ,güvenlik, sessionstate, konfigurasyon, bölgesel ayarlar gibi metodları barındırır. System.Data Genel olarak veritabanı islemlerimiz için kullandıgımız NameSpace'dir. System.Windows.Forms Windows Forms uygulamaları için özel ayarları barındırır. System.Drawing Yazdırma ve resim isleme ile ilgili islemlerde kullandıgımız NameSpace'dir. System.XML XML islemleri için kullanılmktadır. süphesiz .Net Framework ün bize sundugu bu zengin kütüphane System NameSpace'i ile sınırlı degil. Value ve Reference Tipleri C# programlama dilinde bildiginiz gibi veri türlerini Reference Types Value Types olmak üzere iki kısma ayırıyoruz. .NET dilleri tarafından kullanılan yada yaratılan her class value ve referans tipleri olarak kategorilendirilebilir. Value ve referans tipleri iki belirgin farklılık gösterir : hafızada tutuldukları yerler ve atama islemi içeriklerdeki davranıslarına göre. Value tipler stackte tutulur, her iki value degeri için yapılmıs atama islemi ile hafızada birbirinin kopyası iki bölüm olusturulur. Referans tipler ise heap'de tutulur. Her iki referans degeri için yapılmıs atama islemi ile memory'deki tek bir yere iki ayrı referans olusturulur. Asagıdaki kod parçasında bir referans türüne ve bir de deger türüne null degerler atanmaya çalısılmaktadır. using System; namespace c1 { class c1 { static void Main(string[] args) { string refTuru=null; int dTuru=null; } } } Bu uygulamayı derlemeye çalıstıgımızda Cannot convert null to 'int' because it is a value type hatasını alırız. Aynı durumu kendi tanımladıgımız referans ve deger türleri içinde gerçeklestirebiliriz. Asagıdaki kod parçasında bu durum örneklenmistir. using System; namespace c2 { class c2 { } struct Dvd { } class C1 { static void Main(string[] args) { Kitap kitap=null; Dvd dvd=null; } } } Bu kod parçasındada aynı hatayı alırız. Çünkü struct' lar deger türüdür ve bu sebeple null degerler alamazlar. Oysaki aynı istisnai durum class gibi kendi tanımlamıs oldugumuz referans türleri için geçerli degildir. Peki deger türlerinin null deger içerme ihtiyacı ne zaman dogabilir? Bir veritabanı uygulamasını göz önüne alalım. Bu tabloda int, double gibi deger türlerine karsılık gelecek alanların var oldugunu düsünelim. Veri girisi sırasında bu int ve double degiskenleri null olarak tabloya aktarmak isteyebiliriz. Ya da tablodan veri çekerken, deger türü karsılıgı alanların null deger içerip içermedigini anlamak isteyebiliriz. Iste bu gibi durumlarda deger türlerinin null veriler içerebilecek yapıda olması, kodumuzun ölçeklenebilirligini arttıracak bir yetkinlik olarak düsünülebilir. Veritabanları için geçerli olan bu senaryoyu göz önüne almadan önce C# 2.0 için deger türlerinin nasıl null veriler tasıyabilecegini incelemeye çalısalım. Deger türlerinin C# 2.0 için iki versiyonu vardır. Nullable deger türleri ve Non-Nullable deger türleri. Bir deger türünün null degerler içerecek tipte olacagını belirtmek için ? tip belirleyicisi kullanılır. using System; using System.Collections.Generic; using System.Text; namespace TestOfNullableValues { class P { static void Main(string[] args) { int? maas; double? pi; maas = null; pi = null; } } } Yukarıdaki kod parçası sorunsuz olarak derlenecek ve çalısacaktır Asagıdaki kod ile iki value degerine atama yapılmakta ve hafızada iki deger kopyası olusturulmaktadır. (kodu derleyip çalıstırmak için /unsafe switch'ini kullanın) using System; public class Simpleclass { public static int Main() { int i; int j; i=5; j=i; Console.WriteLine("i="+i); Console.WriteLine("j="+j); unsafe { if (&i==&j) { Console.WriteLine("i ve j'nin adresleri aynı"); } else { Console.WriteLine("i ve j'nin adresleri farklı"); } } Console.ReadLine(); return 0; } } Bu kod ise iki referans degerine atama yapmakta ve hafızadaki tek kopyaya ulasmaktadır. using System; public class ReferenceType { public int MyValue; } public class SimpleClass { public static int Main() { ReferenceType i; ReferenceType j; i=new ReferenceType(); i.MyValue=5; j=i; Console.WriteLine("i.MyValue="+i.MyValue); Console.WriteLine("j.MyValue="+j.MyValue); unsafe { if (i==j) { Console.WriteLine("i ve j aynı adreste"); } else { Console.WriteLine("i ve j farklı adreste"); } } Console.ReadLine(); return 0; } } Primitives olarak adlandırılan pek çok degisken tipi C#'da value tipi olarak kabul edilir : integer value tipi gibi. Aynı zamanda struct ile tanımlamanan user tipler'de value tipinde tanımlamalardır. Bir sonraki makalemde görüsmek üzere