обработчики событий проверки текста в winforms перестали работать - PullRequest
1 голос
/ 14 апреля 2011

У меня есть приложение 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).

[и т. Д.]

Ответы [ 2 ]

0 голосов
/ 15 апреля 2011

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

У меня есть большое количество элементов управления в моей форме, между текстовыми полями, содержащими метки, текстовыми полями ввода данных, кнопками и, конечно, списком и таблицей TableLayoutPanel. Я ошибочно подумал, что те элементы управления, которые содержат статическую информацию, такую ​​как кнопки, легенды и тому подобное, могут быть помечены свойством «CausesValidation = false». Эта ошибка все еще кажется мне разумной.

Как только я изменил каждый элемент управления со свойством «CausesValidation» на «true», моя проблема исчезла. Очевидно, некоторые свойства элемента управления CausesValidation загружались в мои элементы управления вводом данных, хотя я не видел никаких признаков каких-либо проблем в коде формы form1.designer.cs.

0 голосов
/ 14 апреля 2011

Формы имеют последовательности порядка управления, например, для обработки табуляции через поля. Если вы добавили список и метку, чтобы описать альтернативы, это МОЖЕТ испортить то, что вы считаете последовательностью вкладок ... где клавиша табуляции на панели потока таблиц фактически РАБОТАЕТ ... она просто перемещается из текстового поля панели в метка или список.

Я бы проверил порядок табуляции элементов управления, чтобы убедиться в их правильной последовательности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...