Click here to Skip to main content
Click here to Skip to main content

Nullable datetime column in .NET DataGrid with DateTimePicker

By , 17 Aug 2009
 

Introduction

I have always known a lot of people who have problems with the standard .NET 2.0 DataGridView and the nullable DateTime column (created with Oracle PL/SQL column definition):

dtReceived DATE

or a MS SQL Server DateTime column with NULL values in Transact SQL:

dtReceived DATETIME NULL

Google Search normally gives this Microsoft sample for calendar columns: How to: Host Controls in Windows Forms DataGridView Cells. This is a good start point, but it isn't enough. You can never correctly fill DateTime DataGridView cells with NULL. I found many variants for the simple DateTimePicker class, but work samples absent for nullable DateTime columns in a DataGridView.

Solution

I spent a lot of time on the Internet searching, and found a nice article about a nullable DateTimePicker: DateTimePicker DBNull. I then made several corrections and as 'magic touch', and it works for DataGridViews now.

Using the code

These are the steps we need:

  1. Rename the class DateTimePicker to DatePicker (the same name for different classes is a bad practice, in my opinion):
  2. public class DatePicker : System.Windows.Forms.DateTimePicker
    {..
  3. Add the following code snippet to the DatePicker class:
  4. public string ToShortDateString() 
    { 
        if (!realDate) 
            return String.Empty; 
        else 
        { 
            DateTime dt = (DateTime)Value; 
            return dt.ToShortDateString(); 
        }
    }
  5. Correct CalendarEditingControl.cs from the Microsoft Sample for usage in our DatePicker:
  6. class CalendarEditingControl : DatePicker, IDataGridViewEditingControl { ...
  7. Correct CalendarCell.cs from the Microsoft Sample for DBNull:
  8. public override void InitializeEditingControl(int rowIndex, object 
    initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle) 
    { 
        // Set the value of the editing control to the current cell value.
        base.InitializeEditingControl(rowIndex, initialFormattedValue, 
                                                dataGridViewCellStyle); 
        CalendarEditingControl ctl = 
        DataGridView.EditingControl as CalendarEditingControl;
    
        // ++ vic 14-aug-2009
         object val = null;
         try 
         {
              val = this.Value;
         }
         catch (Exception ex)
         { 
              // Argument ot of range (value doesn't exists in collection)
              return;
         }
         
         if (val != System.DBNull.Value)
              ctl.Value = (DateTime)val;
    }

That's all, folks :)

You should press the DEL key to set a NULL filled DateTime cell.

The source code is attached. You can directly use the files from my project in your projects like in the Microsoft Samples (DatePicker.cs, CalendarCell.cs, CalendarColumn.cs, CalendarEditingControl.cs):

private void Form1_Load(object sender, EventArgs e)
{
     CalendarColumn col = new CalendarColumn();
     this.dataGridView1.Columns.Add(col);
     this.dataGridView1.RowCount = 5;
     foreach (DataGridViewRow row in this.dataGridView1.Rows)
     {
          row.Cells[0].Value = DateTime.Now;
     }
}

or from the Microsoft Visual Studio Data Designer for DataGrid (right mouse click on DataGridView, and choose 'Edit columns' from the context menu):

I have attached a real sample with database (Visual Studio 2008 / SQL Express database).

History

  • 14-Aug-2009: Initial version posted.
  • 16-Aug-2009: Database sample added.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

vic_ch2000
Web Developer
Russian Federation Russian Federation
Member
Microsoft certified professional developer (MCPD)

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralThank you very much !!memberMazen el Senih28 Jul '12 - 1:18 
QuestionReallly good article!membervishme27 Mar '12 - 0:12 
Questiondoubt!memberchoosechrist26 Feb '12 - 21:14 
BugRow delete problemmemberMember 817129618 Nov '11 - 6:38 
QuestionSome bug...memberdomivan24 Aug '11 - 4:37 
QuestionRe: Some bug...memberdjax5 Mar '13 - 0:40 
GeneralBrilliant! Thanks so muchmemberDaniel Neal12 May '11 - 0:46 
Generalediting problem.memberMohsin Hawra14 Jul '10 - 22:22 
GeneralRe: editing problem.memberRazze11 Oct '10 - 2:07 
AnswerRe: editing problem.membercje1235 Dec '10 - 16:41 
GeneralRe: editing problem.memberwouterdebo12 Jun '12 - 3:33 
GeneralGreat jobmemberkhalil Youssef30 Jun '10 - 21:14 
GeneralGreat JobmemberMohammad Rafi Bin Abd Alim16 Jun '10 - 20:11 
QuestionAllowing editing of the 'Time' portion of the DateTime [modified]memberKMalone11 May '10 - 22:00 
AnswerRe: Allowing editing of the 'Time' portion of the DateTimememberKMalone11 May '10 - 23:54 
GeneralRe: Allowing editing of the 'Time' portion of the DateTimememberKim Bilida16 Jul '10 - 5:58 
GeneralGreat!memberMember 411002520 Mar '10 - 12:05 
Generalthis.Value VS this.ToShortDateString()memberDrew Loika1 Feb '10 - 11:38 
GeneralRe: this.Value VS this.ToShortDateString()membervic_ch20001 Feb '10 - 18:23 
Generalthank youmemberSamir the Boy13 Jan '10 - 0:06 
GeneralDBNull vs nullmemberDrew Loika17 Dec '09 - 13:09 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web02 | 2.6.130513.1 | Last Updated 17 Aug 2009
Article Copyright 2009 by vic_ch2000
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid