68 / 41 / 14
Регистрация: 24.02.2013
Сообщений: 250
1

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Подскажите пожалуйста...
Мне вот надо было сделать диалоговое окно для ввода данных для бегущей строки.
Кроме этого, надо было, чтобы программа не давала вводить пустую строку и не давала вводить стандартное сообщение, которое пропадает при клике на 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.01.2014, 00:51
Ответы с готовыми решениями:

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

Не выходит MessageBox.Show
Приветствую, перепробовал множество вариантов но при нажатие на кнопку так и не выходит. Не понимаю...

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

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

2
178 / 178 / 50
Регистрация: 06.01.2013
Сообщений: 392
07.01.2014, 02:51 2
Событие
Цитата Сообщение от 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 3
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
31.12.2016, 19:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.12.2016, 19:31
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

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