Как остановить вывод текстового поля при закрытии формы - PullRequest
5 голосов
/ 26 февраля 2010

с использованием c # winforms vs2008

У меня есть текстовое поле в форме с методом, вызываемым из события textBox1_Leave.Метод берет содержимое рассматриваемого текстового поля и заполняет другие текстовые поля на основе содержимого.Моя проблема в том, что пользователь фокусируется на текстовом поле, затем нажимает кнопку, чтобы закрыть форму (вызывая this.close), затем форма не закрывается, потому что событие выхода из текстового поля запускается.Если текстовое поле не фокусируется на закрытии формы, то форма закрывается нормально.

Если пользователь закрывает форму, щелкнув маленький значок закрытия X в верхнем углу, он закрывается все время безсобытие выхода из текстового поля вызывается.

Как мне дублировать функциональность закрытия X, чтобы я всегда мог закрыть форму без запуска события выхода из текстового поля?

Ответы [ 6 ]

7 голосов
/ 26 февраля 2010

Самое простое решение - проверить, какой элемент управления на самом деле сфокусирован перед выполнением постобработки - но вы не можете сделать это в обработчике Leave, потому что при этом фокус все равно будет на текстовом поле. точка.

Вместо этого вам нужно переместить логику в событие LostFocus, которого нет в конструкторе. Вам придется подключить его во время выполнения:

public class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        textBox1.LostFocus += new EventHandler(textBox1_LostFocus);
    }

    private void textBox1_LostFocus(object sender, EventArgs e)
    {
        if (closeButton.Focused)
            return;
        // Update the other text boxes here
    }
}

Событие LostFocus наступает после , когда новый элемент управления получает фокус.

Разъяснение - вы могли бы обнаружить, что оно работает, помещая эту логику в событие Leave - , если фокус изменяется мышью . Если вместо этого используется клавиатура, вы получите неправильное поведение. LostFocus надежен в в обоих случаях - сфокусированный элемент управления всегда будет «новым» элементом управления. Это задокументировано в MSDN: Порядок событий в Windows Forms .

Кстати, причина, по которой у вас нет этой проблемы с «красным X», заключается в том, что X на самом деле не является элементом управления, который может получать фокус, это часть окна. Когда пользователь щелкает по нему, текстовое поле не теряет фокус и, следовательно, не вызывает событие Leave.

2 голосов
/ 27 февраля 2010

Вы также можете обработать событие FormClosing и убедиться, что аргумент e.Cancel не установлен в значение true при проверке событий в других элементах управления в форме. Я думаю, что они будут уволены до события FormClosing.

    private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {   
            if (e.CloseReason == CloseReason.UserClosing)
            {
                e.Cancel = false;
                return;
            }
        }
2 голосов
/ 26 февраля 2010

Другой подход: Используйте проверяющее событие текстового поля вместо события ухода, затем измените свойство кнопки CausesValidation на false. Вам также нужно будет установить, чтобы текстовое поле не вызывало валидацию в событии нажатия кнопки, поэтому валидационное событие не будет срабатывать при закрытии формы (спасибо @Powerlord за это).

private void button1_Click(object sender, EventArgs e)
{
    this.textBox1.CausesValidation = false;
    this.Close();
}
0 голосов
/ 27 февраля 2016

Записать следующую строку кода в текстовом поле, оставить событие сверху

if me.closing then
return
end if
0 голосов
/ 21 декабря 2014

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

private void GuiltyTextBox_Leave(object sender, EventArgs e) {
  Form formOwningTheTextBox=(Form)((Control)sender).TopLevelControl;
  if (formOwningTheTextBox.Disposing || formOwningTheTextBox.IsDisposed) return;
  .......
}

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

0 голосов
/ 26 февраля 2010

Вы можете проверить, какой элемент управления только что получил фокус.

private void textBox1_Leave(object sender, EventArgs e)
{
    if (btnClose.Focused)
        return;
    // go from here
}
...