Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
2 / 2 / 2
Регистрация: 02.06.2017
Сообщений: 63
MS SQL

ListView - ping строки, выбираемой из списка/отображение списка онлайн машин в сети

29.09.2017, 22:59. Показов 1702. Ответов 8

Студворк — интернет-сервис помощи студентам
Доброй ночи, форумчане!
Возник насущный вопрос... Может быть, уже и обсуждался, но, по неведомым мне причинам, или я не понял, или не нашел возможный ответ.
Суть: MSSQL БД, WinForms программа. Есть ListView, 6 колонок(в целом не суть важно), отображает необходимую информацию. В одной из колонок четко прописан локальный, в другой - внешний IP-адрес компьютера в сети.
На ListView находится ContextmenuStrip, при нажатии на строку ListView я бы с помощью ПКМ выбирал пинг до локального или внешнего ip адреса (в разных обработчика, естественно).
Вероятно, при обработке события нужен SelectedIndexChange, возможно я не прав.
1. Рассмотрю любые идеи, или, если кто сталкивался, реализации данной идеи.
2. На будущее имеется плане реализации в ListView мониторинга доступности компьютеров онлайн - что-то типа ico/png разных цветов рядом с соответствующей строкой, показывающей, отвечает ли компьютер в настоящий момент.
Идеи, реализация? Можно в ЛС, но желательно тут, дабы оставить ответы будущему поколению форумчан Буду рад любой помощи и советам/комментариям. Желательно с исходниками, или помощи на пальцах/для тупых.
Спасибо!
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.09.2017, 22:59
Ответы с готовыми решениями:

Клиент-сервер: отображение списка онлайн-клиентов
Привет всем!! Подскажите пожалуйста, делаю клиен-серверное приложение как сделать чтоб на сервере и на клиенте добавлялись в ListBox...

Не отображаются элементы списка ListView, полученного у другого списка
Пытаюсь выполнить добавление нужных элементов во временном списке ListView, а потом присвоить этот список другому списку, который...

Создание списка, печать списка на экран, добавления элемента в начало списка, конец списка
Построить динамическую структуру типа список . Необходимо реализовать следующие процедуры: 1. создание списка. 2. печать списка на...

8
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
30.09.2017, 23:02
Цитата Сообщение от GuardianCoder Посмотреть сообщение
Идеи, реализация?
Ну идей, ятд, тут можно 100500 найти.
Я бы предложил (есди все компьютеры работают на ОС Windows) использовать такую штуку, как WCF Discovery/WCF Announcement (обнаружение/объявление). Очень удобная штука, по правде говоря.
0
2 / 2 / 2
Регистрация: 02.06.2017
Сообщений: 63
01.10.2017, 22:02  [ТС]
Вечер добрый.
Все компьютеры на Винде, да.
Мне по факту не нужно их обнаружение, т.к. ip и имя компа в базе под MSSQL. Именно пингование по адресу из списка Listview. Ну, и иконка статуса в отдельном столбце...
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
02.10.2017, 13:37
не понятна суть вопроса - Вы не знаете как организовать пинг на шарпе, или не знаете как выдернуть значение в выбранной строке?
И к тому же учтите, что на некоторый компах может стоять firewall, который будет отсекать ICMP запрос даже в рамках локальной сети (не говоря уже о том, что на внешний адрес, да еще и если он выставленный прямо на винде - я бы сам отсекал все внешние раздражители дабы не попасть на флуд по пингу)
0
2 / 2 / 2
Регистрация: 02.06.2017
Сообщений: 63
02.10.2017, 13:50  [ТС]
Конкретно в данном случае - как взять значение IP из клацнутой строки в listview и отпинговать адрес.
Какого то глобального флуда по пингу не подразумевается - в данном случае вопрос стоит доступности компьютера и получения его ответа.
Опять же, это может быть не компьютер, допустим, а КПК с фиксированным IP адресом, пингующийся через Wi-Fi точку.
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
02.10.2017, 14:45
Лучший ответ Сообщение было отмечено GuardianCoder как решение

Решение

