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

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

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

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

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

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

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

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

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

Решение

Тогда начинайте отталкиваться не от того, что у Вас есть ListView (его может и не быть, и точно должно не быть на этапе проектирования системы).
Отталкивайтесь от того, что у Вас есть набор строк (а в них есть колонки). Т.е. есть набор сущностей, в данном случае - это компы, из этого следует что есть класс комп со своими полями, и есть какой-то класс "набор компов", а в классе набора есть какой-то лист/таблица компов, в которую мы можем добавлять/удалять компы.
И грубо говоря есть свой личный сериализатор/десериализатор который по запросу из сиквела вернет нам сущность "набор компов".
Из этого набора (зная Id компа) - уже достаточно тривиально достать айпишник данного компа.
А Id нам отдаст уже тот самый злосчатсный ListView своим свойством SelectedRow (может по-другому называется, уже не помню что там в листе можно выцепить).
Но это так бы сделал я, а как сделано сейчас - мне пока не понятно, что и как у Вас тянется.
1
2 / 2 / 2
Регистрация: 02.06.2017
Сообщений: 63
26.12.2017, 16:37  [ТС] 7
Кстати, всё же хочу поделиться на будущее своей наработкой. Хулигану отдельное спасибо за толчок в нужном направлении!
Мне банально проще оказалось перевести из 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 8
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  [ТС] 9
И тем не менее - спасибо!
Буду копать дальше по мере возможности и времени)
0
27.12.2017, 09:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.12.2017, 09:59
Помогаю со студенческими работами здесь

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

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

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

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


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

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