powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Проблемы с DateTimePicker
25 сообщений из 25, страница 1 из 1
Проблемы с DateTimePicker
    #32783140
Astakhov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я создаю в RunTime пользовательский интерфейс.
Т.е. на основе некой структуры создаю куча разных контролов в зависимости от типа структуры.
Если юзер что-то изменил в контроле, то при выходе из него, я передаю новое значение внешнему классу с вопросом, а можно ли применить новые данные.
Один из контролов DateTimePicker.
Среди описаний контрола:
Код: plaintext
1.
2.
3.
DateTimePicker AddControl = new DateTimePicker();
//....//
AddControl.Leave += new System.EventHandler(textBox_Leave);
AddControl.ValueChanged += new System.EventHandler(textBox_TextChanged);
В textBox_Leave я как раз и спрашиваю, можно ли применить данные, а в textBox_TextChanged проверяю была ли попытка изменения.
Теперь сама проблема.
Если например с клавиатуры вводить год и ввести только "3", то контрол автоматом преобразует его в "2003".
Проблема если ввести "3" и нажать на "Tab". Сначала отрабатывает Leave, при этом контрол содержит старые данные, и только потом, когда она уже вышла из контрола, отрабатывается ValueChanged уже с новым значением.
Получается, что я спрашиваю разрешение применить старые значения.
Как бороться?
Refresh, Focus, Select на самого себя перед переходом пробовал - балалайка.
...
Рейтинг: 0 / 0
Проблемы с DateTimePicker
    #32783314
Алексей Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А чем тебе не подходит событие
dateTimePicker1_ValueChanged
...
Рейтинг: 0 / 0
Проблемы с DateTimePicker
    #32783361
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DateTimePicker1.Update()

Перед проверкой значения
...
Рейтинг: 0 / 0
Проблемы с DateTimePicker
    #32783761
Astakhov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей Р.А чем тебе не подходит событие
dateTimePicker1_ValueChanged
Дык его и использовал.
Код: plaintext
AddControl.ValueChanged += new System.EventHandler(textBox_TextChanged);

WorobjoffDateTimePicker1.Update()
Перед проверкой значения
И его проверял - кизяк...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
private void dateTimePicker1_Leave(object sender, System.EventArgs e)
{
	dateTimePicker1.Update();
	dateTimePicker1.Refresh();
	richTextBox1.AppendText(dateTimePicker1.Value.ToString() + " - dateTimePicker1_Leave\n");
}

private void dateTimePicker1_Validating(object sender, System.ComponentModel.CancelEventArgs e)
{
	richTextBox1.AppendText(dateTimePicker1.Value.ToString() + " - dateTimePicker1_Validating\n");
}

private void richTextBox1_Enter(object sender, System.EventArgs e)
{
	richTextBox1.AppendText(dateTimePicker1.Value.ToString() + " - richTextBox1_Enter\n");
}

private void dateTimePicker1_ValueChanged(object sender, System.EventArgs e)
{
	richTextBox1.AppendText(dateTimePicker1.Value.ToString() + " - dateTimePicker1_ValueChanged\n");
}
Они так и отрабатывают и вот результат:
16.11.2004 10:18:22 - dateTimePicker1_Leave
16.11.2004 10:18:22 - dateTimePicker1_Validating
16.11.2004 10:18:22 - richTextBox1_Enter
16.11.2009 10:18:18 - dateTimePicker1_ValueChanged
...
Рейтинг: 0 / 0
Проблемы с DateTimePicker
    #32783963
Por
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Por
Гость
А если вопрос "можно ли применить новые данные" задавать в DateTimePicker.ValueChanged и при отрицательном ответе делать DateTimePicker.Select(); ?

типа того:

Код: plaintext
1.
2.
3.
4.
private void dateTimePicker1_ValueChanged(object sender, System.EventArgs e)
{
	if(!IsAcceptable(dateTimePicker1.Value))
		dateTimePicker1.Select();
}
...
Рейтинг: 0 / 0
Проблемы с DateTimePicker
    #32784011
Astakhov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PorА если вопрос "можно ли применить новые данные" задавать в DateTimePicker.ValueChanged и при отрицательном ответе делать DateTimePicker.Select(); ?

Это крайне плохо, бо изменения происходят всякий раз, как юзверь жмакает на клавиши, а точнее когда вводит полный день, месяц или год.
Т.е. например если юзер наберет 12.12.2003, то ValueChanged вызовется трижды, и получится, что я дважды буду спрашивать внешний класс о возможности применения не верной даты. А внешний класс предположим по этим данным будет лазить по удаленной, огромной базе и проверять, да еще и выводить какие-то непотребные данные...
Не кузяво получается.
...
Рейтинг: 0 / 0
Проблемы с DateTimePicker
    #32784098
Por
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Por
Гость
AstakhovЭто крайне плохо, бо изменения происходят всякий раз, как юзверь жмакает на клавиши, а точнее когда вводит полный день, месяц или год.
Т.е. например если юзер наберет 12.12.2003, то ValueChanged вызовется трижды, и получится, что я дважды буду спрашивать внешний класс о возможности применения не верной даты. А внешний класс предположим по этим данным будет лазить по удаленной, огромной базе и проверять, да еще и выводить какие-то непотребные данные...
Не кузяво получается.

А так?

Код: plaintext
1.
2.
3.
4.
private void dateTimePicker1_ValueChanged(object sender, System.EventArgs e)
{
	if(!dateTimePicker1.Focused && !IsAcceptable(dateTimePicker1.Value))
		dateTimePicker1.Select();
}
...
Рейтинг: 0 / 0
Проблемы с DateTimePicker
    #32784183
Astakhov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А так?

Код: plaintext
1.
2.
3.
4.
private void dateTimePicker1_ValueChanged(object sender, System.EventArgs e)
{
	if(!dateTimePicker1.Focused && !IsAcceptable(dateTimePicker1.Value))
		dateTimePicker1.Select();
}
[/quot]
Можно, но тогда возникает другой вопрос, узер может правильно ввести дату и тогда ValueChanged отработает когда Focus именно на том контроле, т.е. я дважды буду спрашивать на предмет применения данных: первый раз при выходе, второй по этому алгоритму. Нет возможности определить что там творит пользователь.
...
Рейтинг: 0 / 0
Проблемы с DateTimePicker
    #32784253
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если все так плохо - может проверять дату на следующем контроле
(GotFocus)?

(всегда использовал MaxDate, MinDate. Но это когда ограничение знаешь заранее...)
...
Рейтинг: 0 / 0
Проблемы с DateTimePicker
    #32784526
Алексей Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тебе не нужно использовать событие Leave.
Не знаю для чего оно нужно, но оно вызывается, то перед ValueChanged, то после него, смотря чем переходить мышкой или табом.

предлагаю следующий вариант.

private bool modifiers;
private bool Проверки()
{
return false;
}
private void dateTimePicker1_ValueChanged(object sender, System.EventArgs e)
{
modifiers = true;
}
private void dateTimePicker1_Validating(object sender, System.ComponentModel.CancelEventArgs e)
{
if (modifiers && !Проверки())
e.Cancel = true;
}
private void dateTimePicker1_Enter(object sender, System.EventArgs e)
{
modifiers = false;
}
Можно еще привлеч клавишу ESC, для восстановления первоначального значения.
...
Рейтинг: 0 / 0
Проблемы с DateTimePicker
    #32784635
Алексей Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Р.Тебе не нужно использовать событие Leave.
Не знаю для чего оно нужно, но оно вызывается, то перед ValueChanged, то после него, смотря чем переходить мышкой или табом.

предлагаю следующий вариант.

private bool modifiers;
private bool Проверки()
{
return false;
}
private void dateTimePicker1_ValueChanged(object sender, System.EventArgs e)
{
modifiers = true;
}
private void dateTimePicker1_Validating(object sender, System.ComponentModel.CancelEventArgs e)
{
if (modifiers && !Проверки())
e.Cancel = true;
}
private void dateTimePicker1_Enter(object sender, System.EventArgs e)
{
modifiers = false;
}
Можно еще привлеч клавишу ESC, для восстановления первоначального значения.

Из-за повторного срабатывания события Enter, нужно переделать

private bool modifiers;
private bool Проверки()
{
return false;
}
private void dateTimePicker1_ValueChanged(object sender, System.EventArgs e)
{
modifiers = true;
}
private void dateTimePicker1_Validating(object sender, System.ComponentModel.CancelEventArgs e)
{
if (modifiers && !Проверки())
e.Cancel = true;
else
modifiers = false;
}
...
Рейтинг: 0 / 0
Проблемы с DateTimePicker
    #32784915
Astakhov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ответ Алексею...
Если посмотришь выше то там код, в котором видно следующее

16.11.2004 10:18:22 - dateTimePicker1_Leave
16.11.2004 10:18:22 - dateTimePicker1_Validating
16.11.2004 10:18:22 - richTextBox1_Enter
16.11.2009 10:18:18 - dateTimePicker1_ValueChanged

Т.е. в Validating еще старое значение, и отработка нового значения происходит после Enter в сторонний контрол.
Получается, что если я буду делать провернку в Validating, то отработаю старое значение или не полностью введенное.
...
Рейтинг: 0 / 0
Проблемы с DateTimePicker
    #32784920
Astakhov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WorobjoffЕсли все так плохо - может проверять дату на следующем контроле
(GotFocus)?

(всегда использовал MaxDate, MinDate. Но это когда ограничение знаешь заранее...)
Заранее не знаю, кроме того предположим у меня есть таблица в которой пару десятков милионов записей, в зависимости от того, какая дата введена будет выводиться список на данную дату.
Соответственно я должен передать конечную дату, для обработки.
...
Рейтинг: 0 / 0
Проблемы с DateTimePicker
    #32785624
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может это на какую-то идею натолкнет.
Была одна программка где состояние БД переводится по главной дате.
По событию Validate предлагался вопрос "Привести таблицы к состоянию на ..."
Пользователи постепенно привыкли после ввода например "2" в год (и вообще, по завершению ввода даты) нажимать Enter.

Только вот Enter в NET почему-то не так себя ведет.
Кстати DateTimePicker содержит правильную дату при Leave во всех случаях кроме одного: когда нажали Tab.

Не хочу предлагать такой неизящный способ как два TextBox, закрытые другим элементом. Использовать их только для обработки значения DTPicker и сразу передавать фокус дальше назад (или обратно) для первого. И дальше вперед (или обратно) для второго. У первого TabIndex на 1 меньше, у второго на 1 больше чем у DTPicker.
...
Рейтинг: 0 / 0
Проблемы с DateTimePicker
    #32786016
Astakhov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WorobjoffТолько вот Enter в NET почему-то не так себя ведет.
Кстати DateTimePicker содержит правильную дату при Leave во всех случаях кроме одного: когда нажали Tab.

Именно так. Но дело не в Tab, а в принудительном переходе фокуса.
Например SelectNextControl(sender as Control, false, true,true,true);
Просто я переписываю программу которая была написана под DOS. Пользователи привыкли к переходу курсора по кнопкам вверх и вниз, клавиатура должна обеспечивать полную функциональность. Самое обидное, что уже столько глюков C# обнаружил в следствии этого, что волосы встают дыбом, как еще люди на нем пишут.

А по поднятой проблеме вот решение нашел.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
private void Control_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
// скипано за ненадобностью
	switch(e.KeyValue)
	{
		case 38: // Up
			e.Handled = true;
			
			if (sender is DateTimePicker)
			{
				DateTimePicker dtp = (DateTimePicker)sender;
				dtp.ShowCheckBox = !dtp.ShowCheckBox;
				dtp.ShowCheckBox = !dtp.ShowCheckBox;
			}

			SelectNextControl(sender as Control, false, true,true,true);
			break;
		case 40: // Down
			e.Handled = true;
			
			if (sender is DateTimePicker)
			{
				DateTimePicker dtp = (DateTimePicker)sender;
				dtp.ShowCheckBox = !dtp.ShowCheckBox;
				dtp.ShowCheckBox = !dtp.ShowCheckBox;
			}

			SelectNextControl(sender as Control, true, true,true,true);
			break;
// скипано за ненадобностью
	}
}
Будте осторожны, если попытаться перенести dtp.ShowCheckBox = !dtp.ShowCheckBox; в область Leave то вы просто не уйдете с данного контрола.

Тяжела и некозиста жизнь простого программиста. :-)
Удачи в бою и побольше всем смекалки и находчивости...
...
Рейтинг: 0 / 0
Проблемы с DateTimePicker
    #32786035
Astakhov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да забыл сказать.
Не рекомендуется использовать
dateTimePicker1.Checked = !dateTimePicker1.Checked;
dateTimePicker1.Checked = !dateTimePicker1.Checked;

Значение возвращается в исходное, т.е. если был 2004 год и жмакнули в 9, но вернется обратно к 2004.

Очень хочется встретить Билли в темном переулке.
...
Рейтинг: 0 / 0
Проблемы с DateTimePicker
    #32786058
Алексей Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй следующий код
Не выпускает из поля пока не введешь корректную дату (в данном случае когда год больше текущего).
Есть один небольшой недостаток, не выпускает по табу если вместо года ввели одну цифру (но на это можно не обращать внимание).

private bool modifiers;
private bool Проверки()
{
richTextBox1.AppendText(dateTimePicker1.Value.ToString() + " - Проверки()\n");
if(dateTimePicker1.Value.Year < DateTime.Today.Year)
{
return false;
dateTimePicker1.Focus();
}
else
return true;

}
private void dateTimePicker1_ValueChanged(object sender, System.EventArgs e)
{
modifiers = true;
dateTimePicker1.CausesValidation = true;
richTextBox1.AppendText(dateTimePicker1.Value.ToString() + " - dateTimePicker1_ValueChanged" + this.ActiveControl.ToString()+" " + dateTimePicker1.Focused.ToString()+"\n");
if(!dateTimePicker1.Focused)
if(!Проверки())
dateTimePicker1.Focus();
}
private void dateTimePicker1_Validating(object sender, System.ComponentModel.CancelEventArgs e)
{
richTextBox1.AppendText(dateTimePicker1.Value.ToString() + " - dateTimePicker1_Validating\n");
if (modifiers && !Проверки())
e.Cancel = true;
else
{
modifiers = false;
dateTimePicker1.CausesValidation = false;
}
}
...
Рейтинг: 0 / 0
Проблемы с DateTimePicker
    #32786204
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AstakhovdateTimePicker1.Checked = !dateTimePicker1.Checked;
dateTimePicker1.Checked = !dateTimePicker1.Checked;
Очень хочется встретить Билли в темном переулке.
Код: plaintext
1.
DateTimePicker1.Enabled = False;
DateTimePicker1.Enabled = True;
То же работает!

новая проблема - переход по Tab - только вперед.
Надо что-то еще придумать (чтобы не проверять Shift)

Кстати о Билли
Посмотрели бы вы как Access-ники маются со своими календариком и масками на TextBox!

Наш DateTimePicker надо победить!
...
Рейтинг: 0 / 0
Проблемы с DateTimePicker
    #32786214
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+
работает в событии Leave
...
Рейтинг: 0 / 0
Проблемы с DateTimePicker
    #32786261
Astakhov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ответ Worobjoff

Ваш код работает ч/з раз, вернее сама проверка.
Если вводить год полностью, а если после ввода полного года, в данном случае было взято далекое будущее 4323 год (Проверки() не отработала) после жмакнул "6" и Tab, вот результат...

17.11.4323 10:49:35 - dateTimePicker1_Leave
17.11.4323 10:49:35 - dateTimePicker1_Validating
17.11.4323 10:49:35 - Проверки()
17.11.4323 10:49:35 - richTextBox1_Enter
17.11.2006 10:49:35 - dateTimePicker1_ValueChanged richTextBox1 False
17.11.2006 10:49:35 - Проверки()
...
Рейтинг: 0 / 0
Проблемы с DateTimePicker
    #32786279
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос:
Astakhovprivate
Код: plaintext
void Control_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
Использовать Form.KeyPreview не будет проще?
...
Рейтинг: 0 / 0
Проблемы с DateTimePicker
    #32786342
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверяю так:
Код: plaintext
1.
2.
3.
DateTimePicker1.Enabled = False;
DateTimePicker1.Enabled = True;
Me.txt1.Text = Me.DateTimePicker1.Text;
Me.txt2.Text = Me.DateTimePicker1.Value.ToString();
- работает.
...
Рейтинг: 0 / 0
Проблемы с DateTimePicker
    #32787095
Astakhov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WorobjoffПроверяю так:
Код: plaintext
1.
2.
3.
DateTimePicker1.Enabled = False;
DateTimePicker1.Enabled = True;
Me.txt1.Text = Me.DateTimePicker1.Text;
Me.txt2.Text = Me.DateTimePicker1.Value.ToString();
- работает.

А ты попробуй жмакнуть Shift + Tab... :-)
На самом деле уже все сделал, использовал таки ShowCheckBox.
Дело в том, что когда меняется Enabled, хитрым образом отрабатывает ActiveControl, а так все происходит в рамках одного контрола.
...
Рейтинг: 0 / 0
Проблемы с DateTimePicker
    #32787227
Алексей Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
УРА !!!

При использовании события LostFocus - все работает

private void dateTimePicker1_LostFocus(object sender, System.EventArgs e)
...
Рейтинг: 0 / 0
Проблемы с DateTimePicker
    #32788220
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще один недостаток DateTimePicker!
если связан с DataTable, не "берет" DBNull!

"DataBinding could not find a row in the list that is suitable for all bindings"

пробовал поставить аналогичный от ComponentOne - все нормально.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Проблемы с DateTimePicker
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]