Как остановиться, текстовое поле оставляют событие, стреляющее в форму близко

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

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

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

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

5
задан Benjamin 6 November 2013 в 12:06
поделиться

4 ответа

Простейшим решением будет проверить, какой элемент управления действительно сфокусирован, прежде чем выполнять постобработку, но вы не можете сделать это в Оставьте обработчик , потому что в этот момент фокус все еще будет находиться в текстовом поле.

Вместо этого вам нужно переместить логику в событие 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 .

7
ответ дан 13 December 2019 в 19:25
поделиться

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

private void textBox1_Leave(object sender, EventArgs e)
{
    if (btnClose.Focused)
        return;
    // go from here
}
0
ответ дан 13 December 2019 в 19:25
поделиться

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

private void button1_Click(object sender, EventArgs e)
{
    this.textBox1.CausesValidation = false;
    this.Close();
}
2
ответ дан 13 December 2019 в 19:25
поделиться

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

    private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {   
            if (e.CloseReason == CloseReason.UserClosing)
            {
                e.Cancel = false;
                return;
            }
        }
2
ответ дан 13 December 2019 в 19:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: