Merhaba arkadaşlar,

Stopwatch, genel itibari ile bir prosesin başlangıçtan bitişe kadar geçen işlem süresini ölçmek için kullanılmaktadır. Farklı yöntemlere göre işlem süresi baz alınarak kod optimizasyonu yapmamızı ve farklı yöntemleri performans yönünden benchmark etmemize yardımcı olur. Nesneye ait özelliklere ulaşmak için aşağıdaki MSDN linkine bakabilirsiniz.

Stopwatch

Örneğimizde iki farklı yöntemi benchmark yapacağız. Elimizde bir sayı koleksiyonu var ve biz bu koleksiyonun elemanlarını bir Console uygulaması ile ekrana yazdırmak istiyoruz. Koleksiyon elemanlarını yazdırmak için bir döngü işlemine ihtiyacımız var. Öncelikle bir For döngüsü ile ekrana yazdırmayı deneyelim.

    static void Main(string[] args)
    {
        List< int> numbers = new List< int>();
        for (int i = 1; i <= 1000; i++)
            numbers.Add(i);

        Stopwatch stopwatch = new Stopwatch();
        stopwatch.Start();

        for (int i = 0; i < numbers.Count; i++)
        {
            Console.WriteLine(numbers[i]);
            Thread.Sleep(10);
        }        

        stopwatch.Stop();            
        Console.WriteLine($"Time elapsed (For): {stopwatch.Elapsed}");

        Console.ReadLine();
    }

www.hikmetokumus.com

For döngüsü ile işlem başlangıç bitiş süresini hesapladık. Kodu farklı yöntemler ile optimize etsek daha performanslı bir sonuç elde edebilir miyiz ? Bunu görmek için Parallel.For yapısına göre kodumuzu revize edelim ve Stopwatch ile süreyi hesaplayalım.

    static void Main(string[] args)
    {
        List< int> numbers = new List< int>();
        for (int i = 1; i <= 1000; i++)
            numbers.Add(i);

        Stopwatch stopwatch = new Stopwatch();
        stopwatch.Start();

        Parallel.ForEach< int>(numbers, x =>
        {
            Console.WriteLine(x);
            Thread.Sleep(10);
        });

        stopwatch.Stop();
        Console.WriteLine($"Time elapsed (Parallel For): {stopwatch.Elapsed}");        

        Console.ReadLine();
    }

www.hikmetokumus.com

Her iki yapıya göre işlem sürelerini baz aldığımızda, Parallel.For yapısının daha iyi bir performans sunduğu görülmektedir. Artık kodumuzu Parallel.For yapısına göre değiştirebiliriz. Konunun başında belirttiğim gibi, Stopwatch sayesinde farklı işlem yapılarını, kod bloklarını bu şekilde süre bazında ölçebilir, yapıları benchmark edebiliriz.


Başarılar dilerim.

Merhaba arkadaşlar,

Bir veri kümesinde, where kısıtı ile sonuca dahil etmek istediğimiz ya da dışında tutmak istediğimiz koleksiyon türünde kriterimiz olabilir. SQL de bunu In ya da Exists kullanarak yapabilmekteyiz. Linq karşılığı olarak böyle bir işlem yapmak istediğimizde Contains ya da Any metodları tercih edilebilir. Bir örnek üzerinden detaylandıralım.

Contains İle In Sorgusu Oluşturmak

    static void Main(string[] args)
    {
        using (var context = new NorthwindContext())
        {
            int[] idCollection = { 1, 3, 4, 7 };

            List< Categories> categories = (from x in context.Categories
                                           where idCollection.Contains(x.CategoryID)
                                           select x)
                                           .ToList();

            foreach (var item in categories)
                Console.WriteLine(item.CategoryName);         
        }

        Console.ReadLine();
    }

Örneğimize göre idCollection içerisine, sonuca dahil etmek istediğimiz kategorilerin id değerlerini yazdık. Sonrasında Linq ile sorgularken, idCollection dizisi içerisindeki değer ile eşleşen kayıtları getirmek için Contains metoduna CategoryID bilgisini argüment olarak yazdık. Linq sorgusu çalıştığı zaman bize aşağıdaki gibi bir sonuç döndürecektir.

www.hikmetokumus.com

Biz sorgumuzu içeren olarak yazdık. Eğer tam tersi bir durumda, koleksiyon içerisindeki değerleri içermeyen yani "NOT IN" olarak yazmak için şu şekilde revize etmemiz yeterli olacaktır.

List< Categories> categories = (from x in context.Categories
                               where idCollection.Contains(x.CategoryID) == false
                               select x)
                               .ToList();

www.hikmetokumus.com

Örneği Linq kullanarak yazdık. Lambda ifadesi ile aşağıdaki gibi yazılabilir.

List< Categories> categories = context.Categories.Where(x => idCollection.Contains(x.CategoryID)).ToList();

"NOT IN" için

List< Categories> categories = context.Categories.Where(x => !idCollection.Contains(x.CategoryID)).ToList();

Any İle In Sorgusu Oluşturmak

Daha önce Any kullanımı ile ilgili bir makale yazmıştım. Aşağıdaki linkten ilgili makaleye erişebilirsiniz.

Linq İle Any Metodu Kullanımı

Any metodunu kullanarak Contains ile yaptığımız işlemdeki aynı sonucunu elde edebiliriz.

static void Main(string[] args)
{
    using (var context = new NorthwindContext())
    {
        int[] idCollection = { 1, 3, 4, 7 };

        List< Categories> categories = (from x in context.Categories
                                       where idCollection.Any(f => f == x.CategoryID)
                                       select x)
                                      .ToList();

        foreach (var item in categories)
            Console.WriteLine(item.CategoryName);
    }

    Console.ReadLine();
}

www.hikmetokumus.com

İçermeyen kısıtı için aşağıdaki gibi düzeltme yapılabilir.

List< Categories> categories = (from x in context.Categories
                               where idCollection.Any(f => f == x.CategoryID) == false
                               select x)
                              .ToList();

www.hikmetokumus.com

Her iki yöntem ile de aynı sonucu elde edebiliyoruz. Fakat Entity Framework' ün oluşturduğu sorgular, iki yöntem için de farklılık göstermektedir. Kullanım tercihinizi buna göre yapabilir, aynı zamanda SQL Management - Execution Plan ile performans ve güç tüketimlerini karşılaştırabilirsiniz.

Contains

SELECT 
    [Extent1].[CategoryID] AS [CategoryID], 
    [Extent1].[CategoryName] AS [CategoryName], 
    [Extent1].[Description] AS [Description], 
    [Extent1].[Picture] AS [Picture]
    FROM [dbo].[Categories] AS [Extent1]
    WHERE [Extent1].[CategoryID] IN (1, 3, 4, 7)

Any

SELECT 
    [Extent1].[CategoryID] AS [CategoryID], 
    [Extent1].[CategoryName] AS [CategoryName], 
    [Extent1].[Description] AS [Description], 
    [Extent1].[Picture] AS [Picture]
    FROM [dbo].[Categories] AS [Extent1]
    WHERE  EXISTS (SELECT 
        1 AS [C1]
        FROM  (SELECT 
            1 AS [C1]
            FROM  ( SELECT 1 AS X ) AS [SingleRowTable1]
        UNION ALL
            SELECT 
            3 AS [C1]
            FROM  ( SELECT 1 AS X ) AS [SingleRowTable2]
        UNION ALL
            SELECT 
            4 AS [C1]
            FROM  ( SELECT 1 AS X ) AS [SingleRowTable3]
        UNION ALL
            SELECT 
            7 AS [C1]
            FROM  ( SELECT 1 AS X ) AS [SingleRowTable4]) AS [UnionAll3]
        WHERE [UnionAll3].[C1] = [Extent1].[CategoryID]
    )

Başarılar dilerim.

Linq İle Except Kullanımı

23.06.2017 Hikmet Okumuş 199 0 Linq & Lambda

Merhaba arkadaşlar,

Except, bir koleksiyon içerisinde bulunan elemanları, argüman olarak gönderilen başka bir koleksiyondaki elemanlar ile karşılaştırır ve aynı olan kayıtları birinci koleksiyondan çıkarmak için kullanılmaktadır. Bu işlem sonucunda geriye birinci koleksiyonun yeni halini döndürmektedir.

Örnek olarak aşağıdaki gibi 2 tane sayı dizimiz olsun. Except metodu ile numberA içerisinde geçen numberB elemanları dışlanacak ve geriye yeni bir koleksiyon döndürelecektir.

    static void Main(string[] args)
    {
        int[] numberA = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        int[] numberB = { 1, 3, 5, 7, 9 };

        var result = numberA.Except(numberB);

        foreach (var item in result)
            Console.WriteLine(item);

        Console.ReadLine();
    }

www.hikmetokumus.com

Alternatif olarak bu işlemi bir döngü yöntemi ile de yapabilirdik. Fakat Expect bu gibi bir işlemde daha basit bir kullanım imkanı sunmaktadır.


Başarılar dilerim.

Linq İle Inner Join Kullanımı

21.06.2017 Hikmet Okumuş 314 0 Linq & Lambda

Merhaba arkadaşlar,

Join, iki ya da daha fazla sonuç kümesini, bir ya da birden fazla kritere göre birbirine bağlayan ve geriye bir sonuç kümesi döndüren bir yapıdır. SQL Server' da olduğu gibi LINQ to SQL' de bize JOIN yazmamıza imkan vermektedir. Şimdi LINQ ile nasıl iki veri kümesini birleştireceğiz bunu örnek üzerinde inceleyelim.

Örneğimizde Northwind veritabanı kullanılacaktır. Veritabanı içerisinde bulunan Products ve Categories tabloları için bir INNER JOIN sorgusu oluşturacağız. LINQ öncesinde bu işlemi SQL sorgusu ile yapmak isteseydik, aşağıdaki gibi bir sorgu oluşturmamız gerekecekti.

SELECT P.ProductName, C.CategoryName 
FROM dbo.Products P
INNER JOIN dbo.Categories C ON P.CategoryID = C.CategoryID

www.hikmetokumus.com

Şimdi benzer örneği LINQ ile yazalım ve iki tabloyu INNER JOIN ile birleştirelim.

using (var context = new NorthwindContext())
{
    var result = from p in context.Products
                 join c in context.Categories on p.CategoryID equals c.CategoryID
                 select new
                 {
                     ProductName = p.ProductName,
                     CategoryName = c.CategoryName
                 };

    result.ToList().ForEach(x =>
    {
        Console.WriteLine($"Product Name: {x.ProductName}, Category Name: {x.CategoryName}");
    });
}

www.hikmetokumus.com

İlk örneğimizde, sonucu doğrudan SQL sorgusu yazarak görmüştük. Şimdi LINQ ile yazdığımız kodun, bizim için arka tarafta oluşturmuş olduğu SQL sorgusuna bakalım.

SELECT 
[Extent2].[CategoryID] AS [CategoryID], 
[Extent1].[ProductName] AS [ProductName], 
[Extent2].[CategoryName] AS [CategoryName]
FROM  [dbo].[Products] AS [Extent1]
INNER JOIN [dbo].[Categories] AS [Extent2] ON [Extent1].[CategoryID] = [Extent2].[CategoryID]

LINQ tarafından oluşturulan sql sorgusuna baktığımız zaman, ilk örnekte yazılan sorgu ile benzer bir sql ifadesinin oluştuğu görülmektedir. JOIN ifadesinde kullanılan equals anahtarı, eşitliği karşılaştırmak için kullanılmıştır. equals yerine "==" şeklinde bir eşitlik kontrolü kullanamayız. LINQ, JOIN işlemi için bu şekilde bir syntax' ı desteklememektedir. Eğer işlemimiz gereği equals yerine not equals şeklinde bir sorgulama yapılacaksa, bu tarz bir syntax' ı da LINQ desteklememektedir. Eşit değil gibi bir kontrol için farklı yöntemler kullanılabilmektedir.


Başarılar dilerim.

C# İle Sealed Anahtar Kelimesinin Kullanımı

07.06.2017 Hikmet Okumuş 298 0 C#

Merhaba arkadaşlar,

Kalıtım, bir nesne üyelerinin farklı nesne / nesnelere aktarılmasına ve üyelerin bu nesneler tarafından kullanılmasına yarayan OOP nin en önemli özelliklerinden birisidir. Sealed kullanımı öncesinde kalıtım konusunun tam anlamı ile oturmuş olması gerekmektedir. Sealed, sınıfların kalıtım işlemini engellemek için kullanılan bir anahtar kelimedir. Sealed anahtar kelimesi bir sınıf için uygulanacak ise kalıtımı, bir üye için uygulanacak ise üyenin override edilmesini engellemektedir. Kısaca örnekler üzerinden inceleyelim.

Sınıf İçin Kullanımı

X sınıfı Y sınıfına miras olarak atanmaktadır.

    class X
    {
      
    }

    class Y : X
    {
                                        
    }

X sınıfı için kalıtımı engelleyelim. Bunun için class ifadesinin başına Sealed anahtarını ekliyoruz.

    sealed class X
    {
       
    }

    class Y : X
    {

    }

Bu işlem sonrasında derleme zamanında aşağıdaki gibi bir hata ile karşılaşırız. Bu hata bize X sınıfının herhangi bir nesneye kalıtım ile aktarılamayacağını söylemektedir.

www.hikmetokumus.com

Sınıf Üyeleri İçin Kullanımı

Sealed anahtar kelimesi eğer bir override metod için kullanılırsa, ilgili sınıf başka bir sınıfa kalıtım ile aktarıldığı zaman metodun override edilmesini engellemiş olur. Örnek sınıfımıza bir metod ekleyelim.

    class X
    {
        protected virtual void Test()
        {
            Console.WriteLine("X.Test");
        }
    }

    class Y : X
    {
    
    }

Override etmek istediğimizde Test metodu listede karşımıza çıkmaktadır.

www.hikmetokumus.com

    class X
    {
        protected virtual void Test()
        {
            Console.WriteLine("X.Test");
        }
    }

    class Y : X
    {
        protected override void Test()
        {
            Console.WriteLine("Y.Test");
        }
    }

Şimdi Y sınıfı içerisindeki Test metoduna sealed anahtarını ekleyelim.

    class X
    {
        protected virtual void Test()
        {
            Console.WriteLine("X.Test");
        }
    }

    class Y : X
    {
        protected sealed override void Test()
        {
            Console.WriteLine("Y.Test");
        }
    }

    class Z : Y
    {
    
    }

Yeni eklediğimiz Z sınıfı Y sınıfından kalıtım almaktadır. Şimdi Z sınıfı için override edilecek üyeleri inceleyelim.

www.hikmetokumus.com

Görüldüğü gibi override edilebilecek üyeler arasında Test metodu yer almamaktadır. Z sınıfından Test metoduna erişim için, Z sınıfının bir kopyası üzerinden ya da sınıf içerisinde base anahtar kelimesi ile miras alınan üyelere erişilebilir ve Y içerisindeki Test metodu bu şekilde kullanılabilir. Ama Y içerisinde Test metodu sealed anahtar kelimesi ile engellendiği için, bu sınıfı miras alan sınıflarda override edilemez.

Y sınıfı içerisinde Test metodu sealed ile engellenmemiş olsun ve Z sınıfından override edelim.

    class X
    {
        protected virtual void Test()
        {
            Console.WriteLine("X.Test");
        }
    }

    class Y : X
    {
        protected override void Test()
        {
            Console.WriteLine("Y.Test");
        }
    }

    class Z : Y
    {
        protected override void Test()
        {
            Console.WriteLine("Z.Test");
        }
    }

Eğer override işleminden sonra Y sınıfında Test metodu için sealed anahtar kelimesini kullanırsak, derleyici tarafından aşağıdaki gibi bir hata ile karşılaşırız.

    class X
    {
        protected virtual void Test()
        {
            Console.WriteLine("X.Test");
        }
    }

    class Y : X
    {
        protected sealed override void Test()
        {
            Console.WriteLine("Y.Test");
        }
    }

    class Z : Y
    {
        protected override void Test()
        {
            Console.WriteLine("Z.Test");
        }
    }

www.hikmetokumus.com

Uygulamalarınızda kalıtımın yapılmasını istemediğiniz sınıflarda güvenliği sağlamak ya da yanlış kalıtım işlemlerini engellemek için sealed anahtarını kullanabilirsiniz.


Başarılar dilerim.

Merhaba arkadaşlar,

MSSQL Server' da Stored Procedure ile User Defined Function arasında bulunan yapısal farklılıklar hakkında aşağıdaki tablodan bilgi alabilirsiniz.
# Stored Procedure User Defined Function
1 Stored Procedure geriye bir değer döndürebilir ya da döndürmeyebilir. Function geriye bir değer döndürmek zorundadır.
2 Stored Procedure SELECT ifadesi ile birlikte; INSERT, UPDATE, DELETE ve benzeri DML ifadelerini kullanabilir. Function sadece SELECT ifadesini kullanmaya izin verir, DML ifadeleri kullanılamaz.
3 Stored Procedure giriş ve çıkış parametrelerine sahip olabilir. Function sadece giriş parametresine sahip olabilir, çıkış parametresi desteklenmemektedir.
4 Stored Procedure içerisinde try catch bloklarının kullanılmasına izin verir. Function try catch bloklarının kullanılmasına izin vermez.
5 Stored Procedure içerisinde Transaction işlemleri yapılabilir. Function içerisinde Transaction işlemine izin verilmez.
6 Stored Procedure içerisinde TABLE değişkeni ve TEMPORARY TABLE kullanılabilir. Function içerisinde TABLE değişkeni kullanılabilir, TEMPORARY TABLE kullanımına izin verilmemektedir.
7 Stored Procedure ile Function çağrılabilir. Function ile Stored Procedure çağrılamaz.
8 Stored Procedure çalıştırmak için EXECUTE/EXEC ifadeleri kullanımaktadır. SELECT/WHERE/HAVING ve benzeri ifadeler ile çağrılamaz. Function çalıştırmak için SELECT ifadesi kullanılmaktadır.
9 Stored Procedure ile döndürülen sonuç kümesi bir JOIN işlemine dahil edilemez. (Procedure içerisinde JOIN kullanımından bahsedilmiyor.) Function ile döndürülen sonuç kümesi JOIN işleminde kullanılabilir. (Function içerisinde JOIN kullanımından bahsedilmiyor.)
10 Stored Procedure içerisinde PRINT ifadesi kullanılabilmektedir. Function içerisinde PRINT ifadesinin kullanımı desteklenmemektedir.

Başarılar dilerim.

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ş 294 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ş 502 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ş 525 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.