С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/40: Рейтинг темы: голосов - 40, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 22.01.2015
Сообщений: 26

Изменение текста в одной форме по действию в другой

29.08.2015, 18:21. Показов 8667. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Программа состоит из двух форм : Form1 и Form2.
В первой форме находится richTextBox и menuStrip. Во второй кнопка.
При нажатии на menuStrip открывается форма 2.
При нажатии на кнопку во второй форме должен меняться текст в richTextBox.

Вот код из формы 1.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    public partial class Form1 : Form
    {
        public Form2 f2 = new Form2();
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void toolStripMenuItem1_Click(object sender, EventArgs e)
        {
            f2.Show();
        }
    }
Вот код из формы 2.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    public partial class Form2 : Form
    {
        public Form1 f1 = new Form1();
 
        public Form2()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            f1.richTextBox1.Text = "Текст изменен!";
        }
    }
При компиляции выдает такую ошибку
Необработанное исключение типа "System.StackOverflowException". выделяет вот эту строку "public Form2 f2 = new Form2();"
Как это исправить?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.08.2015, 18:21
Ответы с готовыми решениями:

Добавление текста из TextBox на одной форме в ComboBox на другой форме
Добрый вечер. У меня небольшая проблема. Я сделал кнопку "Настройки" что бы открывался User Form 2, на User Form 2 появляется...

Изменение текста в Label в другой форме
есть форма screen, в нем только несколько Label1-7 код формы простой: Public Class Screen Private Sub Screen_Load(ByVal sender...

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

19
Эксперт .NET
 Аватар для Rius
13050 / 7616 / 1664
Регистрация: 25.05.2015
Сообщений: 23,160
Записей в блоге: 14
29.08.2015, 18:24
Лучший ответ Сообщение было отмечено ISkoropad как решение

Решение

При создании первой формы создаётся вторая форма.
При создании второй формы создаётся первая форма.
При создании первой формы создаётся вторая форма.
При создании второй формы создаётся первая форма.
При создании первой формы создаётся вторая форма.
При создании второй формы создаётся первая форма.
При создании первой формы создаётся вторая форма.
При создании второй формы создаётся первая форма.
При создании первой формы создаётся вторая форма.
При создании второй формы создаётся первая форма.
При создании первой формы создаётся вторая форма.
При создании второй формы создаётся первая форма.
При создании первой формы создаётся вторая форма.
При создании второй формы создаётся первая форма.
...
Стек переполнен!!!

Ссылку на форму 1 надо передать в форму 2, а не создавать её там заново.
1
0 / 0 / 0
Регистрация: 22.01.2015
Сообщений: 26
29.08.2015, 18:29  [ТС]
Буду признателен если напишешь по подробнее.
0
Эксперт .NET
 Аватар для Rius
13050 / 7616 / 1664
Регистрация: 25.05.2015
Сообщений: 23,160
Записей в блоге: 14
29.08.2015, 19:10
Когда функция вызывается из кода, переменные этого кода размещаются в стеке.
У вас получился рекурсивный вызов пару функций (конструкторов форм), бесконечный. Поэтому стек переполнился.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void toolStripMenuItem1_Click(object sender, EventArgs e)
        {
            using (Form2 f2 = new Form2())
            {
                f2.Show();
            }
        }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    public partial class Form2 : Form
    {
        private Form1 f1;
 
        public Form2(Form1 _f1)
        {
            InitializeComponent();
            this.f1 = _f1;
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            this.f1.richTextBox1.Text = "Текст изменен!";
        }
    }
Вообще такой код это плохой тон.
0
0 / 0 / 0
Регистрация: 22.01.2015
Сообщений: 26
29.08.2015, 19:17  [ТС]
я както так написал
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public partial class Form2 : Form
    {
        public Form1 f1;
 
        public Form2()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            f1.richTextBox1.Text = "Текст изменен!";
        }
    }
0
Эксперт .NET
 Аватар для Rius
13050 / 7616 / 1664
Регистрация: 25.05.2015
Сообщений: 23,160
Записей в блоге: 14
29.08.2015, 19:18
Цитата Сообщение от ISkoropad Посмотреть сообщение
я както так написал
И f1 откуда инициализируется?
0
0 / 0 / 0
Регистрация: 22.01.2015
Сообщений: 26
29.08.2015, 19:19  [ТС]
Но теперь ошибка в строчке "f1.richTextBox1.Text = "Текст изменен!";" Необработанное исключение типа "System.NullReferenceException". Понятия не имею что здесь может иметь нулл
0
Эксперт .NET
 Аватар для Rius
13050 / 7616 / 1664
Регистрация: 25.05.2015
Сообщений: 23,160
Записей в блоге: 14
29.08.2015, 19:20
Потому что f1 == null, ссылка не инициализирована.
См. код выше.
Потрудитесь Шилдта "Полный справочний по C#" почитать.
0
0 / 0 / 0
Регистрация: 22.01.2015
Сообщений: 26
29.08.2015, 19:34  [ТС]
К сожалению ваш код не работает. Я понятия не имею как создать ссылку на объект. облазил сайтов 20 и везде пишут чтото типа Form f = new Form. что значит: И f1 откуда инициализируется?
0
Эксперт .NET
 Аватар для Rius
13050 / 7616 / 1664
Регистрация: 25.05.2015
Сообщений: 23,160
Записей в блоге: 14
29.08.2015, 19:36
В первом куске кода заменить надо:
C#
1
2
3
4
using (Form2 f2 = new Form2())
            {
                f2.ShowDialog();
            }
