Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
68 / 41 / 14
Регистрация: 24.02.2013
Сообщений: 250

Два раза открывается MessageBox.Show после второго вызова MessageBox

07.01.2014, 00:51. Показов 5415. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Подскажите пожалуйста...
Мне вот надо было сделать диалоговое окно для ввода данных для бегущей строки.
Кроме этого, надо было, чтобы программа не давала вводить пустую строку и не давала вводить стандартное сообщение, которое пропадает при клике на TextBox("Кликните для ввода").
Всё работает хорошо, программа выполняет свою роль, но есть одна проблема:
Когда я вызываю второй и более раз, диалоговые сообщения отображаются более 1 раза(для примера, при 3-м вызове, 3 раза отображаются диалоги).
Вот код:
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace ConsoleApplication
{
    public partial class Form1 : Form
    {
        public Timer  _time                 = new Timer();
        public Button btn_1                 = new Button();
        public Button btn_2                 = new Button();
        public Label  _left_text            = new Label();
        public Button _ok                   = new Button();
        public Button _cancel               = new Button();
        public Button _random_callor        = new Button();
        public Form _input_box              = new Form();
        public TextBox _input_new_left_text = new TextBox();
        void _on_click_btn_1(Object Senter, EventArgs e)
        {
            MessageBox.Show("Был вызван MessageBox из события при нажатии нa btn_1.click()", "ShowMessageBox");
            _time.Enabled        = true;
            _left_text.Enabled   = true;
            _time.Start();
        }
        void _is_time_now(Object Senter, EventArgs e)
        {
            _left_text.Visible    = true;
            if (_left_text.Left   + _left_text.Width < 0) _left_text.Left = this.Width;
            else _left_text.Left -= 1;
        }
        void _inputbox_click_ok(Object Senter, EventArgs e)
        {
            if ((String.Compare("Кликните для ввода текста", _input_new_left_text.Text) != 0) && (String.IsNullOrWhiteSpace(_input_new_left_text.Text)!=true))
            {
                _left_text.Text = _input_new_left_text.Text;
                MessageBox.Show("Изменения будут видны лишь тогда, когда будет включен таймер показа текста", "Внимание");
                MessageBox.Show("Для его включения, нажмите на главную кнопку на форме, которая вызывает MessageBox", "Как увидеть результат");
            }
            else MessageBox.Show("Отсутствует текст!", "Ошибка занесения!");
            _input_box.Hide();
        }
        void _inputbox_click_cancel(Object Senter, EventArgs e)
        {
            _input_box.Hide();
        }
        void clear_input_new_left_text(Object Senter, EventArgs e)
        {
            _input_new_left_text.Clear();
        }
        void _get_random_form_color(Object Senter, EventArgs e)
        {
            Random c = new Random();
            this.BackColor = Color.FromArgb(c.Next(1, 255), c.Next(1, 255), c.Next(1, 255));
        }
        void _on_click_btn_2(Object Senter, EventArgs e)
        {
            _input_box = new Form();
            _input_box.Controls.Add(_ok);
            _input_box.Controls.Add(_cancel);
            _input_box.BackColor          = this.BackColor;
            _input_box.Width              = 400;
            _input_box.Height             = 200;
            _input_box.StartPosition = FormStartPosition.CenterScreen;
            _input_box.Enabled            = true;
            _input_box.Visible            = true;
            _input_box.FormBorderStyle    = System.Windows.Forms.FormBorderStyle.None;
            _input_box.Text               = "Изменение содержания бегущей строки";
            _ok.Visible                   = true;
            _cancel.Visible               = true;
            _ok.Enabled                   = true;
            _cancel.Enabled               = true;
            _ok.Text                      = "Завершить ввод";
            _cancel.Text                  = "Отменить изменения";
            _ok.AutoSize                  = true;
            _ok.Height                    = 25;
            _cancel.AutoSize              = true;
            _cancel.Height                = 25;
            _ok.Left                      = 5;
            _cancel.Left                  = _input_box.ClientSize.Width - _cancel.Width - 5;
            _ok.Top                       = _input_box.ClientSize.Height - _ok.Height - 5;
            _cancel.Top                   = _input_box.ClientSize.Height - _cancel.Height - 5;
            _ok.Click                    += new EventHandler(_inputbox_click_ok);
            _cancel.Click                += new EventHandler(_inputbox_click_cancel);
            _ok.Controls.Add(_input_new_left_text);
            _ok.ForeColor                 = SystemColors.Window;
            _cancel.ForeColor             = SystemColors.Window;
            _input_new_left_text.Enabled  = true;
            _input_new_left_text.Visible  = true;
            _input_new_left_text.Text     = "Кликните для ввода текста";
            _input_new_left_text.Width    = _input_box.ClientSize.Width;
            _input_new_left_text.Height   = 25;
            _input_new_left_text.Left     = 0;
            _input_new_left_text.Top      = (_input_box.ClientSize.Height / 2) - (_input_new_left_text.Height / 2);
            _input_box.Controls.Add(_input_new_left_text);
            _input_new_left_text.Click   += new EventHandler(clear_input_new_left_text);
        }
        public Form1()
        {
            InitializeComponent();
            this.Width                = 800;
            this.Height               = 400;
            this.BackColor            = System.Drawing.SystemColors.WindowText;
            this.StartPosition        = FormStartPosition.CenterScreen;
            this.Controls.Add(btn_1);
            btn_1.Enabled             = true;
            btn_1.Width               = this.ClientSize.Width  - 14;
            btn_1.Height              = this.ClientSize.Height / 14;
            btn_1.Left                = (this.ClientSize.Width / 2)  - (btn_1.Width / 2);
            btn_1.Top                 = (this.ClientSize.Height / 2) - (btn_1.Height / 2);
            btn_1.Text                = "Нажмите для вызова диалога окна";
            btn_1.ForeColor           = SystemColors.Window;
            btn_1.Click              += new EventHandler (this._on_click_btn_1);
            _time.Enabled             = false;
            _time.Interval            = 1;
            _time.Tick               += new EventHandler(this._is_time_now);
            this.Controls.Add(_left_text);
            _left_text.Visible        = false;
            _left_text.Enabled        = false;
            _left_text.Text           = "Тестовый текст бегущей строки";
            _left_text.ForeColor      = SystemColors.Window;
            _left_text.AutoSize       = true;
            _left_text.Left           = this.Width; ;
            _left_text.Top            = this.ClientSize.Height - _left_text.Height - 5;
            this.Controls.Add(btn_2);
            btn_2.Enabled             = true;
            btn_2.Visible             = true;
            btn_2.Text                = "Изменить бегущую строку";
            btn_2.ForeColor           = SystemColors.Window;
            btn_2.AutoSize            = true;
            btn_2.Top                 = btn_1.Top - btn_2.Height - 5;
            btn_2.Left                = (this.ClientSize.Width / 2) - (btn_2.Width / 2);
            btn_2.Click              += new EventHandler(this._on_click_btn_2);
            this.Controls.Add(_random_callor);
            _random_callor.Enabled   = true;
            _random_callor.Visible   = true;
            _random_callor.Text      = "Сгенерировать случайный цвет для формы";
            _random_callor.AutoSize  = true;
            _random_callor.Height    = 25;
            _random_callor.Top       = 0;
            _random_callor.Left      = (this.ClientSize.Width / 2) - (_random_callor.Width / 2);
            _random_callor.ForeColor = SystemColors.Window;
            _random_callor.Click    += new EventHandler(_get_random_form_color);
        }
    }
}

Как видно по коду-я не закрываю форму _input_box, а просто скрываю её(делаю её невидимой). Однако, если без скрытия формы(без _input_box.hide()), всё работает нормально.
Подскажите пожалуйста, в чём может быть проблема?

Добавлено через 2 минуты
Событие(функция, метод) _inputbox_click_ok и _inputbox_click_cancel
Первый метод - при нажатии на ОК
Второй метод - при нажатии на отмену

Добавлено через 13 минут
По ходу-нашёл решение...
Решение, которое я нашёл заключается в том, чтобы инициализировать компонент _input_box не при нажатии на кнопку его отображения и создания(как ранее планировалось), а в главной функции(т.е. построить вместе со всеми другими компонентами)...
И по умолчанию, поставить _input_box.hide().
Вот код:
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace _Visual_C_Sharp__Основы
{
    public partial class Form1 : Form
    {
        public Timer  _time                 = new Timer();
        public Button btn_1                 = new Button();
        public Button btn_2                 = new Button();
        public Label  _left_text            = new Label();
        public Button _ok                   = new Button();
        public Button _cancel               = new Button();
        public Button _random_callor        = new Button();
        public Form _input_box              = new Form();
        public TextBox _input_new_left_text = new TextBox();
        void _on_click_btn_1(Object Senter, EventArgs e)
        {
            MessageBox.Show("Был вызван MessageBox из события при нажатии нa btn_1.click()", "ShowMessageBox");
            _time.Enabled        = true;
            _left_text.Enabled   = true;
            _time.Start();
        }
        void _is_time_now(Object Senter, EventArgs e)
        {
            _left_text.Visible    = true;
            if (_left_text.Left   + _left_text.Width < 0) _left_text.Left = this.Width;
            else _left_text.Left -= 1;
        }
        void _inputbox_click_ok(Object Senter, EventArgs e)
        {
            if ((String.Compare("Кликните для ввода текста", _input_new_left_text.Text) != 0) && (String.IsNullOrWhiteSpace(_input_new_left_text.Text)!=true))
            {
                _left_text.Text = _input_new_left_text.Text;
                MessageBox.Show("Изменения будут видны лишь тогда, когда будет включен таймер показа текста", "Внимание");
                MessageBox.Show("Для его включения, нажмите на главную кнопку на форме, которая вызывает MessageBox", "Как увидеть результат");
            }
            else MessageBox.Show("Отсутствует текст!", "Ошибка занесения!");
            _input_box.Hide();
        }
        void _inputbox_click_cancel(Object Senter, EventArgs e)
        {
            _input_box.Hide();
        }
        void clear_input_new_left_text(Object Senter, EventArgs e)
        {
            _input_new_left_text.Clear();
        }
        void _get_random_form_color(Object Senter, EventArgs e)
        {
            Random c = new Random();
            this.BackColor = Color.FromArgb(c.Next(1, 255), c.Next(1, 255), c.Next(1, 255));
        }
        void _on_click_btn_2(Object Senter, EventArgs e)
        {
            _input_box.Show();
        }
        public Form1()
        {
            InitializeComponent();
            this.Width                   = 800;
            this.Height                  = 400;
            this.Text                    = "Visual C# - Основы работы с визуальным C#";
            this.BackColor               = System.Drawing.SystemColors.WindowText;
            this.StartPosition           = FormStartPosition.CenterScreen;
            this.Controls.Add(btn_1);
            btn_1.Enabled                = true;
            btn_1.Width                  = this.ClientSize.Width  - 14;
            btn_1.Height                 = this.ClientSize.Height / 14;
            btn_1.Left                   = (this.ClientSize.Width / 2)  - (btn_1.Width / 2);
            btn_1.Top                    = (this.ClientSize.Height / 2) - (btn_1.Height / 2);
            btn_1.Text                   = "Нажмите для вызова диалога окна";
            btn_1.ForeColor              = SystemColors.Window;
            btn_1.Click                 += new EventHandler (this._on_click_btn_1);
            _time.Enabled                = false;
            _time.Interval               = 1;
            _time.Tick                  += new EventHandler(this._is_time_now);
            this.Controls.Add(_left_text);
            _left_text.Visible           = false;
            _left_text.Enabled           = false;
            _left_text.Text              = "Тестовый текст бегущей строки";
            _left_text.ForeColor         = SystemColors.Window;
            _left_text.AutoSize          = true;
            _left_text.Left              = this.Width; ;
            _left_text.Top               = this.ClientSize.Height - _left_text.Height - 5;
            this.Controls.Add(btn_2);
            btn_2.Enabled                = true;
            btn_2.Visible                = true;
            btn_2.Text                   = "Изменить бегующую строку";
            btn_2.ForeColor              = SystemColors.Window;
            btn_2.AutoSize               = true;
            btn_2.Top                    = btn_1.Top - btn_2.Height - 5;
            btn_2.Left                   = (this.ClientSize.Width / 2) - (btn_2.Width / 2);
            btn_2.Click                 += new EventHandler(this._on_click_btn_2);
            this.Controls.Add(_random_callor);
            _random_callor.Enabled       = true;
            _random_callor.Visible       = true;
            _random_callor.Text          = "Сгенерировать случайный цвет для формы";
            _random_callor.AutoSize      = true;
            _random_callor.Height        = 25;
            _random_callor.Top           = 0;
            _random_callor.Left          = (this.ClientSize.Width / 2) - (_random_callor.Width / 2);
            _random_callor.ForeColor     = SystemColors.Window;
            _random_callor.Click        += new EventHandler(_get_random_form_color);
            _input_box.Controls.Add(_cancel);
            _input_box.BackColor         = this.BackColor;
            _input_box.Width             = 400;
            _input_box.Height            = 200;
            _input_box.StartPosition     = FormStartPosition.CenterScreen;
            _input_box.Enabled           = true;
            _input_box.Visible           = true;
            _input_box.FormBorderStyle   = System.Windows.Forms.FormBorderStyle.None;
            _input_box.Text              = "Изменение содержания бегущей строки";
            _input_box.Controls.Add(_ok);
            _ok.Visible                  = true;
            _cancel.Visible              = true;
            _ok.Enabled                  = true;
            _cancel.Enabled              = true;
            _ok.Text                     = "Завершить ввод";
            _cancel.Text                 = "Отменить изменения";
            _ok.AutoSize                 = true;
            _ok.Height                   = 25;
            _cancel.AutoSize             = true;
            _cancel.Height               = 25;
            _ok.Left                     = 5;
            _cancel.Left                 = _input_box.ClientSize.Width - _cancel.Width - 5;
            _ok.Top                      = _input_box.ClientSize.Height - _ok.Height - 5;
            _cancel.Top                  = _input_box.ClientSize.Height - _cancel.Height - 5;
            _ok.Click                   += new EventHandler(_inputbox_click_ok);
            _cancel.Click               += new EventHandler(_inputbox_click_cancel);
            _ok.Controls.Add(_input_new_left_text);
            _ok.ForeColor                = SystemColors.Window;
            _cancel.ForeColor            = SystemColors.Window;
            _input_new_left_text.Enabled = true;
            _input_new_left_text.Visible = true;
            _input_new_left_text.Text    = "Кликните для ввода текста";
            _input_new_left_text.Width   = _input_box.ClientSize.Width;
            _input_new_left_text.Height  = 25;
            _input_new_left_text.Left    = 0;
            _input_new_left_text.Top     = (_input_box.ClientSize.Height / 2) - (_input_new_left_text.Height / 2);
            _input_box.Controls.Add(_input_new_left_text);
            _input_new_left_text.Click  += new EventHandler(clear_input_new_left_text);
            _input_box.Hide();
        }
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.01.2014, 00:51
Ответы с готовыми решениями:

MessageBox.Show()
Здравствуйте! Я вызываю метод MessageBox.Show(&quot;!!!!&quot;) и мне необходимо, что бы пока я его не закрыл , то в основную форму нельзя было...

Не выходит MessageBox.Show
Приветствую, перепробовал множество вариантов но при нажатие на кнопку так и не выходит. Не понимаю что не так, прошу помощи! using System;...

MessageBox.Show собрать информацию
Здравствуйте, помогите у меня есть текстбоксы мне нужно чтобы MessageBox.Show обробатывал текст в текстбоксы и выводил всю информацию с...

2
 Аватар для MrGladus
178 / 178 / 50
Регистрация: 06.01.2013
Сообщений: 392
07.01.2014, 02:51
Событие
Цитата Сообщение от Jack Wade Посмотреть сообщение
_on_click_btn_2
C#
1
btn_1.Click              += new EventHandler (this._on_click_btn_1);
Ваша проблема в том, что вы подписываетесь на события, но не отписываетесь от них, то есть при каждом клике вы еще 1 раз подписываете событие в список делегатов, и они будут выполняться столько раз, сколько вы раз его подпишите на событие, то есть сколько раз кликнете. Чтобы все работало корректно отписывайтесь от события, либо измените логику чтобы не допустить подписку на событие более 1 раза. Советую почитать Рихтера или Троелсена про делегаты и события (delegates & events).
Удачного Вам дня.

Добавлено через 1 минуту
Кстати найденное Вами решение как раз изменяет логику так, что подписка на событие click будет выполнена только 1 раз

Добавлено через 3 минуты
И пожалуйста поучитесь называть правильно переменные и методы, потому что
Кликните здесь для просмотра всего текста
C#
1
void _inputbox_click_ok(Object Senter, EventArgs e)
- это ерунда. Правильнее будет назвать этот метод так
C#
1
private void InputboxClickOk(Object Senter, EventArgs e)
C#
1
public Form _input_box = new Form();
на
C#
1
public Form InputBox = new Form();

Поставьте себе Resharper - он вам поможет с этим
1
0 / 0 / 1
Регистрация: 31.12.2016
Сообщений: 1
31.12.2016, 19:31
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
DialogResult result = MessageBox.Show("Вы действительно хотите выйти?", "Уведомление", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result == DialogResult.Yes)
{
Application.ExitThread();
}
else
if (result == DialogResult.No)
{
e.Cancel = true;
}
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.12.2016, 19:31
Помогаю со студенческими работами здесь

Вывод MessageBox.Show если нет результатов
Проблема такая: Когда есть дубликат в файле, то функция поиска находит и отображает в текст бокс. Но когда дубликатов нет ничего не...

MessageBox.Show из dll
Всем привет ) Как мне сделать чтобы dll могла сделать MessageBox.Show ? А то у меня System.Console.WriteLine работает, а MessageBox.Show...

C# и Outlook, MessageBox.Show не существует в данном контексте
Из стандартного майкросовтовского примера не работает MessageBox.Show пишет что то типа немогу выполнить в данном контексте. Пишу...

Messagebox.show
Как вывести результат Console.WriteLine(&quot;key={0} volue={1}&quot;, i, dict); в messagebox public static...

MessageBox.Show() + Scroll
Приветствие. Подскажите пожалуйста способ, с помощью которого можно показать большое количество текста в MessageBox добавив в него...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru