Merhaba arkadaşlar,

Generic bir tipe istenilen türde bir değer ataması yapabiliriz. Örneğin "System.Collections.Generic.List" sınıfı için bir generic tip ataması yapmak istediğimizde T yerine istediğimiz bir değeri atayabiliriz. Bunu bize sağlayan yapı List sınıfında herhangi bir generic type kısıtının olmamasından kaynaklanmaktadır.
Peki tüm tip değelerine açık bir atama olmasının dışında belirli bir kurala / kurallara göre atama yapılabilir duruma getirmek için ne yapmam lazım ? Bu noktada generic type kısıtlaması devreye girmektedir. Altı adet kısıtlama türü mevcuttur. Dilerseniz aşağıdaki linkten Microsoft' un ilgili dokümanını inceleyebilirsiniz. Benimde anlatacak olduğum konu başlıkları buradaki bilgileri kapsamaktadır.

Constraints on Type Parameters (C# Programming Guide)

Not: Generic sınıf tanımında bir kısıt belirttiğimizde ve ilgili generic nesneye tip atamasında kısıtlama dışında bir tip atandığında derleme zamanı hatası ile karşılaşırız.

where T: struct

Type argümanı bir değer türü olmalıdır.

class GenericList< T> where T : struct
{

}

static void Main(string[] args)
{
	GenericList< DateTime> s1 = new GenericList< DateTime>();		
}

where T : class

Type argümanı bir referans türü olmalıdır. Herhangi bir sınıf, arayüz, temsilci olabilir.

class Product
{

}

class GenericList< T> where T : class
{

}

static void Main(string[] args)
{
	GenericList< Product> s1 = new GenericList< Product>();
	GenericList< String> s2 = new GenericList< string>();
	//GenericList< DateTime> s3 = new GenericList< DateTime>();	
}

Yukarıda açıklama satırı olarak kapatılan kısım, üst tarafta açıklamasını yaptığımız derleme zamanı hatasını vermektedir. Çünkü "DateTime" bir değer türüne (struct) sahip nesnedir. Bizim GenericList sınıfımız için kısıtımız ise generic tip atamasının bir referans tipe ait olması şartını sağlamasıdır. Bu şartı sağlamadığı için derleyici aşağıdaki gibi bir hata vermektedir. Bu hata gibi diğer kısıt tiplerine göre uyumsuz olarak yapılan atamalar içinde benzer şekilde derleme zamanı hataları ile karşılaşırız.

www.hikmetokumus.com

where T : new()

Type argümanı parametre içermeyen bir yapıcı metoda sahip olmalıdır. Diğer kısıtlamalarla birlikte kullanıldığında, new () kısıtı en sonda belirtilmelidir.

    class Product
    {

    }    
    
    class GenericList< T> where T : class, new()
    {

    }
    
    static void Main(string[] args)
    {
        GenericList< Product> s1 = new GenericList< Product>();                       
    }    

Product sınıfını aşağıdaki gibi değiştirirsek derleme zamanı hatası alırız.

    class Product
    {
        public Product(string name)
        {

        }
    }

Kısıtımız bizden parametreye sahip olmayan bir yapıcı metod istemektedir. Aşağıdaki gibi bir düzeltme hatayı giderecektir.

    class Product
    {
        public Product() { }

        public Product(string name)
        {

        }
    }

where T : < base class name>

Type argümanı belirtilen taban sınıfından olmalı ya da türetilmelidir.

    class EntityBase
    {

    }

    class Entity : EntityBase
    {

    }

    class Product : Entity
    {
            
    }

    class GenericList< T> where T : EntityBase
    {

    }
    
    static void Main(string[] args)
    {
        GenericList< EntityBase> s1 = new GenericList< EntityBase>();
        GenericList< Entity> s2 = new GenericList< Entity>();
        GenericList< Product> s3 = new GenericList< Product>();
    }

where T : < interface name>

Type argümanı belirtilen arayüz olmalıdır ya da belirtilen arayüzü uygulamanız gerekir. Birden fazla arayüz kısıtlamaları belirtilebilir.

    interface IEntity
    {

    }

    class Product : IEntity
    {

    }

    class GenericList< T> where T : IEntity
    {

    }
    
    static void Main(string[] args)
    {
        GenericList< IEntity> s1 = new GenericList< IEntity>();
        GenericList< Product> s2 = new GenericList< Product>();
    }    

where T : U

T için verilen tür, U için verilen türden türemiş olması gerekmektedir.

    interface IEntity
    {

    }

    class Product : IEntity
    {

    }

    class GenericList< T, U> where T : U
    {

    }
    
    static void Main(string[] args)
    {
        GenericList< Product, IEntity> s1 = new GenericList< Product, IEntity>();
    }    

Çoklu Kısıtlama Parametreleri

Örneklerimizde tek bir where kısıtı kullandık. Ama bunu birden fazla yazmak mümkündür. Dilerseniz aşağıdaki gibi kullanabilirsiniz.

	class Base { }
	class Test< T, U>
	    where U : struct
	    where T : Base, new()

Başarılar dilerim.

Manage NuGet Packages ile Entity Framework Kurulumu

11.05.2017 Hikmet Okumuş 53 2 Entity Framework

Merhaba arkadaşlar,

"Manage NuGet Packages" ile projenize Entity Framework' ü eklemek için aşağıdaki adımları izleyebilirsiniz.

www.hikmetokumus.com

www.hikmetokumus.com

www.hikmetokumus.com

www.hikmetokumus.com

www.hikmetokumus.com


Başarılar dilerim.

DevExpress ASPxDateEdit Client Side Validation İşlemleri

18.01.2017 Hikmet Okumuş 209 0 DevExpress Web

Merhaba arkadaşlar

Bu makalede sizlere ASPxDateEdit kontrolü ile istemci tarafında doğrulama işlemlerini anlatmaya çalışacağım. Kullanıcı kaydı yapılan bir form üzerinden örneklemeye çalışalım. Basit bir kullanıcı kaydı için kişiden Ad, Soyad ve Doğum Tarihi bilgilerini girmesini isteyelim. Örnek form görüntüsü aşağıdaki gibidir.

www.hikmetokumus.com

Doğrulama işlemi için, ASPxDateEdit kontrolünün Validation eventı kullanılmaktadır. Örneğimizde kullanıcının yaşı 18 den küçük olursa, girilen değerin geçersiz olduğunu belirtelim.


< dx:ASPxDateEdit ID="dateEdit" ClientInstanceName="dateEdit" runat="server" Theme="Aqua">
	< ClientSideEvents Validation="onValidate" />
< /dx:ASPxDateEdit>

www.hikmetokumus.com

Eğer geçersiz bir değer girilmişse, "EventArgs.isValid" özelliğini false olarak setleriz. False sonucuna göre yukarıdaki gibi kontrolün yanında bir uyarı çıkmaktadır. Varsayılan olarak tanımlı hata mesajı "Invalid value" gelmektedir. Mesajı aşağıdaki gibi değiştirebiliriz.
    < dx:ASPxDateEdit ID="dateEdit" ClientInstanceName="dateEdit" runat="server" Theme="Aqua">
        < ValidationSettings ErrorText="Geçersiz değer">< /ValidationSettings>
        < ClientSideEvents Validation="onValidate" />
    < /dx:ASPxDateEdit>

www.hikmetokumus.com

Eğer yapılan kontrolün içeriğine göre hata mesajı değiştirilmek istenirse, Javascript tarafında "EventArgs.errorText" değeri setlenmektedir. Örneğimize göre mesajı revize edelim.
    function onValidate(s, e) {
        var birthday = e.value;
        if (!birthday)
            return;
        var today = new Date();
        var msecPerYear = 1000 * 60 * 60 * 24 * 365;
        var years = (today.getTime() - birthday.getTime()) / msecPerYear;
        if (years < 18) {
            e.isValid = false;
            e.errorText = "Girilen yaş 18 den küçüktür.";
        }
    }

www.hikmetokumus.com

Eğer kontrolün bilgi girişi zorunlu yapılmak istenirse, "RequiredField" özelliği kullanılmaktadır. "IsRequired" özelliği true olarak setlendiğinde, ekrana boş geçilemeyeceği ile ilgili bir hata mesajı çıkar.
    < dx:ASPxDateEdit ID="dateEdit" ClientInstanceName="dateEdit" runat="server" Theme="Aqua">
        < ValidationSettings ErrorText="Geçersiz değer">
            < RequiredField IsRequired="true" />
        < /ValidationSettings>
        < ClientSideEvents Validation="onValidate" />
    < /dx:ASPxDateEdit>
Yukarıdaki kod parçasında şunu yaptığınızda ekrana boş geçilemez uyarısı gelecektir. Öncelikle bir tarih değeri girin ve ardından temizleyin. Görüntü aşağıdaki gibi olacaktır.

www.hikmetokumus.com

Eğer hata mesajını değiştirmek isterseniz, "ErrorText" özelliğini setlemeniz gerekmektedir.
    < dx:ASPxDateEdit ID="dateEdit" ClientInstanceName="dateEdit" runat="server" Theme="Aqua">
        < ValidationSettings ErrorText="Geçersiz değer">
            < RequiredField IsRequired="true" ErrorText="Doğum tarihi zorunludur !" />
        < /ValidationSettings>
        < ClientSideEvents Validation="onValidate" />
    < /dx:ASPxDateEdit>

www.hikmetokumus.com

"Doğum tarihi zorunludur !" kontrolünün "Kaydet" butonuna basıldığında yapılması için, "ValidationGroup" tanımlamasının yapılması gerekmektedir.
    < dx:ASPxDateEdit ID="dateEdit" ClientInstanceName="dateEdit" runat="server" Theme="Aqua">
        < ValidationSettings ErrorText="Geçersiz değer" ValidationGroup="SaveGroup">
            < RequiredField IsRequired="true" ErrorText="Doğum tarihi zorunludur !" />
        < /ValidationSettings>
        < ClientSideEvents Validation="onValidate" />
    < /dx:ASPxDateEdit>
	< dx:ASPxButton runat="server" ClientInstanceName="btnSave" Text="Kaydet" ValidationGroup="SaveGroup" AutoPostBack="false">
	< /dx:ASPxButton>
Doğrulama işlemlerini kısaca özetlemeye çalıştım. İki tarih arası kontrol, belli bir tarih kontrolü, tarihin formatının kontrolü vb. farklı örnekler üzerinde doğrulama işlemlerinizi gerçekleştirebilirsiniz.

Başarılar dilerim.

DevExpress ASPxDateEdit Custom Button Click Event

12.01.2017 Hikmet Okumuş 296 0 DevExpress Web

Merhaba arkadaşlar,

Bir önceki makalede ASPxDateEdit kontrolüne custom butonların nasıl ekleneceğini örneklemiştik. İlgili makaleye aşağıdaki linkten ulaşabilirsiniz.

www.hikmetokumus.com DevExpress ASPxDateEdit Custom Button Eklemek

Bu makalede ise eklediğimiz custom buttonlara nasıl event ekleriz, tetikleriz bunu örneklemeye çalışacağız. Önceki makaledeki örnekte "Today" ve "Clear" butonlarını custom olarak eklemiştik.

www.hikmetokumus.com

Şimdi bu butonlara event ekleyelim. Bu işlem için "ClientSideEvents" içinde bulunan "ButtonClick" eventını kullanacağız. Eğer örneğimizdeki gibi birden fazla buton kullanırsanız, tek bir event içerisinde hangi buton için istek geldiğini, EventArgs ile gelen "buttonIndex" özelliği belirtmektedir. Şimdi "Today" için günün tarihini setleme, "Clear" için date alanını temizleme kısımlarını yazalım.
    

    < dx:ASPxDateEdit ID="dateEdit" ClientInstanceName="dateEdit" runat="server" Theme="Aqua">
        < Buttons>
            < dx:EditButton Text="Today">< /dx:EditButton>
            < dx:EditButton Text="Clear">< /dx:EditButton>
        < /Buttons>
        < ClientSideEvents ButtonClick="onButtonClick" />
    < /dx:ASPxDateEdit>

Başarılar dilerim.

DevExpress ASPxDateEdit Custom Button Eklemek

10.01.2017 Hikmet Okumuş 334 0 DevExpress Web

Merhaba arkadaşlar

ASPxDateEdit kontrolünü özelleştirmek, farklı işlevsellikler katmak isterseniz, kontrolün "Buttons" özelliğini kullanabilirsiniz.
	< dx:ASPxDateEdit ID="dateEdit" ClientInstanceName="dateEdit" runat="server" Theme="Aqua">
		< Buttons>
			< dx:EditButton Text="Today">< /dx:EditButton>
			< dx:EditButton Text="Clear">< /dx:EditButton>
		< /Buttons>
	< /dx:ASPxDateEdit>

www.hikmetokumus.com

Normalde tarih panelini açtığımızda "Today" ve "Clear" butonları panel üzerinde mevcut. Biz uygulamamızda farklılık oluşturmak için, butonları daha hızlı ulaşabileceğimiz bir noktaya taşıdık. Örnekte custom buton olarak "EditButton" kullandım. Diğer button tipleri aşağıdaki gibidir.

www.hikmetokumus.com


Başarılar dilerim.

Merhaba arkadaşlar,

ASPxDateEdit kontrolünün varsayılan olarak text değeri boş olarak gelmektedir. Eğer kontrol yüklendiğinde örneğin varsayılan olarak günün tarihi setlemek istersek, kontrolünün Client-Side eventini kullanabiliriz. Bu işlem için Init eventi kullanılmaktadır. Kullanım şekli aşağıdaki gibidir.
    < dx:ASPxDateEdit ID="dateEdit" ClientInstanceName="dateEdit" runat="server" Theme="Aqua">
        < ClientSideEvents 
            Init="function(){
                dateEdit.SetText(new Date().toLocaleDateString());                                                                        
            }"/>
    < /dx:ASPxDateEdit>

Başarılar dilerim.

DevExpress ASPxDateEdit Set Date Client Side

30.12.2016 Hikmet Okumuş 332 0 DevExpress Web

Merhaba arkadaşlar,

ASPxDateEdit kontrolüne client tarafında tarih setlemek için 2 yöntemi kullanabilirsiniz. Bunlar "SetText" ve "SetDate" fonksiyonlarıdır. SetText yöntemi için string bir tarih değeri, SetDate için "Date" tipinde bir tarih değerini argüman olarak göndermemiz gerekmektedir. Örnek kullanımlar aşağıdaki gibidir.
            < dx:ASPxDateEdit ID="dateEdit" ClientInstanceName="dateEdit" runat="server" Theme="Aqua">               
            < /dx:ASPxDateEdit>
		
			//Text
			dateEdit.SetText("30.12.2016");
			
			//Date
			var date = new Date(2016, 12, 30);
			dateEdit.SetDate(date);
		

Başarılar dilerim.

DevExpress ASPxDateEdit Today & Clear Button Text Change

29.12.2016 Hikmet Okumuş 350 0 DevExpress Web

Merhaba arkadaşlar,

ASPxDateEdit kontrolünde tarih paneli üzerindeki butonların textleri varsayılan olarak ingilizce gelmektedir. Text ifadesini değiştirmek için CalendarProperties özelliği kullanılmaktadır. "Today" için TodayButtonText, "Clear" için ClearButtonText özelliklerini setlemek yeterli olacaktır. Örnek olarak değerlerin türkçe karşılıklarını setleyelim.
            < dx:ASPxDateEdit ID="dateEdit" ClientInstanceName="dateEdit" runat="server" Theme="Aqua">
                < CalendarProperties TodayButtonText="Bugün" ClearButtonText="Temizle">
                < /CalendarProperties>
            < /dx:ASPxDateEdit>
		

www.hikmetokumus.com


Başarılar dilerim.

DevExpress ASPxDateEdit Show Hide Today & Clear Button

29.12.2016 Hikmet Okumuş 324 0 DevExpress Web

Merhaba arkadaşlar,

ASPxDateEdit kontrolünü sayfaya eklediğimizde varsayılan olarak "Today" ve "Clear" butonları panel üzerinde görünmektedir. Bazı durumlarda butonları gizlemek isteyebiliriz. Bu işlem için CalendarProperties özelliğinden yararlanılacaktır. Özelliğin "Show" ile başlayan elemanlarına göz attığımızda "Today" ve "Clear" haricinde başka özellikleride aynı mantıkta gösterip / gizleyebilirsiniz.
	
        < dx:ASPxDateEdit ID="dateEdit" ClientInstanceName="dateEdit" runat="server" Theme="Aqua">
        < /dx:ASPxDateEdit>
	

www.hikmetokumus.com

< dx:ASPxDateEdit ID="dateEdit" ClientInstanceName="dateEdit" runat="server" Theme="Aqua">
	< CalendarProperties ShowTodayButton="false" ShowClearButton="false">
	< /CalendarProperties>
< /dx:ASPxDateEdit>

www.hikmetokumus.com


Başarılar dilerim.

DevExpress ASPxTreeList İle ExpandCollapseAction Kullanımı

22.12.2016 Hikmet Okumuş 279 0 DevExpress Web

Merhaba arkadaşlar,

ASPxTreeList kontrolünde node elemanlarını expand / collapse yapmak için 3 farklı yöntemi kullanabilirsiniz. Bunun için SettingsBehavior -> ExpandCollapseAction özelliğini setlemeniz gerekmektedir.

www.hikmetokumus.com

Button: (+) ve (-) butonları ile çalışır.
NodeClick: Node üzerine mouse ile tek tıklama ile çalışır.
NodeDblClick: Node üzerine mouse ile çift tıklama ile çalışır.

Başarılar dilerim.