2013-11-08 4 views
4

Последний раз, когда я занимался серьезным программированием, было 25 лет назад в C с копией Кернигана и Ричи. Будьте осторожны со стареющим любителем!C# Фокус() появляется, чтобы вызвать метод Leave()

По существу, это старая вещь с возможностью выбора даты. У меня есть решение, прекрасно работающее с одним исключением. Я использую сочетание маскированного TextBox и MonthCalendar. Маскированный TextBox просто отображает любое значение (включая null) из набора данных и принимает значения из календаря. Нажатие назад в календаре очищает скрытый TextBox. Все это очень просто. Все, что мне нужно сделать, это скрыть календарь, когда он теряет фокус. Простой пример демонстрирует проблему:

Создайте форму с текстовым полем, чтобы получить начальный фокус, скрытое текстовое поле и скрытый Календарь событий. В Enter случае маскированной текстовое поле, у меня есть следующий код:

monthCalendar1.Visible = true; 
monthCalendar1.Focus(); 

Мое намерение состояло в том, чтобы поместить следующий код в отпусках случае MonthCalendar:

monthCalendar1.Visible = false; 

По какой-то причине, этот код запускается, как только календарь получает фокус, и календарь немедленно скрывается. Отладка подтверждает, что этот код активирован. Если событие «Оставить» пуст, MonthCalendar действительно получает фокус и сохраняет его, потому что с помощью клавиш со стрелками можно перемещаться по календарю.

Может ли кто-нибудь объяснить это поведение старой магии или, что еще лучше, дать мне указатель на то, что я пытаюсь сделать.

Большое спасибо заранее.

+0

Почему бы просто не использовать элемент управления DateTimePicker? Похоже, это то, что вы пытаетесь имитировать. – LarsTech

+0

Я должен уметь очистить его и вернуть null. Все, что я прочитал о nullable DateTimePickers, только смутило меня. –

ответ

1

Произведение вокруг, чтобы задержать фокус управления MonthCalendar только после Enter события отстреляться:

monthCalendar1.Visible = true; 
this.BeginInvoke(new Action(() => { monthCalendar1.Select(); })); 
+0

Это, конечно же, бизнес - я ничего не жду от вас, ребята, и спасибо, но это кажется странным способом взломать то, что я считал простым орехом. –

1

Цитата:

Не пытайтесь установить фокус внутри Ввод , GotFocus, Leave, LostFocus, Validating или Validated обработчики событий. Это может привести к тому, что ваше приложение или операционная система перестанут отвечать на запросы. Для получения дополнительной информации см. Раздел WM_KILLFOCUS в разделе «Справочная информация по клавиатуре» и раздел «Тревоги сообщений» в разделе «О сообщениях и очередях сообщений» в библиотеке MSDN по адресу http://msdn.microsoft.com/library.

От MSDN. Они также говорят о том, какие события происходят, когда вы попадаете в зависимости от того, как вы попадаете :)

+0

А, я видел это, но предполагал, что это означает различные события одного и того же контроля. Что объясняет его. как минимум. Спасибо за разъяснение. –

+0

Приветствия, если вы думаете, что он отвечает на ваш вопрос, вы можете отметить его как ответ. Вы также можете увидеть, что происходит. Вы также можете найти ответы/ответы, которые вы найдете полезными. Cheers, и продолжайте кодирование :) – Noctis

+0

Уже пробовал проголосовать, но это не позволит мне :( –

Смежные вопросы