2012-06-05 2 views
0

У меня есть проект 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 для разработки в той же форме, и он работает нормально.

Что мне не хватает?

+1

Почтовый индекс для этих методов тоже: timePicker_ValueChanged timePicker_KeyPress timePicker_LostFocus – Faraday

+0

Datagridview лучше всего работает с управлением, реализующим интерфейс IDataGridViewEditingControl и столбцом, инкапсулирующим этот элемент управления. Если вы хотите, у меня есть настраиваемый элемент управления выбора времени (маска, такая как текстовое поле с раскрывающимся списком для combobox), которое я могу опубликовать здесь, если вам интересно. –

+0

Я заинтересован в проверке вашего предложения, поэтому я был бы признателен, если бы вы смогли опубликовать код :-) Мне все еще хотелось бы знать, почему мой код не работает, поэтому любые предложения приветствуются – user1437420

ответ

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); 
} 
Смежные вопросы