我有一个针对 .NET 3.5 的 C# WinForms 项目,带有两个 DataGridView。Win 7 64 位上的 Visual Studio 2010 Pro。
我正在使用在运行时创建的两个 DateTimePicker 控件(一个用于时间,一个用于日期),它们浮动在 gridview 中相应的 DateTime 单元格的顶部。选择器仅在时间或日期单元格获得焦点时显示。
系统时间格式为 24 小时制。
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 is the DataGridView containing the dates and times
dgTxSummary.CurrentCell.Value = timePicker.Value;
}
void timePicker_LostFocus(object sender, EventArgs e)
{
timePicker.Hide();
}
// Used for debugging; shows a message in a text field when 10, 20 etc
// where 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;
}
单击时间单元格时,将显示时间选择器
private void ShowTimePicker(Point cellPos, DateTime dt)
{
timePicker.Location = cellPos;
timePicker.Value = dt;
timePicker.Show();
timePicker.Focus();
}
仅当满足 2 个条件时才会出现此问题:
1) 选择器获得焦点后第一次输入数字
2) 手动输入以 0* 结尾的有效数字(键盘)
*0、10 或 20 在小时槽中,0、10、...、50 在分钟槽中
使用 updown 按钮可以正常工作。
结果是,首先显示上一个时间或日期,并且上下按钮消失,控件(时间选择器)要么隐藏要么关闭,并且 datagridview 中的底层单元格具有焦点并处于与前一个时间或日期的编辑模式。在单元格内部或外部单击时,如果输入 10,则会显示 01。
我在同一个表单上创建了一个设计时 datetimepicker,它工作正常。
我错过了什么?