У меня есть проект C# WinForms, предназначенный для .NET 3.5 с двумя DataGridView. Visual Studio 2010 Pro на Win 7 64 бит.C# ошибка времени проверки DateTimePicker при ручном вводе даты или времени?
Я использую два элемента управления DateTimePicker (один для времени и один для даты), созданный во время выполнения, которые плавают поверх соответствующих ячеек DateTime в gridview. Сборщики отображаются только тогда, когда ячейка времени или даты получает фокус.
Системный формат времени составляет 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();
}
timepicker Проблема возникает только при соблюдении 2 условий:
1) в первый раз число вводится после того, как сборщик получает фокус
2) действительное число, заканчивающееся на 0 *, вводится вручную (клавиатура)
* 0, 10 или 20 в часовом слоте , 0, 10, ..., 50 в минутном интервале
Использование кнопок updown работает нормально.
Результатом является то, что сначала в предыдущий раз, или дата показывается и кнопки Updown исчезают управления (timepicker) либо скрытые или закрыты, а основная ячейка в DataGridView имеет фокус, и находится в режиме редактирования с предыдущее время или дату. При нажатии внутри или снаружи ячейки отображается 01, если введено 10.
Я создал шаблон времени datetimepicker для разработки в той же форме, и он работает нормально.
Что мне не хватает?
Почтовый индекс для этих методов тоже: timePicker_ValueChanged timePicker_KeyPress timePicker_LostFocus – Faraday
Datagridview лучше всего работает с управлением, реализующим интерфейс IDataGridViewEditingControl и столбцом, инкапсулирующим этот элемент управления. Если вы хотите, у меня есть настраиваемый элемент управления выбора времени (маска, такая как текстовое поле с раскрывающимся списком для combobox), которое я могу опубликовать здесь, если вам интересно. –
Я заинтересован в проверке вашего предложения, поэтому я был бы признателен, если бы вы смогли опубликовать код :-) Мне все еще хотелось бы знать, почему мой код не работает, поэтому любые предложения приветствуются – user1437420