0
0 / 0 / 0
Регистрация: 22.01.2015
Сообщений: 26
29.08.2015, 19:40  [ТС]
А можно без
Цитата Сообщение от Rius Посмотреть сообщение
C#
1
f2.ShowDialog();
обойтись? просто он блокирует использование 1 формы...
0
Эксперт .NET
 Аватар для Rius
13050 / 7616 / 1664
Регистрация: 25.05.2015
Сообщений: 23,160
Записей в блоге: 14
29.08.2015, 19:46
Лучший ответ Сообщение было отмечено ISkoropad как решение

Решение

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    public partial class Form1 : Form
    {
        private Form2 f2;
 
        public Form1()
        {
            InitializeComponent();
            this.f2 = null;
        }
 
        private void toolStripMenuItem1_Click(object sender, EventArgs e)
        {
            if (this.f2 == null)
            {
                this.f2 = new Form2(this);
            }
 
            this.f2.Show();
        }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    public partial class Form2 : Form
    {
        private Form1 f1;
 
        public Form2(Form1 _f1)
        {
            InitializeComponent();
            this.f1 = _f1;
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            this.f1.richTextBox1.Text = "Текст изменен!";
        }
    }
1
0 / 0 / 0
Регистрация: 22.01.2015
Сообщений: 26
29.08.2015, 19:49  [ТС]
Работает. Большое спасибо.
0
 Аватар для Kazbek17
1483 / 938 / 454
Регистрация: 06.02.2012
Сообщений: 2,868
30.08.2015, 10:05
Цитата Сообщение от ISkoropad Посмотреть сообщение
Работает. Большое спасибо.
Или так..
C#
1
2
3
4
5
6
7
8
9
10
11
12
//Форма1 обработки участка кода 
        Form2 fr2 = new Form2();
        private void toolStripMenuItem1_Click(object sender, EventArgs e)
        {
            fr2.Owner = this;
            this.f2.Show();
        }
//Форма2 обработки участка кода
        private void button1_Click(object sender, EventArgs e)
        {
           ((Form1)this.Owner).richTextBox1.Text = "Текст изменен!";
        }
Но в первой форме нужно указать свойство Modifiers=true у richTextBox.
0
135 / 130 / 60
Регистрация: 16.06.2013
Сообщений: 527
30.08.2015, 23:05
Есть ещё прощще и удобней вариант. Если вам известно, что форма1 уже создана, то код такой:
C#
1
Form1 ff = (Form1)Application.OpenForms["Form1"];
Им вы передадите в переменную ссылку на уже созданную форму, выбрав её из списка открытых форм. Если такой формы в открытых нету, то переменная ff будет равна null. Я обычно пишу так, чисто на всякий случай:
C#
1
2
3
            Form1 ff = (Form1)Application.OpenForms["Form1"];
            if (ff == null)
                ff = new Form1();
0
31.08.2015, 04:38

Не по теме:

Как не изворачивайтесь, такое обращение с формами - всё равно говнокод. Так не делается.

0
 Аватар для Kazbek17
1483 / 938 / 454
Регистрация: 06.02.2012
Сообщений: 2,868
31.08.2015, 20:17
Цитата Сообщение от Rius Посмотреть сообщение
Как не изворачивайтесь, такое обращение с формами - всё равно говнокод. Так не делается.
Раз такой умный, покажи не говнокод, в чем дело?
0
Эксперт .NET
 Аватар для Rius
13050 / 7616 / 1664
Регистрация: 25.05.2015
Сообщений: 23,160
Записей в блоге: 14
31.08.2015, 20:18
Kazbek17: Ответы на 7 самых частых вопросов по WinForms
0
 Аватар для Kazbek17
1483 / 938 / 454
Регистрация: 06.02.2012
Сообщений: 2,868
31.08.2015, 20:24
Цитата Сообщение от Rius Посмотреть сообщение
Kazbek17: Ответы на 7 самых частых вопросов по WinForms
С тобой спорить я так понял бесполезно, про то что ты мне указал, я это давно знаю. Тема закрыта!!!
0
31.08.2015, 20:26

Не по теме:

Kazbek17, и не надо спорить, вещи очевидные.
Тему закрыть может только модератор. Правила - 2.3

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.08.2015, 20:26
Помогаю со студенческими работами здесь

Нажав кнопку на одной форме поменять свойство другой кнопки на другой форме
Здравствуйте. Только начал изучать QT и вот возник вопрос практической направленности. Нужно: нажав кнопку на одной форме поменять свойство...

Поле со списком в одной форме преобразовать в переключатель в другой форме
Добрый вечер! Можно ли реализовать в форме 1 есть данные поле со списком , а необходимо в другой форме 2 преобразовать в переключатель....

Одна кнопка на одной форме, активирует другую на другой форме
Нажатием на кнопку активирует другую кнопку на другой форме не совсем понимаю

Использование переменных, объявленных в одной форме, в другой форме
Возможно ли где-нибудь или как-нибудь объявить переменные, которые можно использовать на всех формах? Или как переменные объявленные на...

Вслед за перемещением курсора на одной форме перемещать "второй" курсор на другой форме
Задача такая: вслед за перемещением курсора на одной форме нужно перемещать "второй" курсор на другой форме. Как это можно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru