Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
 Аватар для danyasworld
10 / 9 / 2
Регистрация: 12.04.2015
Сообщений: 238
Записей в блоге: 2

Почему обработчик события формы 2 отрабатывает и на первой?

08.11.2015, 02:01. Показов 1806. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть 2 формы - main и bd_master. форма bd_master открывается из main вот так:
C#
1
2
3
 bd_master Bd_master = new bd_master();
 Bd_master.Owner = this;
 Bd_master.ShowDialog();
в форме bd_master обрабатывается событие form_closing с открытием messageBox
C#
1
2
3
4
5
private void bd_master_FormClosing(object sender, FormClosingEventArgs e)
        {
            var rez = MessageBox.Show( "Вы точно хотите покинуть мастер настройки баз данных? Все не сохраненные данные будут утеряны", "Внимание", MessageBoxButtons.YesNo, MessageBoxIcon.Warning,MessageBoxDefaultButton.Button2);
            e.Cancel = rez == DialogResult.No;
        }
на форме bd_master все работает отлично, окно всплывает на нажатие нет закритие отменяется. Форма main имеет свой обработчик этого события
C#
1
2
3
4
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            MessageBox.Show(this,"сеанс завершен", "завершене", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
но каким то образом на форме main сначала всплывает окно bd_master(при этом если нажать нет форма не закрывается!!!) и только после этого окно самой формы main. Я так понял это не зависит от свойства owner и show просто или showdialog. В чем же проблема???
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.11.2015, 02:01
Ответы с готовыми решениями:

Почему когда я вешаю обработчик события на ячейку и этот обработчик срабатывает, то оказывается, он сработал совершенно для ДРУГОЙ ячейки?
Да, почему? Скропаем DataGridView; кинем на форму listBox2 и listBox1 и напишем такой обработчик для события EditingControlShowing...

Почему когда изменяется значение ячейки DataGridView, то не вызывается обработчик события CellValueChanged?
Всё предельно просто. Скропаем таблицу dataGridView1 из двух столбцов. Первый стоблбец пусть будет обыкновеный (DataGridViewTextBoxColumn),...

Перемещение первой формы на экране при выполнении события на второй
Привет, перечитал кучу форумов, но так и не понял как реализовать (я новичок в С#). При запуске проекта одновременно запускаются две...

21
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
08.11.2015, 09:26
Цитата Сообщение от danyasworld Посмотреть сообщение
C#
1
2
3
bd_master Bd_master = new bd_master();
*Bd_master.Owner = this;
*Bd_master.ShowDialog();
Сразу после этого попробуйте добавить Bd_master.Close() или Bd_master.Dispose()
0
 Аватар для Павлик Морозов
138 / 137 / 42
Регистрация: 26.10.2012
Сообщений: 443
08.11.2015, 19:39
EvilFromHell, это точно лишнее. т.к. форма вызывается как модальная, то на основной форме ничего сделать не получится до тех пор, пока не будет закрыт модальный диалог. Проблема в чем-то другом и желательно увидеть весь код обеих форм. danyasworld, это уже к Вам просьба, покажите код форм, что бы понять где ошибка. Подозреваю, что у вас где-то зависает ваша форма bd_master, и когда хотите закрыть основную форму, идет попытка закрытия дочерней.
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
08.11.2015, 19:53
Павлик Морозов, не соглашусь. Попробуйте запустить код, аналогичный тому, что у ТСа:
Form1
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System.Windows.Forms;
 
namespace WindowsFormsApplication31
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Form2 f = new Form2();
            f.Owner = this;
            f.ShowDialog();
            //f.Close();
 
        }
 
 
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            MessageBox.Show("1");
        }
    }
}
Form2
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System.Windows.Forms;
 
namespace WindowsFormsApplication31
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
 
        private void Form2_FormClosing(object sender, FormClosingEventArgs e)
        {
            MessageBox.Show("2");
        }
    }
}
И запустите его с закомментированным Close и с раскомментированным. Поймете о чем я.

Добавлено через 7 минут
Суть проблемы в том, что обработчик FromClosing второй формы вызывается снова при закрытии первой, хотя вторая форма и так уже не отображена.
0
 Аватар для danyasworld
10 / 9 / 2
Регистрация: 12.04.2015
Сообщений: 238
Записей в блоге: 2
08.11.2015, 23:11  [ТС]
EvilFromHell, не помогло

Добавлено через 55 секунд
что за TCa? (смысл понятен но расшифруйте )

Добавлено через 2 минуты
Павлик Морозов,
не вопрос.
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
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.SQLite;
using System.Drawing;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Threading;
using Common;
 
