Устанавливать фокус на 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 шт):

Автор решения: Frehzy

Самое очевидное решение - передавать ссылку на метод (делегат) в конструктор формы. Советую почитать - 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().

→ Ссылка
Автор решения: aepot

Суть такова что в поле происходит ввод данных потом нажимается кнопка ОК либо ТЕСТ. При нажатии ОК всплывает диалоговое окно с кнопками "да" и "нет" при нажатии которых мне нужно что бы в поле 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();
}

Вот и вся магия.

→ Ссылка