Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Проблемы с DateTimePicker / 25 сообщений из 25, страница 1 из 1
15.11.2004, 21:52
    #32783140
Astakhov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с DateTimePicker
Я создаю в 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
16.11.2004, 06:26
    #32783314
Алексей Р.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с DateTimePicker
А чем тебе не подходит событие
dateTimePicker1_ValueChanged
...
Рейтинг: 0 / 0
16.11.2004, 07:54
    #32783361
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с DateTimePicker
DateTimePicker1.Update()

Перед проверкой значения
...
Рейтинг: 0 / 0
16.11.2004, 11:22
    #32783761
Astakhov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с DateTimePicker
Алексей Р.А чем тебе не подходит событие
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
16.11.2004, 12:26
    #32783963
Por
Por
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с DateTimePicker
А если вопрос "можно ли применить новые данные" задавать в 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
16.11.2004, 12:38
    #32784011
Astakhov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с DateTimePicker
PorА если вопрос "можно ли применить новые данные" задавать в DateTimePicker.ValueChanged и при отрицательном ответе делать DateTimePicker.Select(); ?

Это крайне плохо, бо изменения происходят всякий раз, как юзверь жмакает на клавиши, а точнее когда вводит полный день, месяц или год.
Т.е. например если юзер наберет 12.12.2003, то ValueChanged вызовется трижды, и получится, что я дважды буду спрашивать внешний класс о возможности применения не верной даты. А внешний класс предположим по этим данным будет лазить по удаленной, огромной базе и проверять, да еще и выводить какие-то непотребные данные...
Не кузяво получается.
...
Рейтинг: 0 / 0
16.11.2004, 12:57
    #32784098
Por
Por
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с DateTimePicker
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
16.11.2004, 13:14
    #32784183
Astakhov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с DateTimePicker
А так?

Код: 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
16.11.2004, 13:34
    #32784253
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с DateTimePicker
Если все так плохо - может проверять дату на следующем контроле
(GotFocus)?

(всегда использовал MaxDate, MinDate. Но это когда ограничение знаешь заранее...)
...
Рейтинг: 0 / 0
16.11.2004, 14:47
    #32784526
Алексей Р.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с DateTimePicker
Тебе не нужно использовать событие 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
16.11.2004, 15:16
    #32784635
Алексей Р.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с DateTimePicker
Алексей Р.Тебе не нужно использовать событие 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
16.11.2004, 16:44
    #32784915
Astakhov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с DateTimePicker
Ответ Алексею...
Если посмотришь выше то там код, в котором видно следующее

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
16.11.2004, 16:45
    #32784920
Astakhov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с DateTimePicker
WorobjoffЕсли все так плохо - может проверять дату на следующем контроле
(GotFocus)?

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

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

Не хочу предлагать такой неизящный способ как два TextBox, закрытые другим элементом. Использовать их только для обработки значения DTPicker и сразу передавать фокус дальше назад (или обратно) для первого. И дальше вперед (или обратно) для второго. У первого TabIndex на 1 меньше, у второго на 1 больше чем у DTPicker.
...
Рейтинг: 0 / 0
17.11.2004, 10:55
    #32786016
Astakhov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с DateTimePicker
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
17.11.2004, 11:01
    #32786035
Astakhov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с DateTimePicker
Да забыл сказать.
Не рекомендуется использовать
dateTimePicker1.Checked = !dateTimePicker1.Checked;
dateTimePicker1.Checked = !dateTimePicker1.Checked;

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

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

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
17.11.2004, 11:44
    #32786204
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с DateTimePicker
AstakhovdateTimePicker1.Checked = !dateTimePicker1.Checked;
dateTimePicker1.Checked = !dateTimePicker1.Checked;
Очень хочется встретить Билли в темном переулке.
Код: plaintext
1.
DateTimePicker1.Enabled = False;
DateTimePicker1.Enabled = True;
То же работает!

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

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

Наш DateTimePicker надо победить!
...
Рейтинг: 0 / 0
17.11.2004, 11:46
    #32786214
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с DateTimePicker
+
работает в событии Leave
...
Рейтинг: 0 / 0
17.11.2004, 11:56
    #32786261
Astakhov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с DateTimePicker
Ответ 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
17.11.2004, 11:59
    #32786279
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с DateTimePicker
Вопрос:
Astakhovprivate
Код: plaintext
void Control_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
Использовать Form.KeyPreview не будет проще?
...
Рейтинг: 0 / 0
17.11.2004, 12:13
    #32786342
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с DateTimePicker
Проверяю так:
Код: 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
17.11.2004, 15:28
    #32787095
Astakhov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с DateTimePicker
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
17.11.2004, 15:59
    #32787227
Алексей Р.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с DateTimePicker
УРА !!!

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

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

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

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


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