Тогда начинайте отталкиваться не от того, что у Вас есть ListView (его может и не быть, и точно должно не быть на этапе проектирования системы).
Отталкивайтесь от того, что у Вас есть набор строк (а в них есть колонки). Т.е. есть набор сущностей, в данном случае - это компы, из этого следует что есть класс комп со своими полями, и есть какой-то класс "набор компов", а в классе набора есть какой-то лист/таблица компов, в которую мы можем добавлять/удалять компы.
И грубо говоря есть свой личный сериализатор/десериализатор который по запросу из сиквела вернет нам сущность "набор компов".
Из этого набора (зная Id компа) - уже достаточно тривиально достать айпишник данного компа.
А Id нам отдаст уже тот самый злосчатсный ListView своим свойством SelectedRow (может по-другому называется, уже не помню что там в листе можно выцепить).
Но это так бы сделал я, а как сделано сейчас - мне пока не понятно, что и как у Вас тянется.
1
2 / 2 / 2
Регистрация: 02.06.2017
Сообщений: 63
26.12.2017, 16:37  [ТС]
Кстати, всё же хочу поделиться на будущее своей наработкой. Хулигану отдельное спасибо за толчок в нужном направлении!
Мне банально проще оказалось перевести из ListView в datagridview и оттуда таскать данные.
Любые комментарии и пинки приветствуются. Шарп только осваиваю, потому, за красоту и адекватность кода ручаться и вовсе не могу.

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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
//Указываем, что форма Docking
    public partial class FUsersManagement : DockContent
    {
        public FUsersManagement()
        {
            //Загружает откомпилированную страницу компонента 
            InitializeComponent();
            dataGridView1.ClearSelection();
        }
 
        //Грузим форму и обновляем адаптер
        private void Fmanagetest_Load(object sender, EventArgs e)
        {
            // TODO: This line of code loads data into the 'usersManagement.GSDBAssociates' table. You can move, or remove it, as needed.
            dataGridView1.ClearSelection();
            this.gSDBAssociatesTableAdapter.Fill(this.usersManagement.GSDBAssociates);
            //Пробуем сохранить сортировку (Кстати, а работает ли этот код вообще??? о_О)
            DataGridViewColumn sortCol = dataGridView1.SortedColumn;
            ListSortDirection direction = ListSortDirection.Descending;
            if (sortCol != null)
            {
                if (dataGridView1.SortOrder == System.Windows.Forms.SortOrder.Ascending)
                    direction = ListSortDirection.Ascending;
            }
            if (sortCol != null) dataGridView1.Sort(sortCol, direction);
            this.dataGridViewImageColumn1.DefaultCellStyle.NullValue = null;
        }
 
        //ОБЪЯВЛЯЕМ PING. При успешном ответе компьютеров / серверов - показываем соответствующую надпись в DataGridView
        private static void ping_PingCompleted(object sender, PingCompletedEventArgs e)
        {
            var reply = e.Reply;
            DataGridViewRow row = e.UserState as DataGridViewRow;
            //Пингуем ВНЕШНИЙ IP-адрес 
            DataGridViewCell PingStat = row.Cells["sAdressDataGridViewTextBoxColumn"];
            if (!(reply == null))
            {
                switch (reply.Status)
                {
                    case IPStatus.Success:
                        //Если решим писать в dbgrid информацию по пакетам ответов - то ниже    
                        //PingStat.Value = string.Format("Ответ получен от {0}: bytes={1} time={2}ms TTL={3}", reply.Address, reply.Buffer.Length, reply.RoundtripTime, reply.Options.Ttl);
                        PingStat.Value = string.Format("Ответ получен");
                        break;
                    case IPStatus.TimedOut:
                        PingStat.Value = "Нет ответа";
                        break;
                    case IPStatus.Unknown:
                        PingStat.Value = "Другая ошибка";
                        break;
                        //
                    case IPStatus.BadDestination:
                        PingStat.Value = "Другая ошибка";
                        break;
                    case IPStatus.BadHeader:
                        PingStat.Value = "Другая ошибка";
                        break;
                    case IPStatus.BadOption:
                        PingStat.Value = "Другая ошибка";
                        break;
                    case IPStatus.BadRoute:
                        PingStat.Value = "Другая ошибка";
                        break;
                    case IPStatus.DestinationHostUnreachable:
                        PingStat.Value = "Другая ошибка";
                        break;
                    case IPStatus.DestinationNetworkUnreachable:
                        PingStat.Value = "Другая ошибка";
                        break;
                    case IPStatus.DestinationPortUnreachable:
                        PingStat.Value = "Другая ошибка";
                        break;
                    case IPStatus.DestinationProhibited:
                        PingStat.Value = "Другая ошибка";
                        break;
                    case IPStatus.DestinationScopeMismatch:
                        PingStat.Value = "Другая ошибка";
                        break;
                    case IPStatus.DestinationUnreachable:
                        PingStat.Value = "Другая ошибка";
                        break;
                    case IPStatus.HardwareError:
                        PingStat.Value = "Другая ошибка";
                        break;
                    case IPStatus.IcmpError:
                        PingStat.Value = "Другая ошибка";
                        break;
                    case IPStatus.NoResources:
                        PingStat.Value = "Другая ошибка";
                        break;
                    case IPStatus.PacketTooBig:
                        PingStat.Value = "Другая ошибка";
                        break;
                    case IPStatus.ParameterProblem:
                        PingStat.Value = "Другая ошибка";
                        break;
                    case IPStatus.SourceQuench:
                        PingStat.Value = "Другая ошибка";
                        break;
                    case IPStatus.TimeExceeded:
                        PingStat.Value = "Другая ошибка";
                        break;
                    case IPStatus.TtlExpired:
                        PingStat.Value = "Другая ошибка";
                        break;
                    case IPStatus.TtlReassemblyTimeExceeded:
                        PingStat.Value = "Другая ошибка";
                        break;
                    case IPStatus.UnrecognizedNextHeader:
                        PingStat.Value = "Другая ошибка";
                        break;
                        //
                    default:
                        PingStat.Value = string.Format("Ping failed: {0}", reply.Status.ToString());
                        break;
                }
            }
            //Пингуем ВНУТРЕННИЙ (локальный) IP-адрес 
            DataGridViewCell PingStat2 = row.Cells["sAdress2DataGridViewTextBoxColumn"];
            if (!(reply == null))
            {
                switch (reply.Status)
                {
                    case IPStatus.Success:
                        PingStat2.Value = string.Format("Ответ получен");
                        break;
                    case IPStatus.TimedOut:
                        PingStat2.Value = "Нет ответа";
                        break;
                    case IPStatus.BadDestination:
                        PingStat2.Value = "Другая ошибка";
                        break;
                    case IPStatus.BadHeader:
                        PingStat2.Value = "Другая ошибка";
                        break;
                    case IPStatus.BadOption:
                        PingStat2.Value = "Другая ошибка";
                        break;
                    case IPStatus.BadRoute:
                        PingStat2.Value = "Другая ошибка";
                        break;
                    case IPStatus.DestinationHostUnreachable:
                        PingStat2.Value = "Другая ошибка";
                        break;
                    case IPStatus.DestinationNetworkUnreachable:
                        PingStat2.Value = "Другая ошибка";
                        break;
                    case IPStatus.DestinationPortUnreachable:
                        PingStat2.Value = "Другая ошибка";
                        break;
                    case IPStatus.DestinationProhibited:
                        PingStat2.Value = "Другая ошибка";
                        break;
                    case IPStatus.DestinationScopeMismatch:
                        PingStat2.Value = "Другая ошибка";
                        break;
                    case IPStatus.DestinationUnreachable:
                        PingStat2.Value = "Другая ошибка";
                        break;
                    case IPStatus.HardwareError:
                        PingStat2.Value = "Другая ошибка";
                        break;
                    case IPStatus.IcmpError:
                        PingStat2.Value = "Другая ошибка";
                        break;
                    case IPStatus.NoResources:
                        PingStat2.Value = "Другая ошибка";
                        break;
                    case IPStatus.PacketTooBig:
                        PingStat2.Value = "Другая ошибка";
                        break;
                    case IPStatus.ParameterProblem:
                        PingStat2.Value = "Другая ошибка";
                        break;
                    case IPStatus.SourceQuench:
                        PingStat2.Value = "Другая ошибка";
                        break;
                    case IPStatus.TimeExceeded:
                        PingStat2.Value = "Другая ошибка";
                        break;
                    case IPStatus.TtlExpired:
                        PingStat2.Value = "Другая ошибка";
                        break;
                    case IPStatus.TtlReassemblyTimeExceeded:
                        PingStat2.Value = "Другая ошибка";
                        break;
                    case IPStatus.UnrecognizedNextHeader:
                        PingStat2.Value = "Другая ошибка";
                        break;
                    default:
                        PingStat2.Value = string.Format("Ping failed: {0}", reply.Status.ToString());
                        break;
                }
            }
        }
 
//Пингуем компьютеры / сервера по списку по своим столбцам в datagridView1
        private void внешнийToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
            this.gSDBAssociatesTableAdapter.Fill(this.usersManagement.GSDBAssociates);
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                if (!row.IsNewRow)
                {
                    String ip;
                    Ping ping = new Ping();
                    ip = row.Cells["sAdressDataGridViewTextBoxColumn"].Value.ToString();
                    ip = row.Cells["sAdress2DataGridViewTextBoxColumn"].Value.ToString();
                    ping.PingCompleted += new PingCompletedEventHandler(ping_PingCompleted);
                    ping.SendAsync(ip, 1000, row);
                    System.Threading.Thread.Sleep(5);
                }
            }
            dataGridView1.ClearSelection();//снять выделение всех выбранных ячеек
        }
 
//Таймер на пингование кудахтеров
        private void timer1_Tick(object sender, EventArgs e)
        {
            this.gSDBAssociatesTableAdapter.Fill(this.usersManagement.GSDBAssociates);
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                if (!row.IsNewRow)
                {
                    String ip;
                    Ping ping = new Ping();
                    ip = row.Cells["sAdressDataGridViewTextBoxColumn"].Value.ToString();
                    ip = row.Cells["sAdress2DataGridViewTextBoxColumn"].Value.ToString();
                    ping.PingCompleted += new PingCompletedEventHandler(ping_PingCompleted);
                    ping.SendAsync(ip, 1000, row);
                    System.Threading.Thread.Sleep(5);
                }
            }
            dataGridView1.ClearSelection();//снять выделение всех выбранных ячеек
        }
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
27.12.2017, 09:48
1. Очень много пунктов "Другая ошибка" - смысл тогда перечислять их, можно было всё каскадно перечислить и проваливаться без break каждый раз, ну да ладно, до этого дойдете.
2. Не нужно каждый раз подписываться на событие в цикле, достаточно 1 раз подписаться на этапе загрузки формы (имею в виду на событие пинга).
3. Выдергивать значение из грида - тоже не самое удачное решение, лучше таскать данные из объекта, что прибинден к гриду - тогда можно было бы таскать точно так же и из LisView.
Цитата Сообщение от GuardianCoder Посмотреть сообщение
System.Threading.Thread.Sleep(5);
Вообще не понятно смысла в этой строке. Лишний раз заставлять форму заморозиться - не самое удачное решение. Тут бы почитать об асинхронности, советую Албахари - там об этом (ИМХО) наилучшим образом разжевано, сравнивал с Рихтером и Троелсеном, но это субъективно.
0
2 / 2 / 2
Регистрация: 02.06.2017
Сообщений: 63
27.12.2017, 09:59  [ТС]
И тем не менее - спасибо!
Буду копать дальше по мере возможности и времени)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.12.2017, 09:59
Помогаю со студенческими работами здесь

Сканирование компьютеров на присутствие в сети онлайн. #threads #c++11 #ping #icmp
Пишу программу, которая будет проверять наличие компьютеров в сети. Нашел на msdn код для отправки ICMP запроса. Пытаюсь использовать этот...

Batch ping из списка адресов
Привет всем. Не получается написать батник для пингования списка серверов с сохранением статистики Если в консоли windows (cmd)...

Написать код программы, выполняющей растяжку списка и вставку, удаление из списка и сжатие списка
Люди ПОМОГИТЕ осталось совсем мало , мне нужна помощь!!! написать код программ: 1) Написать код программы, выполняющей растяжку...

Даны два списка. Каждый элемент первого списка ассоциативно связан соответствующим элементом второго списка
Помогите пожалуйста Даны два списка: список студентов и список их успеваемости. Каждый элемент первого списка ассоциативно связан с...

Существует ли возможность удаления списка ПО с администрируемых N машин политикой?
Доброго времени суток, знатоки ... Подскажите, существует ли возможность удаления списка ПО с администрируемых N машин, политикой, что то...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru