CoderNotes - заметки программиста

Публикации  »  C#, C++
Бесплатный хостинг + SSL-сертификат

Зарегистрируйте домен и получите 2 месяца бесплатного хостинга и SSL-сертификат на 1 год в подарок

Подробнее
Skillbox

Управление одной формой из другой

Иногда бывает нужно обратиться к элементам какой-то формы из другой в процессе выполнения программы. Например, есть форма Form1, из нее мы открываем другую Form2 и теперь, работая в форме Form2 нужно обратиться, получить доступ к элементам родительской формы Form1. Я нашел несколько способов как это сделать.

1-й способ. Передача ссылки в public переменную.

Перед открытием формы, передаем ссылку на нужный элемент в переменную public вызываемой формы.

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 frm = new Form2();
            frm.but1 = this.button1; // передаем ссылку на кнопку в форму Form2
            frm.ShowDialog();
        }
    }
}

В форме Form2 переменная, в которую передавали ссылку, будет теперь соответствовать кнопке button1 из формы Form1

namespace WindowsApplication1
{
    public partial class Form2 : Form
    {
        public Button but1; // эта переменная будет содержать ссылку на кнопку button1 из формы Form1

        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            but1.Text = "test"; // меняем текст на кнопке button1 формы Form1
        }
    }
}

2-й способ. Передача ссылки в дочернюю форму.

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

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 frm = new Form2(this.button1); // передаем ссылку на кнопку в форму Form2
            frm.ShowDialog();
        }
    }
}

Теперь в форме Form2 нужно создать переменную, которая будет содержать ссылку на эту кнопку и через нее будем обращаться к кнопке на Form1 (строки 5,7,9 и 15).

namespace WindowsApplication1
{
    public partial class Form2 : Form
    {
        private Button but1; // эта переменная будет содержать ссылку на кнопку button1 из формы Form1

        public Form2(Button but) // получаем ссылку на кнопку в переменную but
        {
            but1 = but; // теперь but1 будет ссылкой на кнопку button1
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            but1.Text = "test"; // меняем текст на кнопке button1 формы Form1
        }
    }
}

3-й способ. Доступ ко всей родительской форме.

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

Шаг 1. В файле Program.cs создаем публичную переменную f1 (строка 5).

namespace WindowsApplication1
{
    static class Program
    {
        public static Form1 f1; // переменная, которая будет содержать ссылку на форму Form1
        
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

Шаг 2. Открываем Form1.Designer.cs и в нем у элементов, к которым нужно будет обратиться из другой формы, меняем private на public. Например, сделаем доступной для изменений кнопку button1 на форме Form1.

public System.Windows.Forms.Button button1; // заменили private на public

Шаг 3. При создании формы Form1 присваиваем переменной f1 ссылку на эту форму (строка 7)

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            Program.f1 = this; // теперь f1 будет ссылкой на форму Form1
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 frm = new Form2();
            frm.ShowDialog();
        }
    }
}

Шаг 4. Теперь из абсолютно любой формы или из любого класса можно обратиться к элементу button1 находящемуся на Form1 так: Program.f1.button1. Например, пусть кнопка в Form2 поменяет текст кнопки на Form1:

namespace WindowsApplication1
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Program.f1.button1.Text = "test"; // Меняем текст на кнопке формы Form1
        }
    }
}

 

Категория: C#, C++

Книги по теме:

Станислава Солнечная

Программирование на С, С++

Посмотреть все книги по программированию

Комментарии к статье:

10.12.18   Гость А как подобное решение выполнить в WPF?
25.02.19   Александ Спасибо дружище!!!
2 дня бился над этой проблемой а решение оказалась на столько простым))
17.04.19   Гость Огромное спасибо, я думала что ничего полезного не зайду и уже хотела бросить эту затею, но благодаря вам все заработало!!!
04.06.19   Гость Спасибо. Примеры из данной статьи реально помогли мне решить свою задачу!
16.10.19   Гость СПАСИБО!!!!
21.11.19   Владимир Спасибо! Мудрил тут с делегатами, дополнительными методами... Автор представил элегантные и простые решения. Спасибо. Молодец!
12.03.20   Гость Почему твое решение не в топе поиска? Я неделями костыли сооружал)
12.04.20   файнштейн не понятная фигня
12.04.20   торчинский Cranky Shine классный рэпер
25.04.20   Гость Спасибо! Очень помогло.
29.04.20   Alex Спасибо! Все гениальное просто.
04.05.20   Гость using System;
using System.Windows.Forms;
namespace MyFirstApp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent ();
}
private void button1_Click(object sender, EventArgs e)
{
double x0=Convert.ToDouble(textBox2.Text);
double xk=Convert.ToDouble(textBox1.Text);
double dx=Convert.ToDouble(textBox3.Text);
double a=Convert.ToDouble(textBox3.Text);
textBox5.Text = "Работу выполнил ст.Иванов М.А." +
Environment.NewLine;
//Цикл для табулирования функции
double x =x0;
while (x <= (xk + dx/2))
{
double y = a * Math.Log(x);
textBox5.Text += "X=" + Convert.ToString(x)+
"; Y=" + Convert.ToString(x)+
Environment.NewLine;
x = x + dx;
}
}
}
}
Пожалуйста помогите как обяснить результат
05.05.20   Гость Как изменить цвет кнопки, находящейся в panel родительской формы, из дочерней формы?
25.05.20   Гость Вы сделали подарок моему курсовому проекту этим решением. Спасибо!
31.05.20   Гость Спасибо. Просто и ясно.
23.04.21   Suetolog Спасибо!
02.07.21   Afro Норм
15.12.21   Гость Супер! То, что нужно! Автору респект!
12.02.22   Гость Спасибо большое!
26.05.22   Ирина Спасибо. Всё супер. Очень логично и понятно.
15.08.23   Гость благодарю

Добавить комментарий:

Комментарии отключены.