namespace FOND
{ 
    public partial class MainForm : Form
    {
        lastlog lg = new lastlog();
        public MainForm()
        {
            InitializeComponent();
            
        }
        private void MainForm_Shown(object sender, EventArgs e)
        {
            datacheck();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            
            lg.add("нажата кнопка 1");
            MainForm.ActiveForm.Hide();
            RedForm datainsform = new RedForm();
            datainsform.ShowDialog();
            this.Show();
        }
 
        private void pictureBox1_MouseHover(object sender, EventArgs e)
        {
            toolTip1.SetToolTip(pictureBox1, "Настройки");
        }
 
        private void userControl11_MouseHover(object sender, EventArgs e)
        {
            toolTip1.SetToolTip(userControl11, "Текущая дата и время компьютера");
        }
 
        private void userControl11_Load(object sender, EventArgs e)
        {
 
        }
 
        private void button9_Click(object sender, EventArgs e)
        {
            
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            textBox1.Text += "нажато /n";
        }
 
        //проверка бд, ее структуры и значенй перед запуском приложения
        private void datacheck()
        {
            if(FOND.Properties.Settings.Default.db_file_dir == "" || !File.Exists(Properties.Settings.Default.db_file_dir))
            {
                bd_master Bd_master = new bd_master();
                Bd_master.Owner = this;
                Bd_master.ShowDialog();
                Bd_master.Close();
                Bd_master.Dispose();
            }
            else
            {
                var tnames = new string[] { "workers", "materialway", "material_theme", "type", "speakerlvl", "regions", "parts", "smi" };
                var connstr = "`name` = '" + tnames[0] + "'";
                SQLiteConnection conn = new SQLiteConnection(string.Format("Data Source = {0};", Properties.Settings.Default.db_file_dir));
                for(int i = 1; i < tnames.Length; i++)
                {
                    connstr += " OR `name` = '" + tnames[i] +"'";
                }
                SQLiteCommand comm = new SQLiteCommand("SELECT `name` FROM `sqlite_master` WHERE " + connstr ,conn);
                conn.Open();
                try { comm.ExecuteNonQuery(); }catch(SQLiteException e) { MessageBox.Show(e.Message, "lol"); }
                SQLiteDataReader dr = comm.ExecuteReader();
                var p = 0;
                foreach(DbDataRecord record in dr)
                {
                    var name = record["name"] + "";
                    for(int i = 0; i<tnames.Length; i++)
                    {
                        if (name == tnames[i])
                        {
                            p++;
                        }
                    }
                }
                conn.Close();
                if (p != tnames.Length)
                {
                    bd_master Bd_master = new bd_master();
                    Bd_master.Owner = this;
                    Bd_master.ShowDialog();
                }
    }
        }
 
        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            MessageBox.Show(this,"сеанс завершен", "завершене", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
    }
    }
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
using System;
using System.IO;
using System.ComponentModel;
using System.Data;
using System.Threading;
using Common;
using FOND.masterPages;
using System.Windows.Forms;
 
namespace FOND
{
    public partial class bd_master : Form
    {
        public master mstr = new master();
        private Control[] pages = new Control[] { new page1(), new page2(),new page3() };
        private bool[] ok = new bool[] {false,false,false,false};
        public bd_master()
        {
            InitializeComponent();
            loadI();
 
        }
 
        private void loadI()
        {
            if (panel1.Controls.Count == 0)
            {
                panel1.Controls.Add(pages[0]);
            }
            if (panel1.Controls[0] != pages[0] && panel1.Controls[0] != pages[pages.Length - 1])
            {
                nextB.Enabled = master.nextBE;
                bacbB.Enabled = master.backBE;
            }
            else
            {
                if (panel1.Controls[0] == pages[0])
                {
                    bacbB.Enabled = false;
                    nextB.Enabled = master.nextBE;
                }
                else
                {
                    nextB.Enabled = false;
                    bacbB.Enabled = master.backBE;
                }
            }
        }
        private void button3_Click(object sender, EventArgs e)
        {
            var pInd = Array.IndexOf(pages, panel1.Controls[0]);
            var continue_ok = false;
            switch (pInd)
            {
                case 0:
                    continue_ok = (pages[pInd] as page1).worker();
                    break;
                case 1:
                    continue_ok = (pages[pInd] as page2).worker();
                    break;
            }
            if (continue_ok == true)
            {
                panel1.Controls.Clear();
                panel1.Controls.Add(pages[pInd + 1]);
            }
 
        }
 
        private void timer1_Tick(object sender, EventArgs e)
        {
            loadI();
        }
 
        private void bacbB_Click(object sender, EventArgs e)
        {   
            var pInd = Array.IndexOf(pages, panel1.Controls[0]);
            var continue_ok = false;
            switch (pInd)
            {
                case 0:
                    continue_ok = (pages[pInd] as page1).worker();
                    break;
                case 1:
                    continue_ok = (pages[pInd] as page2).worker();
                    break;
            }
            
            if (continue_ok == true)
            {
                panel1.Controls.Clear();
                panel1.Controls.Add(pages[pInd - 1]);
            }
        }
 
 
        private void cancB_Click(object sender, EventArgs e)
        {
                this.Close();
                
          
        }
 
        private void bd_master_FormClosing(object sender, FormClosingEventArgs e)
        {
            var rez = MessageBox.Show( "Вы точно хотите покинуть мастер настройки баз данных? Все не сохраненные данные будут утеряны", "Внимание", MessageBoxButtons.YesNo, MessageBoxIcon.Warning,MessageBoxDefaultButton.Button2);
            e.Cancel = rez == DialogResult.No;
        }
 
        private void bd_master_ControlAdded(object sender, ControlEventArgs e)
        {
            var pind = Array.IndexOf(pages,panel1.Controls[0]);
        }
    }
}
много логики еще в pages, если надо могу приложить
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
08.11.2015, 23:12
Цитата Сообщение от danyasworld Посмотреть сообщение
TC
Топикстартер.
Цитата Сообщение от danyasworld Посмотреть сообщение
не помогло
Тогда надо больше кода чтобы что-то понять.
0
 Аватар для danyasworld
10 / 9 / 2
Регистрация: 12.04.2015
Сообщений: 238
Записей в блоге: 2
08.11.2015, 23:14  [ТС]
код выше

Добавлено через 18 секунд
EvilFromHell, .

Добавлено через 37 секунд
может ему таймер мешает?
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
08.11.2015, 23:15
Было бы еще проще, если бы вы приложили сам проект, тогда ошибку можно было бы не искать глазами а сразу выявить в студии.
0
 Аватар для danyasworld
10 / 9 / 2
Регистрация: 12.04.2015
Сообщений: 238
Записей в блоге: 2
08.11.2015, 23:22  [ТС]
EvilFromHell, щаз, просто у меня код не дописан немного. так сказать в процессе разработки, но нигде зависать не должен. Это мой первый серьезный проект на c#, так что прошу критиковать все ибо я должен много чего узнать и понять . Милости прошу https://drive.google.com/file/... sp=sharing

Добавлено через 1 минуту
от ценных советов тоже не откажусь
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
08.11.2015, 23:37
danyasworld,
попробуйте:
C#
1
2
3
4
bd_master Bd_master = new bd_master();
Bd_master.Owner = this;
Bd_master.ShowDialog();
Bd_master.Owner = null;
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
08.11.2015, 23:45
Что-то я тогда не пойму в чем проблема, раз вы говорите "не помогло". Вот я запускаю ваш проект и проблемы из 1ого поста не наблюдаю. Потом я нашел и закомментировал строчки:
C#
1
2
                Bd_master.Close();
                Bd_master.Dispose();
И сразу проблема появилась

Добавлено через 4 минуты
Вариант с занулением Owner тоже работает, но по-моему логичнее всего Dispose, раз форма больше не нужна
0
 Аватар для danyasworld
10 / 9 / 2
Регистрация: 12.04.2015
Сообщений: 238
Записей в блоге: 2
08.11.2015, 23:51  [ТС]
EvilFromHell, и что же у меня не так???
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
08.11.2015, 23:56
У вас, кстати, не проставлено то же самое, если
C#
1
if(FOND.Properties.Settings.Default.db_file_dir == "" || !File.Exists(Properties.Settings.Default.db_file_dir))
Это условие не выполняется. Там просто:
C#
1
2
3
                    bd_master Bd_master = new bd_master();
                    Bd_master.Owner = this;
                    Bd_master.ShowDialog();
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
09.11.2015, 00:00
danyasworld,
а
Цитата Сообщение от Даценд Посмотреть сообщение
C#
1
Bd_master.Owner = null;
тоже не работает?
0
 Аватар для danyasworld
10 / 9 / 2
Регистрация: 12.04.2015
Сообщений: 238
Записей в блоге: 2
09.11.2015, 00:03  [ТС]
EvilFromHell, не понял

Добавлено через 31 секунду
Цитата Сообщение от EvilFromHell Посмотреть сообщение
У вас, кстати, не проставлено то же самое, если
???

Добавлено через 1 минуту
Цитата Сообщение от Даценд Посмотреть сообщение
тоже не работает?
тоже

Добавлено через 51 секунду
если это может влиять - студия 2015, ос вин 10
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
09.11.2015, 00:05
Лучший ответ Сообщение было отмечено danyasworld как решение

Решение

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
        //проверка бд, ее структуры и значенй перед запуском приложения
        private void datacheck()
        {
            if(FOND.Properties.Settings.Default.db_file_dir == "" || !File.Exists(Properties.Settings.Default.db_file_dir))
            {
                bd_master Bd_master = new bd_master();
                Bd_master.Owner = this;
                Bd_master.ShowDialog();
                //Bd_master.Owner = null;
                //Bd_master.Close();
                Bd_master.Dispose();
            }
            else
            {
                var tnames = new string[] { "workers", "materialway", "material_theme", "type", "speakerlvl", "regions", "parts", "smi" };
                var connstr = "`name` = '" + tnames[0] + "'";
                SQLiteConnection conn = new SQLiteConnection(string.Format("Data Source = {0};", Properties.Settings.Default.db_file_dir));
                for(int i = 1; i < tnames.Length; i++)
                {
                    connstr += " OR `name` = '" + tnames[i] +"'";
                }
                SQLiteCommand comm = new SQLiteCommand("SELECT `name` FROM `sqlite_master` WHERE " + connstr ,conn);
                conn.Open();
                try { comm.ExecuteNonQuery(); }catch(SQLiteException e) { MessageBox.Show(e.Message, "lol"); }
                SQLiteDataReader dr = comm.ExecuteReader();
                var p = 0;
                foreach(DbDataRecord record in dr)
                {
                    var name = record["name"] + "";
                    for(int i = 0; i<tnames.Length; i++)
                    {
                        if (name == tnames[i])
                        {
                            p++;
                        }
                    }
                }
                conn.Close();
                if (p != tnames.Length)
                {
                   bd_master Bd_master = new bd_master();
                    Bd_master.Owner = this;
                    Bd_master.ShowDialog(); // ВОТ ТУТ У ВАС НЕ ПРОСТАВЛЕНО НИЧЕГО!!!
                }
    }
        }
Добавлено через 1 минуту
Цитата Сообщение от danyasworld Посмотреть сообщение
если это может влиять - студия 2015, ос вин 10
Студия и у меня 15
1
 Аватар для danyasworld
10 / 9 / 2
Регистрация: 12.04.2015
Сообщений: 238
Записей в блоге: 2
09.11.2015, 00:11  [ТС]
EvilFromHell, аа ну я тупой. Понятно почему в первый раз у вас все нормально было) у меня уже стабильно вторая ветка идет. резюмируя: нужно быть мнимательнее, спасибо всем за помощь (и как я вообще на пхп писал? ) всем бобра))
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
09.11.2015, 00:17
А вот если бы вы вынесли вызов этой формы в отдельный метод, то такого бы не случилось А так это называется дублирование кода, оно сильно усложняет отладку...
0
 Аватар для danyasworld
10 / 9 / 2
Регистрация: 12.04.2015
Сообщений: 238
Записей в блоге: 2
09.11.2015, 00:19  [ТС]
EvilFromHell, да мне лень было ради двух повторений городить? у меня там много такого, если честно. Но я стараюсь...
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
09.11.2015, 00:24
Ну, как видите, в данном случае из-за такой мелочи было потрачено много времени Да и сразу обычно не знаешь, что куда придется потом прилепить, лучше сразу разбить код так, чтобы его удобно было менять.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.11.2015, 00:24
Помогаю со студенческими работами здесь

Создайте обработчик события изменение размера формы (Resize), который будет устанавливать все кнопки в активный режим
Разместите на форме ряд кнопок (Button). Создайте обработчики события нажатия на данные кнопки, которые будут делать неактивными текущую ...

Как в одном обработчике события запустить другой обработчик события
Есть список listView1, который заполняется из массива PeopleListprivate void listView1_RetrieveVirtualItem(object sender,...

Почему может не работать обработчик события?
Подскажите пожалуйста, почему в моем коде не срабатывает обработчик? LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam,...

Прикрепить обработчик события для элементов, созданных после загрузки формы
Я, возможно, заблуждаюсь в употреблении таких слов как &quot;рантайм&quot;, но все же... Имеется listbox ... В нем я выбираю кол-во...

Как в VBA-коде установить обработчик события для подчинённой формы?
Привет, друзья! Конкретно меня интересует событие BeforeUpdate для подчинённой формы (Subform). Форма из себя представляет...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru