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

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

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

Author24 — интернет-сервис помощи студентам
Программа состоит из двух форм : 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.08.2015, 18:21
Ответы с готовыми решениями:

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

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

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

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

19
Эксперт .NET
10574 / 6498 / 1506
Регистрация: 25.05.2015
Сообщений: 19,686
Записей в блоге: 14
29.08.2015, 18:24 2
Лучший ответ Сообщение было отмечено ISkoropad как решение

Решение

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

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

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  [ТС] 5
я както так написал
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
10574 / 6498 / 1506
Регистрация: 25.05.2015
Сообщений: 19,686
Записей в блоге: 14
29.08.2015, 19:18 6
Цитата Сообщение от ISkoropad Посмотреть сообщение
я както так написал
И f1 откуда инициализируется?
0
0 / 0 / 0
Регистрация: 22.01.2015
Сообщений: 26
29.08.2015, 19:19  [ТС] 7
Но теперь ошибка в строчке "f1.richTextBox1.Text = "Текст изменен!";" Необработанное исключение типа "System.NullReferenceException". Понятия не имею что здесь может иметь нулл
0
Эксперт .NET
10574 / 6498 / 1506
Регистрация: 25.05.2015
Сообщений: 19,686
Записей в блоге: 14
29.08.2015, 19:20 8
Потому что f1 == null, ссылка не инициализирована.
См. код выше.
Потрудитесь Шилдта "Полный справочний по C#" почитать.
0
0 / 0 / 0
Регистрация: 22.01.2015
Сообщений: 26
29.08.2015, 19:34  [ТС] 9
К сожалению ваш код не работает. Я понятия не имею как создать ссылку на объект. облазил сайтов 20 и везде пишут чтото типа Form f = new Form. что значит: И f1 откуда инициализируется?
0
Эксперт .NET
10574 / 6498 / 1506
Регистрация: 25.05.2015
Сообщений: 19,686
Записей в блоге: 14
29.08.2015, 19:36 10
В первом куске кода заменить надо:
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  [ТС] 11
А можно без
Цитата Сообщение от Rius Посмотреть сообщение
C#
1
f2.ShowDialog();
обойтись? просто он блокирует использование 1 формы...
0
Эксперт .NET
10574 / 6498 / 1506
Регистрация: 25.05.2015
Сообщений: 19,686
Записей в блоге: 14
29.08.2015, 19:46 12
Лучший ответ Сообщение было отмечено 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  [ТС] 13
Работает. Большое спасибо.
0
1471 / 928 / 452
Регистрация: 06.02.2012
Сообщений: 2,847
30.08.2015, 10:05 14
Цитата Сообщение от 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
134 / 129 / 59
Регистрация: 16.06.2013
Сообщений: 523
30.08.2015, 23:05 15
Есть ещё прощще и удобней вариант. Если вам известно, что форма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
Rius
31.08.2015, 04:38
  #16

Не по теме:

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

0
1471 / 928 / 452
Регистрация: 06.02.2012
Сообщений: 2,847
31.08.2015, 20:17 17
Цитата Сообщение от Rius Посмотреть сообщение
Как не изворачивайтесь, такое обращение с формами - всё равно говнокод. Так не делается.
Раз такой умный, покажи не говнокод, в чем дело?
0
Эксперт .NET
10574 / 6498 / 1506
Регистрация: 25.05.2015
Сообщений: 19,686
Записей в блоге: 14
31.08.2015, 20:18 18
Kazbek17: Ответы на 7 самых частых вопросов по WinForms
0
1471 / 928 / 452
Регистрация: 06.02.2012
Сообщений: 2,847
31.08.2015, 20:24 19
Цитата Сообщение от Rius Посмотреть сообщение
Kazbek17: Ответы на 7 самых частых вопросов по WinForms
С тобой спорить я так понял бесполезно, про то что ты мне указал, я это давно знаю. Тема закрыта!!!
0
Rius
31.08.2015, 20:26     Изменение текста в одной форме по действию в другой
  #20

Не по теме:

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

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.08.2015, 20:26

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

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

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

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

Изменение Listbox на другой форме
Здравствуйте, возникла такая проблема есть две формы Client_cl и форма Skills которая вызывается из...

Изменение данных в другой форме
Есть 3 формы. Нужно по нажатию на кнопку из Form2 удалить все данные базы данных в Form3. Вызываю...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru