Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Проблемы с DateTimePicker
|
|||
|---|---|---|---|
|
#18+
Я создаю в RunTime пользовательский интерфейс. Т.е. на основе некой структуры создаю куча разных контролов в зависимости от типа структуры. Если юзер что-то изменил в контроле, то при выходе из него, я передаю новое значение внешнему классу с вопросом, а можно ли применить новые данные. Один из контролов DateTimePicker. Среди описаний контрола: Код: plaintext 1. 2. 3. Теперь сама проблема. Если например с клавиатуры вводить год и ввести только "3", то контрол автоматом преобразует его в "2003". Проблема если ввести "3" и нажать на "Tab". Сначала отрабатывает Leave, при этом контрол содержит старые данные, и только потом, когда она уже вышла из контрола, отрабатывается ValueChanged уже с новым значением. Получается, что я спрашиваю разрешение применить старые значения. Как бороться? Refresh, Focus, Select на самого себя перед переходом пробовал - балалайка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2004, 21:52 |
|
||
|
Проблемы с DateTimePicker
|
|||
|---|---|---|---|
|
#18+
А чем тебе не подходит событие dateTimePicker1_ValueChanged ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2004, 06:26 |
|
||
|
Проблемы с DateTimePicker
|
|||
|---|---|---|---|
|
#18+
DateTimePicker1.Update() Перед проверкой значения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2004, 07:54 |
|
||
|
Проблемы с DateTimePicker
|
|||
|---|---|---|---|
|
#18+
Алексей Р.А чем тебе не подходит событие dateTimePicker1_ValueChanged Дык его и использовал. Код: plaintext WorobjoffDateTimePicker1.Update() Перед проверкой значения И его проверял - кизяк... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2004, 11:22 |
|
||
|
Проблемы с DateTimePicker
|
|||
|---|---|---|---|
|
#18+
А если вопрос "можно ли применить новые данные" задавать в DateTimePicker.ValueChanged и при отрицательном ответе делать DateTimePicker.Select(); ? типа того: Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2004, 12:26 |
|
||
|
Проблемы с DateTimePicker
|
|||
|---|---|---|---|
|
#18+
PorА если вопрос "можно ли применить новые данные" задавать в DateTimePicker.ValueChanged и при отрицательном ответе делать DateTimePicker.Select(); ? Это крайне плохо, бо изменения происходят всякий раз, как юзверь жмакает на клавиши, а точнее когда вводит полный день, месяц или год. Т.е. например если юзер наберет 12.12.2003, то ValueChanged вызовется трижды, и получится, что я дважды буду спрашивать внешний класс о возможности применения не верной даты. А внешний класс предположим по этим данным будет лазить по удаленной, огромной базе и проверять, да еще и выводить какие-то непотребные данные... Не кузяво получается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2004, 12:38 |
|
||
|
Проблемы с DateTimePicker
|
|||
|---|---|---|---|
|
#18+
AstakhovЭто крайне плохо, бо изменения происходят всякий раз, как юзверь жмакает на клавиши, а точнее когда вводит полный день, месяц или год. Т.е. например если юзер наберет 12.12.2003, то ValueChanged вызовется трижды, и получится, что я дважды буду спрашивать внешний класс о возможности применения не верной даты. А внешний класс предположим по этим данным будет лазить по удаленной, огромной базе и проверять, да еще и выводить какие-то непотребные данные... Не кузяво получается. А так? Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2004, 12:57 |
|
||
|
Проблемы с DateTimePicker
|
|||
|---|---|---|---|
|
#18+
А так? Код: plaintext 1. 2. 3. 4. Можно, но тогда возникает другой вопрос, узер может правильно ввести дату и тогда ValueChanged отработает когда Focus именно на том контроле, т.е. я дважды буду спрашивать на предмет применения данных: первый раз при выходе, второй по этому алгоритму. Нет возможности определить что там творит пользователь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2004, 13:14 |
|
||
|
Проблемы с DateTimePicker
|
|||
|---|---|---|---|
|
#18+
Если все так плохо - может проверять дату на следующем контроле (GotFocus)? (всегда использовал MaxDate, MinDate. Но это когда ограничение знаешь заранее...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2004, 13:34 |
|
||
|
Проблемы с DateTimePicker
|
|||
|---|---|---|---|
|
#18+
Тебе не нужно использовать событие 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, для восстановления первоначального значения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2004, 14:47 |
|
||
|
Проблемы с DateTimePicker
|
|||
|---|---|---|---|
|
#18+
Алексей Р.Тебе не нужно использовать событие 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; } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2004, 15:16 |
|
||
|
Проблемы с DateTimePicker
|
|||
|---|---|---|---|
|
#18+
Ответ Алексею... Если посмотришь выше то там код, в котором видно следующее 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, то отработаю старое значение или не полностью введенное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2004, 16:44 |
|
||
|
Проблемы с DateTimePicker
|
|||
|---|---|---|---|
|
#18+
WorobjoffЕсли все так плохо - может проверять дату на следующем контроле (GotFocus)? (всегда использовал MaxDate, MinDate. Но это когда ограничение знаешь заранее...) Заранее не знаю, кроме того предположим у меня есть таблица в которой пару десятков милионов записей, в зависимости от того, какая дата введена будет выводиться список на данную дату. Соответственно я должен передать конечную дату, для обработки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2004, 16:45 |
|
||
|
Проблемы с DateTimePicker
|
|||
|---|---|---|---|
|
#18+
Может это на какую-то идею натолкнет. Была одна программка где состояние БД переводится по главной дате. По событию Validate предлагался вопрос "Привести таблицы к состоянию на ..." Пользователи постепенно привыкли после ввода например "2" в год (и вообще, по завершению ввода даты) нажимать Enter. Только вот Enter в NET почему-то не так себя ведет. Кстати DateTimePicker содержит правильную дату при Leave во всех случаях кроме одного: когда нажали Tab. Не хочу предлагать такой неизящный способ как два TextBox, закрытые другим элементом. Использовать их только для обработки значения DTPicker и сразу передавать фокус дальше назад (или обратно) для первого. И дальше вперед (или обратно) для второго. У первого TabIndex на 1 меньше, у второго на 1 больше чем у DTPicker. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2004, 08:51 |
|
||
|
Проблемы с DateTimePicker
|
|||
|---|---|---|---|
|
#18+
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. Тяжела и некозиста жизнь простого программиста. :-) Удачи в бою и побольше всем смекалки и находчивости... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2004, 10:55 |
|
||
|
Проблемы с DateTimePicker
|
|||
|---|---|---|---|
|
#18+
Да забыл сказать. Не рекомендуется использовать dateTimePicker1.Checked = !dateTimePicker1.Checked; dateTimePicker1.Checked = !dateTimePicker1.Checked; Значение возвращается в исходное, т.е. если был 2004 год и жмакнули в 9, но вернется обратно к 2004. Очень хочется встретить Билли в темном переулке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2004, 11:01 |
|
||
|
Проблемы с DateTimePicker
|
|||
|---|---|---|---|
|
#18+
Попробуй следующий код Не выпускает из поля пока не введешь корректную дату (в данном случае когда год больше текущего). Есть один небольшой недостаток, не выпускает по табу если вместо года ввели одну цифру (но на это можно не обращать внимание). 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; } } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2004, 11:05 |
|
||
|
Проблемы с DateTimePicker
|
|||
|---|---|---|---|
|
#18+
AstakhovdateTimePicker1.Checked = !dateTimePicker1.Checked; dateTimePicker1.Checked = !dateTimePicker1.Checked; Очень хочется встретить Билли в темном переулке. Код: plaintext 1. новая проблема - переход по Tab - только вперед. Надо что-то еще придумать (чтобы не проверять Shift) Кстати о Билли Посмотрели бы вы как Access-ники маются со своими календариком и масками на TextBox! Наш DateTimePicker надо победить! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2004, 11:44 |
|
||
|
Проблемы с DateTimePicker
|
|||
|---|---|---|---|
|
#18+
+ работает в событии Leave ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2004, 11:46 |
|
||
|
Проблемы с DateTimePicker
|
|||
|---|---|---|---|
|
#18+
Ответ 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 - Проверки() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2004, 11:56 |
|
||
|
Проблемы с DateTimePicker
|
|||
|---|---|---|---|
|
#18+
Вопрос: Astakhovprivate Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2004, 11:59 |
|
||
|
Проблемы с DateTimePicker
|
|||
|---|---|---|---|
|
#18+
Проверяю так: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2004, 12:13 |
|
||
|
Проблемы с DateTimePicker
|
|||
|---|---|---|---|
|
#18+
WorobjoffПроверяю так: Код: plaintext 1. 2. 3. А ты попробуй жмакнуть Shift + Tab... :-) На самом деле уже все сделал, использовал таки ShowCheckBox. Дело в том, что когда меняется Enabled, хитрым образом отрабатывает ActiveControl, а так все происходит в рамках одного контрола. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2004, 15:28 |
|
||
|
Проблемы с DateTimePicker
|
|||
|---|---|---|---|
|
#18+
УРА !!! При использовании события LostFocus - все работает private void dateTimePicker1_LostFocus(object sender, System.EventArgs e) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2004, 15:59 |
|
||
|
Проблемы с DateTimePicker
|
|||
|---|---|---|---|
|
#18+
Еще один недостаток DateTimePicker! если связан с DataTable, не "берет" DBNull! "DataBinding could not find a row in the list that is suitable for all bindings" пробовал поставить аналогичный от ComponentOne - все нормально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2004, 08:28 |
|
||
|
|

start [/forum/topic.php?fid=20&msg=32784920&tid=1437870]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
104ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
81ms |
get tp. blocked users: |
1ms |
| others: | 259ms |
| total: | 493ms |

| 0 / 0 |
