C# Month Calender - Mustafa Sabri OĞUZ

Duyurular

6 Ekim 2019 Pazar

C# Month Calender

C# Form tasarımında incelemek istediğim güzel bir arayüz kontrol (controller) sınıfı bulunmaktadır. Bu sınıfın adı "MonthCalender" bizim dilimizde "Aylık Takvim" olarak geçmektedir. Genelde bu sınıfı, kullanıcıdan bir tarih yada tarih aralığını seçmesini istediğimiz zamanlarda kullanırız. Örnek vermek gerekirse; belli başlı özel günleri belirte bildiğimiz gibi, resmi ve dini bayramlar (Kurban, Ramazan, vs...) gibi belli bir tarih aralığına sahip tarihleri belirtebilmek için bu sınıftan yararlanırız.
MonthCalender nesnesinin birçok farklı kullanımı ve kullanım ihtiyacından dolayı kendine has özellikleri bulunmaktadır. Tabi ki bunların bir çoğu diğer kontrol sınıflarıyla benzerlik gösterse de biz bu sınıfa ait özellikleri öğrenmeye çalışacağız.

Basit Kullanımı

Evet, Monthcalender sınıfımızı basit kullanımlarla tanımaya başlayalım. Daha sonra bu nesnenin olay (events) ve özelliklerini(properties) detaylı bir şekilde inceleyeceğiz.

Tekil Tarih Seçimi

Bu kullanım örneği, kullanıcıdan sadece tek bir tarih seçmesini istediğimiz zamanlarda kullanırız. Bu örnek için bir adet "Month Calender" kontrolü ve "Button" kontrolüne  ihtiyacımız var. Kontrollerimizi ekledikten sonra uygun bir isimlendirme yapıyoruz.

Daha sonra kullanıcının birden fazla tarih seçmesini engellemek gerekiyor, bunun için "MonthCalender" nesne özelliklerinden "MaxSelectionCount"  sayısını "1" değerine eşitlememiz gerekiyor.
Ardından buton kontrolüne çift tıklayarak, "click" eventini oluşturuyoruz. Bu buton eventini aşağıda ki gibi yazıyoruz.
private void Btn1_Click(object sender, EventArgs e)
{
    MessageBox.Show(monthCalendar1.SelectionStart.ToString("d"));
}
Kullanıcının seçtiği bilgiyi edinebilmek için nesnesinin "SelectionStart" yada "SelectionEnd"özelliğini kullanıyoruz. Bu özelliklerin geri dönüş türü "Datetime" türünde bir nesnedir. Eğer String türünde bir çıktı almak istiyorsanız, "ToString" metodundan yararlanabilirsiniz...
Ek Bilgi: ToString metodu içinde Gün/Ay/YIL formatı olarak "d" (dd.mm.yyyy) formatı kullanılmıştır.

Birden Fazla Tarih Aralığı Seçimi

Bu kullanım örneğinde ise kullanıcıdan bir veya birden fazla tarihin aynı anda seçilip, nasıl işlendiği anlatılmaktadır.
Şimdi örneğimize bir buton daha ekleyerek geliştiriyoruz. Month Calender kontrollerinin yanında seçili tarihlerinin sayısını gösteren buton ile seçili tarihleri listeleyen buton da dahil iki düğmemiz olacak.

Aylık takvimimiz çalışma mantığı oldukça basit; sürükle bırak yöntemi ile kullanıcıdan bir tarih yada belli bir tarih aralığını seçmesi gerekiyor. Seçeceği tarih aralığının uzunluğunu "MaxSelectionCount" özelliği ile belirliyoruz. Bu örneğinde kullanıcının en fazla 1 aylık süreyi yani 31 gün olarak belirliyorum. Siz ihtiyacınıza göre bu gün sayısını değiştirebilirsiniz.

Bu örneğimizin işleyişi temelde önce ki örneğimiz ile aynı mantığa sahip, tek farkı seçilen ilk gün bilgisi ile son gün bilgisine erişmemiz ve buna göre arada ki günleri de hesaplamamız gerekiyor. "Seçili Tarih Sayısı" yazılı butonun üzerinden çift tıklayarak, Click eventi oluşturuyoruz.
private void BtnGoster_Click(object sender, EventArgs e)
{
        string mesaj = "Seçili {0} gün bulunmaktadır.";
        string gun = string.Format(mesaj, gunFarki() + 1);
        MessageBox.Show(gun);
        //MessageBox.Show(monthCalendar1.SelectionRange.ToString());
}
Oluşturduğumuz Click Event metoduna yukarıda ki kodu yazıyoruz. Ardından seçili gün sayılarını hesaplayacak olan gunFarki() adlı metodu oluşturmamız gerekiyor.
Not: gunFarki() metodundan dönen değer, çıkarma işleminden dolayı 1 gün eksik hesaplamaktadır. Bu nedenle dönen değere + 1 gün eklenmiştir.
private int gunFarki()
{
        // İki Tarih arasında ki gün sayı farkını buluyoruz.
        DateTime ilkGun = monthCalendar1.SelectionStart;
        DateTime sonGun = monthCalendar1.SelectionEnd;
        TimeSpan gunSayisi = sonGun - ilkGun;

        return gunSayisi.Days;
}
Bu metodun çalışma mantığını açıklayacak olursak; Kullanıcının seçmiş olduğu tarih aralığını "SelectionStart" ve "SelectionEnd" özelliklerinde yer alan tarih nesnelerini (DateTime) iki değişkene atamak. Ardından bu değişkenlerin arasında ki farkı hesaplamak için basit bir matematiksel işlem ile son günden, ilk günü çıkarıyoruz ve TimeSpan türünde ki nesnemize atıyoruz. Son olarak bu nesnemizin "Days" özelliği ile toplam kalan gün sayısını integer bir değer olarak geri döndürüyoruz. Eğer bu iki metodu başarılı bir şekilde oluşturdu iseniz, üstte ki resim gibi bir sonuç almanız gerekmektedir.
Örneğimizin ikinci aşaması, ilk gün ve son gün tarihleri de dahil olmak üzere arada ki tarihlerin listelenmesi. Bunun için "Seçili Tarihleri Listele" yazılı butona çift tıklayarak Click eventini oluşturuyoruz.
private void BtnListele_Click(object sender, EventArgs e)
{
    gunleriListele();
}
Oluşturduğumuz event metodu içerisine oluşturacağımız gunleriListele() adlı metodu yazıyoruz.
private void gunleriListele()
{
    // Gün Listesini Oluşturma
    List gunler = new List();

    // Seçili ilk gun belirleniyor.
    DateTime gun = monthCalendar1.SelectionStart;

    // İlk günü dahil ederek arada ki günleri listeye ekliyoruz.
    gunler.Add(gun);
    for (int i = 0; i < gunFarki(); i++)
    {
        gun = gun.AddDays(1);
        gunler.Add(gun);
    }

    // Tarih Listesini Formatlanmış bir şekilde String Listesine Dönüştürüyoruz.
    List str_gunler = new List();
    foreach (var item in gunler)
    {
        str_gunler.Add(item.ToString("d"));
    }

    // Str_Gunler listesini tek bir string ifadede topluyoruz.
    String day_list = string.Join("\n", str_gunler.ToArray());
    MessageBox.Show(day_list);
}
Oluşturmuş olduğumuz bu metot aslında iki aşamadan oluşuyor. İlk aşaması seçili tarihleri DateTime türünde bir liste nesnesine sırayla eklemesi. Ardından MessageBox nesnesi ile göstereceğimiz için bu nesnenin String türünde listeye dönüştürülerek, MessageBox'da gösterilmesinden oluşuyor. Eğer bu metotları başarılı bir şekilde oluşturduysanız, yukarıda ki resimde ki bir sonuçla karşılaşmanız gerekiyor.

