我有一个C#WinForms项目,目标是.NET 3.5,带有两个DataGridViews。 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或20,分钟插槽中的0,10,...,50
使用updown按钮可以正常工作。
结果是首先显示上一个时间或日期,并且更新按钮消失控件(timepicker)隐藏或关闭,并且datagridview中的基础单元格具有焦点,并且在编辑模式中与前一个时间或日期。单击单元格内部或外部时,如果输入10,则显示01。
我在同一个表单上创建了一个设计时datetimepicker,它正常工作。
我错过了什么?
答案 0 :(得分:0)
我终于在代码中找到了罪魁祸首:
dgTxSummary.Controls.Add(timePicker);
似乎需要将DateTimePicker添加到表单,而不是 DataGridView 。
将代码更改为this.Controls.Add(timePicker);
并在datePicker.BringToFront();
中使用ShowTimePicker(...)
(以避免控件隐藏在DataGridView后面),一切都很好: - )
FWIW我使用以下代码将DateTimePicker放在相应的单元格之上(代码被剥离了错误处理,空检查等):
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);
}