Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Romeo24
0 / 0 / 1
Регистрация: 09.11.2013
Сообщений: 5
#1

Вывод данных в label другой формы

18.02.2016, 16:17. Просмотров 400. Ответов 2
Метки нет (Все метки)

Здравствуйте!
Приложение должно выводить сообщение на предварительно созданную форму notificationForm в реквизит label1 (форма для запуска приложения mainForm приведена ниже в коде). Но при запуске программы выводится пустая форма и зависает.
Я подозреваю, проблема при работе с потоком. Но как ее исправить, пока не знаю. Буду рад, если кто подскажет решение проблеммы.

Код главной формы для запуска приложения

Кликните здесь для просмотра всего текста

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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.NetworkInformation;
using System.Threading;
 
namespace Ping_Inspector_v2._0 {
    public partial class mainForm : Form {
        Thread stream = null;
        notificationForm notificForm = null;
        //********************************************************************************************
        public mainForm() {
            InitializeComponent();
        }
        //********************************************************************************************
        public void pingInspector() {
            while (true) {
                #region Пінгування хостів
                    string fileNameSettings = Properties.Settings.Default.DirectoryWithPingSettings;
                    if (string.IsNullOrEmpty(fileNameSettings)) {
                        MessageBox.Show("Відсутній файл налаштувань");
                        return;
                    }
 
                    DataSet ds = new DataSet();
                    ds.ReadXml(Properties.Settings.Default.DirectoryWithPingSettings);
 
                    if (ds.Tables.Count == 0) {
                        MessageBox.Show("Некоректний файл налаштувань");
                        return;
                    }
 
                    DataTable table = ds.Tables[0];
 
                    notifyIcon1.Visible = true;
 
                    string msg = string.Empty;
 
                    foreach (DataRow row in table.Rows) {
                        var dkName = row[0].ToString();
 
                        var mainIP = row[1].ToString();
                        if (!string.IsNullOrEmpty(mainIP))
                            if (!pingSuccess(mainIP))
                                msg += string.Format("Відсутній зв'язок з ДК {0} по осн. ІР: {1} {2}", dkName, mainIP, Environment.NewLine);
 
                        var reserveIP = row[2].ToString();
                        if (!string.IsNullOrEmpty(reserveIP))
                            if (!pingSuccess(reserveIP))
                                msg += string.Format("Відсутній зв'язок з ДК {0} по альт. ІР: {1} {2}", dkName, reserveIP, Environment.NewLine);
                    }
 
                #endregion
 
                    if (notificForm == null)
                        notificForm = new notificationForm();
 
                    notificForm.label1.Text = msg.ToString();
 
                    if (notificForm.IsDisposed)
                        notificForm.Close();
 
                    notificForm.Show();
 
                int pollDelay = Int32.Parse(Properties.Settings.Default.PollDelay.ToString());
                System.Threading.Thread.Sleep(pollDelay * 1000);
            }
        }
        //********************************************************************************************
        private static bool pingSuccess(string IPName) {
            Ping pingSender = new Ping();
            PingOptions options = new PingOptions();
 
            options.DontFragment = true;
            byte[] buffer = Encoding.ASCII.GetBytes("ping");
            PingReply reply = pingSender.Send(IPName, 1000, buffer, options);
 
            return (reply.Status == IPStatus.Success);
        }
        //********************************************************************************************
        private void btnStartStop_Click(object sender, EventArgs e) {
            #region Перевірка інтернет-з'єднання
                if (!pingSuccess("8.8.8.8")) {
                    MessageBox.Show("Відсутнє інтернет-з'єднання", "Первірка інтернет-з'єднання", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }
            #endregion
 
                if (stream == null)
                    stream = new Thread(pingInspector);
 
                if (stream.IsAlive)
                    stream.Abort();
                else
                {
                    this.Hide();
                    stream.Start();
                }
 
                this.btnStartStop.Text = stream.IsAlive ? "Стоп" : "Старт";
                this.btnSettings.Enabled = !stream.IsAlive;
        }
        //********************************************************************************************
        private void btnSettings_Click(object sender, EventArgs e) {
            settingsForm mySettingsForm = new settingsForm();
            mySettingsForm.Show();
        }
        //********************************************************************************************
        private void notifyIcon1_Click(object sender, EventArgs e) {
            this.Show();
            notifyIcon1.Visible = true;
        }
        //********************************************************************************************
        private void mainForm_FormClosing(object sender, FormClosingEventArgs e) {
            if (stream != null)
                if (stream.IsAlive)
                    stream.Abort();
        }
        //********************************************************************************************
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.02.2016, 16:17
Ответы с готовыми решениями:

Вывод данных из DataGridView в textBox другой формы
Добрый день. Как вывести данные из DataGridView в textBox другой формы? ...

Очистить label из другой формы
Имеется некоторое количество label заполненных данными. Как мне их очистить по...

Обновление значения label из другой формы
Подскажите как обновить значение leabel по кнопке другой формы. Data.Value...

Передача данных из одной формы в таблицу dataGridView другой формы
Есть две формы на одной таблица на второй поля в которые пользователь вводит...

Передача данных с DataGridView одной формы в TextBox другой формы
Ребята, мне необходимо передать значения с выбранной строки Datagridview в...

2
Storm23
Эксперт .NETАвтор FAQ
6131 / 3680 / 1396
Регистрация: 11.01.2015
Сообщений: 4,846
Записей в блоге: 31
18.02.2016, 23:26 #2
Romeo24,
С контролами и формами можно работать только из главного потока приложения.
Для вызова метода в главном потоке - используйте метод Invoke. Применительно к вашему случаю, фот этот фрагмент:
C#
1
2
3
4
5
6
7
8
9
            if (notificForm == null)
                notificForm = new notificationForm();
 
            notificForm.label1.Text = msg.ToString();
 
            if (notificForm.IsDisposed)
                notificForm.Close();
 
            notificForm.Show();
Нужно вынести в отдельный метод:
C#
1
2
3
4
5
6
7
8
9
10
11
12
        private void ShowNotificationForm(string msg)
        {
            if (notificForm == null)
                notificForm = new notificationForm();
 
            notificForm.label1.Text = msg.ToString();
 
            if (notificForm.IsDisposed)
                notificForm.Close();
 
            notificForm.Show();
        }
А в коде потока вызывать так:
C#
1
                Invoke((MethodInvoker) delegate { ShowNotificationForm(msg); });
Кроме того, вот эта строка
C#
1
2
            if (notificForm.IsDisposed)
                notificForm.Close();
смущает, что это?

Кроме того:
1) Наименование классов - неверно. Согласно рекомендациям, имена классов (например mainForm) должны начинаться с большой буквы. Имена методов - тоже.
2) Имена лейб типа label1 - не информативны.
3) Имена методов должны содержать глагол: pingInspector-> Ping (или MakePing), pingSuccess->HandleSuccess (или OnSuccess).
4) Комментарии типа //********* - не нужны, только затрудняют чтение.
5) MessageBox.Show("Відсутній файл налаштувань"); - тоже не должно быть в методе pingInspector. Вся работа с интерфейсом должна быть в главном потоке.
1
Romeo24
0 / 0 / 1
Регистрация: 09.11.2013
Сообщений: 5
19.02.2016, 10:17  [ТС] #3
C#
1
2
3
            
if (notificForm.IsDisposed)
    notificForm.Close();
этой частью хотелось сделать так, чтоб предыдущая форма закрывалась и открывалась новая и так до нажатия кнопки "Стоп".
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2016, 10:17

Передача данных (значение label) из одного метода в другой (+COM-port)
Добрый вечер форумчане. Возник вопрос в передачи значения лейбла кнопки другой...

Передача данных из одной формы в БД другой формы
Сразу скажу, что я новичок в программирование. Суть следующая, имеются две...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru