Самое простое решение - проверить, какой элемент управления на самом деле сфокусирован перед выполнением постобработки - но вы не можете сделать это в обработчике 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
.