Устанавливать фокус на TextEdit и ввод с клавиатуры при любых нажатий кнопок из другой формы C#
имеется 3 формы MainForm(), Form1(MainForm()), Form2(),в Form 1 передаётся MainForm через конструктор, мне нужно обновить TextEdit Form1() из Form2(). Я сделал пустой контруктор Form1 который не принимает не какие параметры, нужно постаянно ставить фокус на textEdit, при запуске приложения, при взаимодействии с кнопками из другой формы
В коде выглядит это так: в Form1():
public Form1()
{
InitializeComponent();
Testi();
}
public void Testi()
{
this.searchTextEdit.Text = "";
this.searchTextEdit.Focus();
}
Помогите пожалуйста правильно поставить фокус в TextEdit из Form2() при вызове в Form1(), спасибо.
Form2:
Form2()
{
Form1 test = new Form1;
Action showMethod = test.Testi;
showMethod();
}
Попробовал сделать через делегать Action но проблема в том что фокус всё-равно не ставиться в поле ввода
Ответы (2 шт):
Самое очевидное решение - передавать ссылку на метод (делегат) в конструктор формы. Советую почитать - https://metanit.com/sharp/tutorial/3.13.php.
Так же, как вариант, можно забить на все эти сложности и воспользоваться готовыми делегатами Action или Func. Ссылка - https://metanit.com/sharp/tutorial/3.33.php.
Таким образом, вы передаёте ссылку на метод в качестве параметра в конструктор и вызываете её в нужный момент.
Как по мне, передавать всю форму является не совсем правильным, т.к. это уже отдельный объект, который, как мне кажется, должен быть максимально изолированным от другой формы
UPD:
public void GetSomething(Action action, string YYY) => action.Invoke(YYY);
Данный метод GetSomething принимает в себя void-метод, в качестве параметра к которому нужно передать string.
public int ReturnSomething(Func<string, int> func, string YYY) => func.Invoke(YYY);
Данный метод ReturnSomething принимает в себя метод, который возвращает int и принимает в качестве параметра string.
Таким образом, вам нужно в конструкторе указать Func или Action и передавать их. Вызывать с помощью Invoke().
Суть такова что в поле происходит ввод данных потом нажимается кнопка ОК либо ТЕСТ. При нажатии ОК всплывает диалоговое окно с кнопками "да" и "нет" при нажатии которых мне нужно что бы в поле TextEdit можно было вводить данные с клавиатуры без кликанья туда мышкой
Вам нужно просто вернуть фокус в поле ввода после вызова диалога.
Уберите все костыли из второй формы.
public Form2()
{
InitializeComponent();
}
Вот так, все должно стать чисто.
Теперь в методе вызова второй формы-диалога есть код, который вы не показали, но я его попробую придумать сам.
private void button_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();
if (form2.ShowDialog(this) == DialogResult.OK) // вы же кнопкам этом диалоге назначили DialogResult в дизайнере формы, верно?
// если нет, разберитесь как оно работает, очень полезная штука
{
// ...
}
searchTextEdit.Focus();
}
Вот и вся магия.