Отключение текстового поля с помощью события TextChanged

Форма, которую я использую, требует скопированного URL-адреса. Я пытаюсь создать событие textChanged, которое будет проверять URL-адрес, как только он будет вставлен, сообщая пользователю, является ли он действительным или недействительным. Я также хочу иметь возможность заблокировать текстовое поле, когда это произойдет, с сообщением, говорящим что-то вроде «Обработка ...».

Проблема в приведенном ниже коде: текстовое поле никогда не отключается, программа выполняет метод checkUrl(), а текстовое поле никогда не отключается, даже если оно выполняется первым (я предполагаю, что это так, но тот факт, что есть правильный вызов функции под ним возится с чем-то или получает более высокий приоритет).

Как сделать, чтобы элемент управления был визуально отключен во время выполнения метода?

private void urlTxtBx_TextChanged(object sender, EventArgs e)
{
    urlTxtBx.Enabled = false;

    checkUrl();

    urlTxtBx.Enabled = true;
}

person cheeseman    schedule 24.07.2012    source источник
comment
Вы повторно включаете его сразу после checkUrl();. Сколько времени занимает метод? Если это просто проверка URL-адреса, то я сомневаюсь, что он очень длинный, поэтому отключение текстового поля не имеет большого смысла?   -  person dtsg    schedule 24.07.2012
comment
Вы уверены, что он не отключен? Что, если checkUrl() выполняется слишком быстро, и вы его не видите? Отладьте это, чтобы быть уверенным.   -  person chaliasos    schedule 24.07.2012
comment
Поместите окно сообщения после того, как вы отключите текстовое поле, таким образом вы можете приостановить код и посмотреть, сработало ли оно, если это сработало, вероятно, оно просто выполняется checkUrl() достаточно быстро, чтобы снова включить текстовое поле, прежде чем вы заметите.   -  person Bali C    schedule 24.07.2012
comment
Нет, это не проблема, так как я удалил активную часть, и он все равно будет ждать другого метода. Это не быстрый метод, и он загружает исходный URL-адрес и начинает его перебирать.   -  person cheeseman    schedule 24.07.2012
comment
@cheeseman, что вы ожидаете увидеть после отключения текстового поля? Пожалуйста, перезапустите свой код только с отключением Textbox и проверьте, можете ли вы писать в него.   -  person chaliasos    schedule 24.07.2012
comment
Попробуйте отключить текстовое поле внутри checkUrl(); метод   -  person dtsg    schedule 24.07.2012
comment
@schaliasos Я пробовал это, он отключился (выделен серым цветом) после завершения метода, описанного ниже.   -  person cheeseman    schedule 24.07.2012
comment
Вы также можете снова включить его там после того, как он завершит работу.   -  person dtsg    schedule 24.07.2012
comment
@Duane, он делает то же самое, что и раньше, я думаю, это может быть проблема с тем, как работает форма (обновление визуальных эффектов), похожее на индикатор выполнения. Думаю, мне нужен фоновый рабочий ...   -  person cheeseman    schedule 24.07.2012
comment
@cheeseman, пожалуйста, добавьте это Application.DoEvents(); перед отключением TextBox.   -  person chaliasos    schedule 24.07.2012
comment
Но какую проблему вы пытаетесь решить? Почему вы хотите отключить текстовое поле, когда кто-то что-то печатает или вставляет в него?   -  person CodeCaster    schedule 24.07.2012
comment
@Schaliasos, который решил эту проблему :) Если вы хотите добавить это в качестве ответа, я приму это.   -  person cheeseman    schedule 24.07.2012
comment
@CodeCaster Это событие изменения текста, вставленный URL-адрес проверяется, поэтому пользователь пока больше не будет печатать.   -  person cheeseman    schedule 24.07.2012
comment
Что происходит, когда пользователь вместо этого пытается ввести свой URL-адрес?   -  person dtsg    schedule 24.07.2012
comment
@cheeseman Я не понимаю, как отключение текстового поля поможет в этом. Как только TextChanged запустится, вы сможете проверить содержимое. Что делать, если пользователь хочет ввести что-то после вставленного URL-адреса или что, если он хочет ввести весь URL-адрес?   -  person CodeCaster    schedule 24.07.2012
comment
Существуют определенные инструкции, и событие textchanged срабатывает только для предопределенного набора символов. Этот метод занимает некоторое время, так как он загружает исходный код из сети и начинает его сортировать и автоматически заполнять форму.   -  person cheeseman    schedule 24.07.2012
comment
Каков предопределенный набор символов, который запускает метод изменения текста? Насколько я знаю, он срабатывает, как только символ вводится/вставляется в текстовое поле.   -  person dtsg    schedule 24.07.2012


Ответы (1)


Я думаю, это происходит потому, что приложению необходимо завершить все активные потоки, прежде чем отключать TextBox. Пожалуйста, попробуйте следующий код:

private void urlTxtBx_TextChanged(object sender, EventArgs e)
{
    urlTxtBx.Enabled = false;
    Application.DoEvents();
    checkUrl();
    urlTxtBx.Enabled = true;
}

Это позволит обновить пользовательский интерфейс. Дополнительные сведения см. здесь.

person chaliasos    schedule 24.07.2012
comment
Почти. Вам нужно будет вызвать DoEvents() после отключения текстового поля, потому что затем необходимо обновить пользовательский интерфейс (что делает DoEvents(), позволяя обрабатывать сообщения рисования). - person CodeCaster; 24.07.2012
comment
Это правильно, но у вас есть Application.DoEvents(); линия не в том месте. Его нужно вызывать после отключения текстового поля. - person dtsg; 24.07.2012
comment
Хорошо, я исправлю это. Спасибо. - person chaliasos; 24.07.2012
comment
Это не совсем сработает; ваш вызов DoEvents должен быть после установки .Enabled = false. Кроме того, DoEvents ужасен. - person Dan Puzey; 24.07.2012
comment
@DanPuzey отключение текстового поля в событии изменения также ужасно. - person CodeCaster; 24.07.2012
comment
@CodeCaster не для того, для чего я его использую: P - person cheeseman; 24.07.2012