C# run-time DateTimePicker validation error when manually entering date or time? -
i have c# winforms project targeting .net 3.5 2 datagridviews. visual studio 2010 pro on win 7 64 bit.
i'm using 2 datetimepicker controls (one time , 1 date) created @ run-time floating on top of appropriate datetime cells in gridview. pickers displayed when time or date cell gets focus.
system time format 24 hours.
private datetimepicker timepicker; timepicker = new datetimepicker(); timepicker.format = datetimepickerformat.custom; timepicker.customformat = "hh:mm"; timepicker.maxdate = new datetime(9998, 12, 31); timepicker.mindate = new datetime(1753, 01, 01); timepicker.showupdown = true; timepicker.width = 60; timepicker.hide(); timepicker.valuechanged += new eventhandler(timepicker_valuechanged); timepicker.keypress += new keypresseventhandler(timepicker_keypress); timepicker.lostfocus += new eventhandler(timepicker_lostfocus); dgtxsummary.controls.add(timepicker); void timepicker_valuechanged(object sender, eventargs e) { // dgtxsummary datagridview containing dates , times dgtxsummary.currentcell.value = timepicker.value; } void timepicker_lostfocus(object sender, eventargs e) { timepicker.hide(); } // used debugging; shows message in text field when 10, 20 etc // entered void timepicker_keypress(object sender, keypresseventargs e) { if (char.isdigit(prevchar) && e.keychar == '0') { string correcthour = prevchar.tostring() + '0'; message = "should have been " + correcthour; } prevchar = e.keychar; } when time cell clicked, timepicker displayed
private void showtimepicker(point cellpos, datetime dt) { timepicker.location = cellpos; timepicker.value = dt; timepicker.show(); timepicker.focus(); } the problem occurs when 2 conditions met:
1) first time number entered after picker gets focus
2) valid number ending 0* manually entered (keyboard)
*0, 10 or 20 in hour slot, 0, 10, ... , 50 in minute slot
using updown buttons works fine.
the result at first previous time or date shown , updown buttons disappear control (timepicker) either hidden or closed, , underlying cell in datagridview has focus , in edit mode previous time or date. when clicking inside or outside cell, 01 shown if 10 entered.
i've created design-time datetimepicker on same form, , works normally.
what missing?
i've found culprit in code:
dgtxsummary.controls.add(timepicker); it seems datetimepicker needs added form, not datagridview.
after changing code this.controls.add(timepicker); , using datepicker.bringtofront(); in showtimepicker(...) (to avoid control being hidden behind datagridview), :-)
fwiw use following code place datetimepicker on top of corresponding cell (code stripped of error handling, null checking etc):
private void dgtxsummary_cellmouseclick(object sender, datagridviewcellmouseeventargs e) { rectangle cellrect = dgtxsummary.getcelldisplayrectangle(e.columnindex, e.rowindex, false); point dgpos = dgtxsummary.location; point cellpos = new point(dgpos.x + cellrect.x, dgpos.y + cellrect.y); datetime dt = datetime.parse(row.cells[e.columnindex].formattedvalue.tostring()); showdatepicker(cellpos, dt); }
Comments
Post a Comment