Takvim Üzerinden Kullanıcıya Bilgi Vermek

Bu kullanım örneğinde ise Aylık takvim nesnesinin üzerinde, kayıtlı tarihleri işaretlemek ve bu vesile ile kullanıcıya bilgi vermeyi amaçlamaktayız.
Kullanımı oldukça basit olan bu örneğimiz de hafta sonlarını koyu renkle belirteceğiz. Bunu Month Calender kontrollerinin BoldedDates özelliğini kullanarak gerçekleştireceğiz.
private void haftaSonları()
{
    monthCalendar1.BoldedDates = new DateTime[] {
        new DateTime(2019, 09, 01),
        new DateTime(2019, 09, 07),
        new DateTime(2019, 09, 08),
        new DateTime(2019, 09, 14),
        new DateTime(2019, 09, 15),
        new DateTime(2019, 09, 21),
        new DateTime(2019, 09, 22),
        new DateTime(2019, 09, 28),
        new DateTime(2019, 09, 29),
    };
}
İlk olarak hafta sonlarını ifade eden bir metot oluşturuyoruz ve içinde Month Calender nesnesinin "BoldedDates" özelliğine, DateTime türünde bir dizi tarih bilgisi hazırlayıp, eşitliyoruz. Bundan sonra bu metodu kullanmamız gerekiyor. Bunun için;
public Form1()
{
    InitializeComponent();
    haftaSonları();

    // Örnek için tarih sabitleme
    monthCalendar1.SelectionRange = new SelectionRange(new DateTime(2019, 09, 20), new DateTime(2019, 09, 20));
            
}
Evet, uygulamamız çalışmaya başlar, başlamaz metodumuzun çalışması için form nesnesinin Kurucu metodunda (Constructor) metodunda çağırıyoruz.
Not: Month Calender kontrolleri varsayılan olarak bugünün tarihini gösterdiği için belirtiğimiz tarihleri görebilmek adına ufak bir tarih seçimi gerçekleştirdim. Bilginize...

Özellikler (Property)

MonthCalender sınıfının sahip olduğu özellikler ve açıklamalarını aşağıda ki listeden takip edebilirsiniz.

Özellik AdıAçıklaması
AnnuallyBoldedDates Yıllık olarak tarihleri kalın göstermek veya kalın gösterilen tarihlerin bilgisini almaya yarar. DateTime[] dizisi türünde değerler set veya get edilebilir.
BackColor Kontrolün arka plan rengini belirlemeye veya öğrenmeye yarar. Color türünde bir değerle set veya get edilebilir.
BackgroundImage MonthCalender için arka plan resmi belirlemeye veya almaya yarar. Image türünde bir değerle set veya get edilebilir.
BackgroundImageLayout Şuan için açıklaması boş, en kısa zamanda güncellenecek tir.
BoldedDates Şuan için açıklaması boş, en kısa zamanda güncellenecek tir.
CalendarDimensions Ayları yıllık takvim olarak göstermeye yarar. Size türünde bir değerle set veya get edilebilir.
CreateParams Şuan için açıklaması boş, en kısa zamanda güncellenecek tir.
DefaultImeMode Şuan için açıklaması boş, en kısa zamanda güncellenecek tir.
DefaultMargin Kontrolün varsayılan kenarlarının uzunluk değerini verir. Padding türünde bir değer döndürür. (get)
DefaultSize Kontrolün varsayılan boyutunun değerini verir. Size türünde bir değer döndürür.(get)
DoubleBuffered Şuan için açıklaması boş, en kısa zamanda güncellenecek tir.
FirstDayOfWeek Haftanın ilk gününü belirlemeye yarar. Day türünde bir değerle set veya get edilebilir.
ForeColor Şuan için açıklaması boş, en kısa zamanda güncellenecek tir.
ImeMode Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
MaxDate Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
MaxSelectionCount Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
MinDate Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
MonthlyBoldedDates Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
Padding Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
RightToLeftLayout Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
ScrollChange Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
SelectionEnd Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
SelectionRange Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
SelectionStart Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
ShowToday Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
ShowTodayCircle Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
ShowWeekNumbers Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
SingleMonthSize Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
Size Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
Text Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
TitleBackColor Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
TitleForeColor Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
TodayDate Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
TodayDateSet Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
TrailingForeColor Şuan için açıklaması boş, en kısa zamanda güncellenecektir.

Metotlar (Methods)

MonthCalender sınıfının sahip olduğu özellikler ve açıklamalarını aşağıda ki listeden takip edebilirsiniz.

Metot Adı (Method)Açıklaması
AddAnnuallyBoldedDate Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
AddBoldedDate Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
AddMonthlyBoldedDate Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
CreateAccessibilityInstance Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
CreateHandle Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
DefWndProc Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
Dispose Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
GetDisplayRange Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
HitTest Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
IsInputKey Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
OnBackColorChanged Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
OnDateChanged Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
OnDateSelected Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
OnFontChanged Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
OnForeColorChanged Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
OnHandleCreated Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
OnHandleDestroyed Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
OnRightToLeftLayoutChanged Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
RemoveAllAnnuallyBoldedDates Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
RemoveAllBoldedDates Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
RemoveAllMonthlyBoldedDates Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
RemoveAnnuallyBoldedDate Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
RemoveBoldedDate Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
RemoveMonthlyBoldedDate Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
RescaleConstantsForDpi Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
SetBoundsCore Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
SetCalendarDimensions Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
SetDate Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
SetSelectionRange Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
ToString Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
UpdateBoldedDates Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
WndProc Şuan için açıklaması boş, en kısa zamanda güncellenecektir.

Olaylar (Events)

Sahip olduğu olaylar, açıklamaları ve kullanımlarını aşağıda ki listede açıklamaya çalıştım.

Olay Adı (Event)Açıklaması
BackgroundImageChanged Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
BackgroundImageLayoutChanged Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
Click Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
DateChanged Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
DateSelected Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
DoubleClick Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
ImeModeChanged Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
MouseClick Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
MouseDoubleClick Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
PaddingChanged Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
Paint Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
RightToLeftLayoutChanged Şuan için açıklaması boş, en kısa zamanda güncellenecektir.
TextChanged Şuan için açıklaması boş, en kısa zamanda güncellenecektir.

Ders Videosu

Video hazırlandığında eklenecektir.

Örnekler

Bu bölümde, farklı kullanımlarını içeren örnek makale başlıkları yer alacaktır.

Sonuç

Bu yazımızla bağlantılı kaynak kodunu bu adreste bulabilirsiniz. Umarım hazırladığım bu makale hoşunuza gitmiştir. Bir sonra ki yazımda görüşmek üzere...

3 yorum:

  1. Merhaba, yazınız ilgimi çekti elinize sağlık. Bilmediğimiz sayıda elemanı olan bir listbox nesnesindeki tarih elemanlarına göre takvimdeki ilgili tarihleri bold yapabilir miyiz?

    YanıtlaSil
    Yanıtlar
    1. Merhabalar, tabi ki yapabilirsiniz. Listbox nesnenizin veya itemlerinizin nasıl oluştuğunu bilmiyorum ama kabaca olması gereken fikir: listbox nesnenizin içeriğini DateTime türünden bir diziye aktararak gerçekleştirebilirsiniz. Google'a "listbox items to array" yazarak bir sürü örnek bulabilirsiniz.

      Sil
  2. Merhaba iki tarih arasındakını iş günlerini bulan bi program yapmam gerekiyor tatil günlerini ben belirliycem nasıl yapabılırım günlerdir işin icinden cıkamadım malesef

    YanıtlaSil