Makale Özeti

Vs.Net 2005 ile gelen yeni bir kontrol olan DataGridView'e DateTimePicker içeren bir kolon tipini nasıl eklyebileceğimizi ve nasıl kullanabileceğimizi inceleyeceğiz.

Makale

         Merhabalar,

         Bu makalemde sizlerle Vs.Net 2005 ile gelen yeni bir kontrol olan DataGridView'e DateTimePicker içeren bir kolon tipini nasıl eklyebileceğimizi ve nasıl kullanabileceğimizi inceleyeceğiz.

         DataGridView'in gelen standart kolonları DataGridViewTextBoxColumn, DataGridViewLinkColumn, DataGridViewImageColumn, DataGridViewComboBoxColumn, DataGridViewCheckBoxColumn, DataGridViewButtonColumn'dur. Görüldüğü gibi Vs.net 2003'ün içerdiği DataGride göre kolon tipleri geliştirilmiştir vede bu makalemde bahsetmeyeceğim bir sürü yeni property artık DataGridView da mevcuttur.

         Öncelikle bir kolon yaratmak için nelere gerek vardır. Bu konu üzerinde duralım. Bir kolon yaratmak için bir DataGridViewColumn clasından türemiş bir classa. DataGridViewCell classından türemiş bir classa vede kolonun içinde kullandığımız kontrolden türemiş ve IDataGridViewEditingControl interface'ini implement etmiş bir classa ihtiyacımız vardır. ilk önce bunları oluşuralım.

         Yaratacağımız kolonun özellileri en çok DataGridView'ın mevcut kolonlarından DataGridViewTextBoxColumn'a benzediği için bu yapıyı temel alarak ilerleyeceğiz.

         İlk önce Kolon classımızı yaratarak başlıyoruz.
using System;
using System.Collections.Generic;
using
System.Text;
using
System.Windows.Forms;
namespace TamerControls
{
       public class TamerDataGridViewDateTimePickerColumn : DataGridViewColumn
       {
             public TamerDataGridViewDateTimePickerColumn()
                   : base(new TamerDataGridViewDateTimePickerCell())
             {
             }
             public override DataGridViewCell CellTemplate
             {
                   get
                   {
                         return base.CellTemplate;
                   }
                   set
                   {
                         if (value != null && !value.GetType().IsAssignableFrom(typeof(TamerDataGridViewDateTimePickerCell)))                         {
                              throw new InvalidCastException("Tip Uyusmazligi");
                         }
                          base.CellTemplate = value;
                   }
             }
       }
}

         Üst satırlarda yarattığımız class temel DataGridViewColum özelliklerini taşırken Constructor'da belirttiğimiz gibi kolon içinde yaratılacak her yeni hücrenin tipi TamerDataGridViewDateTimePickerCell olacaktır. Ayrıca DataGridViewCell classının CellTemplate property'sini ezerek artık CellTemplate'in sadece belirlediğimiz Cell tipinden belirlenebilmesini sağlıyoruz.

         Şimdi sırada Bu kolona ait hücrelerin oluşacağı sınıf olan Hücre Sınıfımızı yaratalım.

using System;
using
System.Collections.Generic;
using
System.Text;
using
System.Windows.Forms;
 
namespace TamerControls {
      public class TamerDataGridViewDateTimePickerCell : DataGridViewTextBoxCell

      {

        public TamerDataGridViewDateTimePickerCell()

            {

                  this.Style.Format = "d";

            }

            public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)

            {

                  base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);

                  TamerDataGridViewDateTimePickerEditingControl cec = (TamerDataGridViewDateTimePickerEditingControl)DataGridView.EditingControl;

                  cec.Value = (DateTime)this.Value;

 
           }
            public override Type EditType

            {

                  get

                  {

                        return typeof(TamerDataGridViewDateTimePickerEditingControl);

                  }

            }

            public override Type ValueType

            {

                  get
                  {

                        return typeof(DateTime);

                  }

            }

            public override object DefaultNewRowValue

            {

                  get
                  {

                        return DateTime.Now;

                  }

            }

      }

}
         Bu classımızda ise DataGridViewtextBoxCell'in temel özelliklerini alıyoruz ve Constructor(Yapıcı Metod)'umuzda oluşacak olan hücrenin formatının d(short time string) olacağını belirliyoruz. Bundan Sonraki kısımda ise hücreye girildiği zaman oluşacak olan EditingControl(DateTimePicker Yapısı) 'nın oluşması esnasında yapılacak olaylar InitializeEditingControl metodunda yapılıyor. Bu kısımda ise nesnemizin bir instance'ini alıyoruz ve DateTimePicker in değerine hücremizin üzerinde yazılı olan değer(value) sini alıyoruz ve DateTime tipine çeviriyoruz. Daha sonraki kısımlarda ise düzenleme tipini temsil eden EditType'ı ve değeri temsil eden ValueType'ı belirtiyoruz. En son yazdığımız property ise yeni bir hücre yaratıldığında default hangi değeri alacağını belirtmeye yaramaktadır.

          Şimdi ise hücremizin içinde yaratılacak olan DateTimePicker tipinde olan kontrolümüzü oluşturalım.
using System;
using
System.Collections.Generic;
using
System.Text;
using
System.Windows.Forms;
namespace TamerControls {
      public class TamerDataGridViewDateTimePickerEditingControl : DateTimePicker, IDataGridViewEditingControl

      {

            private DataGridView dataGridViewControl;

            private bool valueIsChanged = false;

            private int rowIndexNum;

            public TamerDataGridViewDateTimePickerEditingControl()

            {

                  this.Format = DateTimePickerFormat.Short;

            }

 
           #region IDataGridViewEditingControl Members
             public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
            {

                  this.Font = dataGridViewCellStyle.Font;

                  this.CalendarForeColor = dataGridViewCellStyle.ForeColor;

                  this.CalendarMonthBackground = dataGridViewCellStyle.BackColor;

            }

            public DataGridView EditingControlDataGridView
 
            {

                  get

                  {

                        return dataGridViewControl;

                  }

                  set

                  {

                        dataGridViewControl = value;

                  }

            }

            public object EditingControlFormattedValue

            {

                  get

                  {

                        return this.Value.ToShortDateString();

                  }

                  set

                  {

                        if (value is string)

                        {

                             this.Value = DateTime.Parse(value.ToString());

                        }

                  }

            }

 
           public int EditingControlRowIndex
            {

                  get

                  {

                        return rowIndexNum;

                  }

                  set

                  {

                        rowIndexNum = value;

                  }

            }

 
          public bool EditingControlValueChanged
            {

                  get

                  {

                        return valueIsChanged;

                  }

                  set

                  {

                        valueIsChanged = value;

                  }

            }

            public bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey)

            {

                  switch (keyData)

                  {

                        case Keys.Left:

                        case Keys.Up:

                        case Keys.Down:

                        case Keys.Right:

                        case Keys.Home:

                        case Keys.End:

                        case Keys.PageDown:

                        case Keys.PageUp:

                             return true;

                        default:

                             return false;

                  }
             }
 
           public Cursor EditingPanelCursor
            {

                  get

                  {

                        return base.Cursor;

                  }

            }

            public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)

            {

                  return this.Value.ToShortDateString();

            }

            public void PrepareEditingControlForEdit(bool selectAll)

            {

                  //Kontrolümüzü editmele moduna
hazırlamak için herhangi bir işlem yapmayacağız.
            }

            public bool RepositionEditingControlOnValueChange

            {

                  get

                  {

                        return false;

                  }

            }

            protected override void  OnValueChanged(EventArgs eventargs)

            {

                  valueIsChanged = true;

                  this.EditingControlDataGridView.NotifyCurrentCellDirty(true);

                  base.OnValueChanged(eventargs);

            }

            #endregion

      }

}
         Oluşturduğumuz bu classta DateTimePicker özelliklerini temel alıyoruz ve daha sonra IDataGridViewEditingControl yeteneğini class'ımıza katıyoruz. Daha Sonra bu cell'in hangi DataGridView'da ve hangi row'da olduğunu tutabileceğimiz ve değerinin değişip değişmediğini tutabileceğimiz memberları tanımlıyoruz. Constructor'ımızda ise kontrolümüzün tarih gösterme formatını ayarlıyoruz. Bundan sonrası implement ettiğimiz interface'in özelliklerini istediğimiz şekilde değiştirmektir. Kısaca hepsini açıklayalım.

   ApplyCellStyleToEditingControl : Bu metodda oluşacak olan kontrolün hücremizin sitilinde olması sağlanıyor.
   EditingControlDataGridView : Bu property'de ise hücremizin hangi DataGridView'da bulunduğu belirtiliyor.
   EditingControlFormattedValue : Bu property'de ise kontrolümüze değer atamanın ve değer okumasının nasıl gerçekleştiği anlatılıyor.
   EditingControlWantsInputKey : Hücremizde kullanabileceğimiz tuşları belirliyoruz.
   EditingPanelCursor : Hücremizde gözükecek olan cursor.
   GetEditingControlFormattedValue : Kontrolümüzden geri dönecek olan biçimlendirilmiş değeri belirliyoruz.
   PrepareEditingControlForEdit : Yukarıda açıklandığı gibi  bu metodda bir işlem yapmayacağız.
   RepositionEditingControlOnValueChange : Değer değiştiğinde hücremizin pozisyonunun değişmeyeceğini belirtiyoruz.
   OnValueChanged : Kontrolümüzün değeri değiştiği zaman gerçekleşmesini istediğimiz metodları ve olayları bu kısma yazıyoruz. NotifyCurrentCellDirty mevcut hücrenin içeriğini değiştiğini ve henüz commit edilmediğini DataGridView'e bildirmeye yaramaktadır.

   Yarattığımız bu kontrolü DataGridView içinde kullanabilmek için DataGridView'e sağ tıklayarak AddColumns diyerek menüden seçmemiz yeterli olacaktır. Projemizde bu classlar yeraldığı sürece DataGridView kolon tipini otomatik olarak tanıyacaktır. Kolonumuzu Design Time'da görsel olarak yaratabileceğimiz gibi Kod tarafında Kolon classımızın bir instance'sini alarak ve özelliklerini belirleyerek yaratmakda mümkündür.



          Sizde bu şekilde kendi geliştirdiğiniz kontrol tipinde DataGridView kolonları yaratabilirsiniz.

Tamer ÖZ

oztamer@hotmail.com
tamer.oz@yazgelistir.com
oztamer@hotmail.com

Msdn