Question : Calendar Column in DGV

Dear Experts,

I am one of new in development field and using MS VS-2008 windows platform. In my first application I am using datagridview and also want to use date facility in this. I have down loaded below code from Microsoft web site. There is two problem which I am facing with this code and need your if you could.

1.    Whatever date I am selecting in datepicker. The datepicker select previous date of selected date.

2.    If the date is already selected but user want to remove it and set blank/null value, which is not working

Please help me to fix above problem if possible. My code is as follows:
Code Snippet:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
345:
346:
347:
348:
349:
350:
351:
352:
353:
354:
355:
356:
357:
358:
359:
360:
361:
362:
363:
364:
365:
366:
367:
368:
369:
370:
371:
372:
373:
374:
375:
376:
377:
378:
379:
380:
381:
382:
383:
384:
385:
386:
387:
388:
389:
390:
391:
392:
393:
394:
395:
396:
397:
398:
399:
400:
401:
402:
403:
404:
405:
406:
407:
408:
409:
410:
411:
412:
413:
414:
415:
416:
417:
418:
419:
420:
421:
422:
423:
424:
425:
426:
427:
428:
429:
430:
431:
432:
433:
434:
435:
436:
437:
438:
439:
440:
441:
442:
443:
444:
445:
446:
447:
448:
449:
450:
451:
452:
453:
454:
455:
456:
457:
458:
459:
460:
461:
462:
463:
464:
465:
466:
467:
468:
469:
470:
471:
472:
473:
474:
475:
476:
477:
478:
479:
480:
481:
482:
483:
484:
485:
486:
487:
488:
489:
490:
491:
492:
493:
494:
Imports System
Imports System.Windows.Forms
 
Public Class CalendarColumn
    Inherits DataGridViewColumn
 
    Public Sub New()
 
        MyBase.New(New CalendarCell())
 
    End Sub
 
    Public Overrides Property CellTemplate() As DataGridViewCell
 
        Get
 
            Return MyBase.CellTemplate
 
        End Get
 
        Set(ByVal value As DataGridViewCell)
 
 
 
            ' Ensure that the cell used for the template is a CalendarCell.
 
            If (value IsNot Nothing) AndAlso _
 
                Not value.GetType().IsAssignableFrom(GetType(CalendarCell)) _
 
                Then
 
                Throw New InvalidCastException("Must be a CalendarCell")
 
            End If
 
            MyBase.CellTemplate = value
 
 
 
        End Set
 
    End Property
 
 
 
End Class
 
 
 
Public Class CalendarCell
 
    Inherits DataGridViewTextBoxCell
 
    Private isNullable As Boolean = False
 
    Public Sub New()
 
        ' Use the short date format.
 
        Me.Style.Format = "dd-MMM-yyyy"
 
 
 
    End Sub
 
    Public Sub New(ByVal isNullable As Boolean)
 
        Me.New()
 
        Me.isNullable = isNullable
 
    End Sub
 
 
 
    Public Overrides Sub InitializeEditingControl(ByVal rowIndex As Integer, _
 
        ByVal initialFormattedValue As Object, _
 
        ByVal dataGridViewCellStyle As DataGridViewCellStyle)
 
 
 
        ' Set the value of the editing control to the current cell value.
 
        MyBase.InitializeEditingControl(rowIndex, initialFormattedValue, _
 
            dataGridViewCellStyle)
 
        If Not (Me.Value Is Nothing) And Not (Me.Value Is System.DBNull.Value) Then
 
            Dim ctl As CalendarEditingControl = _
 
                CType(DataGridView.EditingControl, CalendarEditingControl)
 
            'ctl.Value = CType(Me.Value, DateTime)
 
 
 
            ctl.ShowCheckBox = Me.isNullable
 
            If Me.Value IsNot Nothing AndAlso Me.Value IsNot DBNull.Value Then
 
                If TypeOf Me.Value Is DateTime Then
 
                    ctl.Checked = True      '
 
                    ctl.Value = DirectCast(Me.Value, DateTime)
 
                Else
 
                    Dim dtVal As DateTime
 
                    If DateTime.TryParse(Convert.ToString(Me.Value), dtVal) Then
 
                        ctl.Value = dtVal
 
                    End If
 
                End If
 
                If Me.isNullable Then
 
                    ctl.Checked = True
 
                End If
 
            ElseIf Me.isNullable Then
 
                ctl.Checked = False
 
            End If
 
        End If
 
    End Sub
 
 
 
    Public Overrides ReadOnly Property EditType() As Type
 
        Get
 
            ' Return the type of the editing contol that CalendarCell uses.
 
            Return GetType(CalendarEditingControl)
 
        End Get
 
    End Property
 
 
 
    Public Overrides ReadOnly Property ValueType() As Type
 
        Get
 
            ' Return the type of the value that CalendarCell contains.
 
            Return GetType(DateTime)
 
        End Get
 
    End Property
 
 
 
    Public Overrides ReadOnly Property DefaultNewRowValue() As Object
 
        Get
 
            ' Use the current date and time as the default value.
 
            If Me.isNullable Then
 
                Return Nothing
 
            Else
 
                Return Nothing
 
                Return Format(DateTime.Now, "dd-MMM-yyy")
 
            End If
 
        End Get
 
    End Property
 
 
 
End Class
 
Class CalendarEditingControl
 
    Inherits DateTimePicker
 
    Implements IDataGridViewEditingControl
 
 
 
    Private dataGridViewControl As DataGridView
 
    Private valueIsChanged As Boolean = False
 
    Private rowIndexNum As Integer
 
 
 
 
 
 
 
 
 
    'Public Sub New()
 
    '    Me.Format = DateTimePickerFormat.Short
 
    'End Sub
 
 
 
    Public Property EditingControlFormattedValue() As Object _
 
        Implements IDataGridViewEditingControl.EditingControlFormattedValue
 
 
 
        Get
 
            If Me.ShowCheckBox AndAlso Not Me.Checked Then
 
                Return [String].Empty
 
            Else
 
                If Me.Format = DateTimePickerFormat.[Custom] Then
 
                    Return Me.Value.ToString()
 
                Else
 
                    Return Me.Value.ToShortDateString()
 
                End If
 
            End If
 
        End Get
 
 
 
        Set(ByVal value As Object)
 
            Dim newValue As String = TryCast(value, String)
 
            If Not [String].IsNullOrEmpty(newValue) Then
 
                Me.Value = DateTime.Parse(newValue)
 
            ElseIf Me.ShowCheckBox Then
 
                Me.Checked = False
 
            End If
 
        End Set
 
 
 
 
 
    End Property
 
 
 
    Public Function GetEditingControlFormattedValue(ByVal context _
 
        As DataGridViewDataErrorContexts) As Object _
 
        Implements IDataGridViewEditingControl.GetEditingControlFormattedValue
 
 
 
        Return Me.Value.ToShortDateString()
 
 
 
    End Function
 
    Public Sub ApplyCellStyleToEditingControl(ByVal dataGridViewCellStyle As  _
 
        DataGridViewCellStyle) _
 
        Implements IDataGridViewEditingControl.ApplyCellStyleToEditingControl
 
 
 
        Me.Font = dataGridViewCellStyle.Font
 
        Me.CalendarForeColor = dataGridViewCellStyle.ForeColor
 
        Me.CalendarMonthBackground = dataGridViewCellStyle.BackColor
 
        Me.ShowCheckBox = True '
 
        Me.Checked = False      '
 
 
 
    End Sub
 
    Public Property EditingControlRowIndex() As Integer _
 
        Implements IDataGridViewEditingControl.EditingControlRowIndex
 
 
 
        Get
 
            Return rowIndexNum
 
        End Get
 
        Set(ByVal value As Integer)
 
            rowIndexNum = value
 
        End Set
 
 
 
    End Property
 
 
 
    Public Function EditingControlWantsInputKey(ByVal key As Keys, _
 
        ByVal dataGridViewWantsInputKey As Boolean) As Boolean _
 
        Implements IDataGridViewEditingControl.EditingControlWantsInputKey
 
 
 
        ' Let the DateTimePicker handle the keys listed.
 
        Select Case key And Keys.KeyCode
 
            Case Keys.Left, Keys.Up, Keys.Down, Keys.Right, _
 
                Keys.Home, Keys.End, Keys.PageDown, Keys.PageUp
 
 
 
                Return True
 
 
 
            Case Else
 
                Return False
 
        End Select
 
 
 
    End Function
 
    Public Sub PrepareEditingControlForEdit(ByVal selectAll As Boolean) _
 
        Implements IDataGridViewEditingControl.PrepareEditingControlForEdit
 
 
 
        ' No preparation needs to be done.
 
 
 
    End Sub
 
 
 
    Public ReadOnly Property RepositionEditingControlOnValueChange() _
 
        As Boolean Implements _
 
        IDataGridViewEditingControl.RepositionEditingControlOnValueChange
 
 
 
        Get
 
            Return False
 
        End Get
 
 
 
    End Property
 
    Public Property EditingControlDataGridView() As DataGridView _
 
        Implements IDataGridViewEditingControl.EditingControlDataGridView
 
 
 
        Get
 
            Return dataGridViewControl
 
        End Get
 
        Set(ByVal value As DataGridView)
 
            dataGridViewControl = value
 
        End Set
 
 
 
    End Property
 
    Public Property EditingControlValueChanged() As Boolean _
 
        Implements IDataGridViewEditingControl.EditingControlValueChanged
 
 
 
        Get
 
            Return valueIsChanged
 
        End Get
 
        Set(ByVal value As Boolean)
 
            If valueIsChanged = True And Me.Checked = True Then
 
                valueIsChanged = value
 
            ElseIf valueIsChanged = False And Me.Checked = False Then
 
                valueIsChanged = value
 
            End If
 
 
 
        End Set
 
 
 
    End Property
 
    Public ReadOnly Property EditingControlCursor() As Cursor _
 
        Implements IDataGridViewEditingControl.EditingPanelCursor
 
 
 
        Get
 
            Return MyBase.Cursor
 
        End Get
 
 
 
    End Property
 
    Protected Overrides Sub OnValueChanged(ByVal eventargs As EventArgs)
 
 
 
        ' Notify the DataGridView that the contents of the cell have changed.
 
        If Me.Checked = True Then
 
            valueIsChanged = True
 
        ElseIf Me.Checked = False Then
 
            valueIsChanged = False
 
        End If
 
        Me.EditingControlDataGridView.NotifyCurrentCellDirty(True)
 
        MyBase.OnValueChanged(eventargs)
 
    End Sub
End Class

Answer : Calendar Column in DGV

Some days ago, in same question...

emoreau: I think I have something for you: http://www.emoreau.com/Entries/Articles/2005/01/The-DateTimePicker-control.aspx


You can also use MasKedit Column and validate with your format specific.
Date.ParseExact(value, "dd/mm/yyyy", Nothing)

http://www.eggheadcafe.com/software/aspnet/30579441/datagridview-masked-cell.aspx
http://social.msdn.microsoft.com/Forums/en/winformsdatacontrols/thread/25dff199-0a47-4ef4-9eed-da426728665b
Random Solutions  
 
programming4us programming4us