У меня есть приложение winforms, которое я разрабатываю с VS2010.Пользовательский интерфейс состоит из tableLayoutPanel, который содержит семь текстовых полей.Я организовал порядок табуляции текстовых полей, чтобы провести пользователя через последовательность ввода логических данных.Каждое текстовое поле имеет событие _Leave, событие _Validating и событие _Validated.Я также добавил событие _KeyDown для формы, чтобы заставить клавишу ввода вести себя подобно клавише Tab.
private void Form1_KeyDown( object sender, KeyEventArgs e )
{
if (e.KeyCode == Keys.Enter)
{
GetNextControl( ActiveControl, true ).Focus();
}
e.Handled = true;
}
Сначала все было хорошо, и все текстовые поля и события вели себя как ожидалось.
Затем я добавил список в форму, для случая использования, в котором пользователь можетвручную введите данные в форму, как и раньше, или выделите строку предварительно заданных данных в списке и нажмите кнопку, чтобы данные были перенесены в текстовые поля.
НО, теперь несколько полей в форме не надеваютне вызывать событие _Validating независимо от используемого метода ввода данных.Событие _Leave для текстового поля инициируется, но когда я выполняю шаг кода, я обнаруживаю, что метод ContainerControl.Validate (), вызываемый в обработчике _Leave, больше не вызывает переход к обработчикам событий _Validating (или _Validated).Тем не менее, другие текстовые поля по-прежнему работают как обычно.Я исследовал рабочие и нерабочие текстовые поля и не вижу различий в свойствах.Я зашел так далеко, что удалил поврежденное текстовое поле, скопировал и реструктурировал рабочее текстовое поле в то же физическое место.Не повезло!
Есть ли какое-то правило, запрещающее смешивать элементы управления в одной форме?Или есть какая-то известная проблема?
Я должен добавить, что я не использую привязку, а преобразовываю и анализирую данные в / из строк в текстовых полях.Эта логика распределена между событиями _Validating и _Validated для каждого текстового поля.
Хорошо, вот еще некоторая информация: я обработал обработчики событий, поместив вывод Trace в начало и конец каждого обработчика.Пока ничего не выскакивает как решение, я нашел несколько интересных вещей.Операторы трассировки в обработчике _KeyDown немного отличались, так как я хотел видеть, когда тест KeyCode был истинным.Вы можете видеть, что этот след будет выводить все в одну строку ...
private void Form1_KeyDown( object sender, KeyEventArgs e )
{
Trace.Write( "%%% _KeyDown entered -- " );
if (e.KeyCode == Keys.Enter)
{
GetNextControl( ActiveControl, true ).Focus();
Trace.Write( "Enter key processing -- " );
}
Trace.WriteLine( " exiting" );
e.Handled = true;
}
Так что же случилось?Это имеет больше смысла, если вы знаете, что сначала пользователь вводит 3-символьное слово, нажимает Enter, затем двухсимвольное слово, затем Enter, затем 4-значное число, а затем Enter.Вот расшифровка с моими примечаниями в скобках:
Первое случайное исключение типа 'System.PlatformNotSupportedException' произошло в System.Core.dll
[Пользователь вводит три символа и нажимаетEnter]
%%% _KeyDown введено - введено
%%% _KeyDown введено - завершено
%%% _KeyDown введено - завершено
%%% _KeyDown введено -- %%% longTkrTB _Выход, введенный
[Вау, что это? Выход начался в середине KeyDown .]
%%% longTkrTB _Выход из вызова _Validating
%%% longTkrTB _Валидация введена
Первое случайное исключение типа «System.PlatformNotSupportedException» произошло в System.Core.dll
Первое случайное исключение типа «System.PlatformNotSupportedException» произошло в System.Core.dll
%%% longTkrTB _Validating exiting
%%% longTkrTB _Валидировано, введено
%%% longTkrTB _Валидировано, завершено
[СЕЙЧАС происходит остальная часть обработки KeyDown .Кто-нибудь знает, являются ли эти события многопоточными?]
Ввести обработку ключа - выход
[ОК, первое текстовое поле было успешно обработано.На втором, 2 знака + Enter.]
%%% _KeyDown введено - выход
%%% _KeyDown введено - выход
%%% _KeyDown введено -%%% shortTkrTB _Вход введен
[Как и раньше, Оставить и процесс проверки прерывает обработку KeyDown ?]
%%% shortTkrTB _ Оставить вызов _Validating
%%% shortTkrTB _Валидация введена
%%% shortTkrTB _Валидация завершена
%%% shortTkrTB _Валидирована введена
%%% shortTkrTB _Валидирована, завершена
Введите обработку ключа - завершена
[Remain KeyDown обработка для второго текстового поля Введите ключ.Второе текстовое поле успешно завершено.Начните 4 цифры в третьем текстовом поле.]
Введено %%% _KeyDown - введено * Введено
%%% _KeyDown - завершено * Введено
%%% _KeyDown - завершено
%%% _KeyDown введено - выход
[Теперь клавиша Enter, и все начинает теряться.]
%%% _KeyDown введено - Тема ''(0x2dc) завершился с кодом 0 (0x0).
Шаг в: переход на метод без символов 'System.Diagnostics.Trace.WriteLine'
[Почему мы не видели это сообщение раньше?]
%%% longVolTB _Вход оставлен
[ОК, ожидается ...]
Шаг в: переход по методу без символов 'System.Windows.Forms.Control.Focused.get '
Шаг в: переход по методу без символов' System.Windows.Forms.Control.Focused.get '
Шаг в: переход по методу без символов' Harpswell.CreatePair.PairRec.IsDummyPair.get '
Шаг в: переход по методу без символов' System.Windows.Forms.Control.Focused.get '
Шаг в: переход по методу без символов 'System.Windows.Forms.Control.CaptureInternal.get'
Шаг в: переход по методу без символов 'System.Windows.Forms.Control.Focused.get'
Шаг в: Метод перехода без символов 'System.Windows.Forms.Control.Focused.get'
Шаг в: метод перехода без символов 'System.Windows.Forms.Control.Focused.get'
Шаг в: шагметод over без символов 'System.Diagnostics.Trace.WriteLine'
[Хорошо!Это большая обработка, которая не произошла с другими текстовыми полями (если только сообщения не были скопированы и только сейчас выпускаются. Если так, почему бы нам не увидеть больше сообщений 'Trace.WriteLine'?)]
%%% longVolTB _ Оставить вызов _Validating
[ЗДЕСЬ, где мы должны ввести логику проверки ...]
Шаг в: метод перехода безсимволы 'System.Windows.Forms.ContainerControl.Validate'
Шаг в: переход по методу без символов 'System.Windows.Forms.ContainerControl.UpdateFocusedControl'
Шаг в: переход по методу без символов 'System.Windows.Forms.ContainerControl.AssignActiveControlInternal '
Шаг в: переход по методу без символов' System.Windows.Forms.ContainerControl.ActivateControlInternal '
Шаг в: переход по методу без символов' System.Windows.Forms.Control.WmSetFocus '
Шаг в: переход на метод без символов 'System.Windows.Forms.Control.WndProc'
Step into: Переход по методу без символов 'System.Windows.Forms.TextBoxBase.WndProc'
Шаг в: переход по методу без символов 'System.Windows.Forms.NativeWindow.DebuggableCallback'
Шаг в: переход по методубез символов 'System.Windows.Forms.Control.FocusInternal'
Шаг в: переход по методу без символов 'System.Diagnostics.Trace.Write'
Ввод обработки ключа - Шаг в: переход по методу без символов 'System.Diagnostics.Trace.WriteLine '
, выход
[Что это?Хвост обработчика KeyDown !]
Шаг в: переход по методу без символов 'System.Windows.Forms.KeyEventArgs.Handled.set'
Шаг в: Метод перехода без символов 'System.Windows.Forms.Control.OnKeyDown'
Шаг в: метод перехода без символов 'System.Windows.Forms.Control.ProcessKeyEventArgs'
шаг в: переход метода без символов'System.Windows.Forms.Form.ProcessKeyPreview'
Шаг в: переход по методу без символов 'System.Windows.Forms.Control.ProcessKeyMessage'
Шаг в: переход по методу без символов 'System.Windows.Forms.Control.WndProc'
Шаг в: переход по методу без символов 'System.Windows.Forms.TextBoxBase.WndProc'
Шаг в: переход по методу без символов 'System.Windows.Forms.NativeWindow.DebuggableCallback'
Шаг в: переход по методу без символов 'System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop'
Поток '' (0x15f0) завершился с кодом 0 (0x0).
Поток '' (0xc20) завершился с кодом 0 (0x0).
Поток '' (0x11b4) завершился с кодом 0 (0x0).
[и т. Д.]