Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB .NET > Получить IP-адреса компьютера


Автор: DENSHER 6.10.2010, 16:12
Все доброго времени суток. Народ нужна ваша помощь как всегда.

Хочу сделать вывод в ListView1 список IP-адресов. Чтобы не путать никого , я хочу чтобы выводился список IP только того компьютера на котором запущен проект.

А теперь о сути проблемы -

Я сделал вывод IP-адресов но V.B. Студия начала ругаться на то что GetHostByName устарел и нужно его заменить на GetHostEntry. Я все сделал и ругаться он перестал но теперь , мне выводит лишних три строчки которые мне ненужно чтобы отображались. Вот код:
Код

Public Class Form1
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        ListView1.Items.Clear()
        Dim Host As String = System.Net.Dns.GetHostName
        Dim IP As System.Net.IPHostEntry = System.Net.Dns.GetHostEntry(Host)
        For Each myIP As System.Net.IPAddress In IP.AddressList
            Dim colIps As ListViewItem = ListView1.Items.Add("0") ' Не знаю как вывести нумерацию строчек.
            colIps.SubItems.Add(myIP.ToString)
        Next
    End Sub

    Private Sub ListView1_SelectedIndexChanged(ByVal sender As System.Object, _ 
ByVal e As System.EventArgs) Handles ListView1.SelectedIndexChanged
        Dim I As Integer
        For I = 0 To ListView1.SelectedItems.Count - 1
            TextBox1.Text = ListView1.SelectedItems(0).SubItems(1).Text
        Next
    End Sub
End Class

На всякий случай прикрепил проект к посту.
Ой чуть не забыл о маленькой но важной для меня еще мини-проблеме. Я еще не смог сделать вывод нумерации строчек в ListView1(ListView1.Items.Add("0")'Не знаю как вывести нумерацию строчек"). Подскажите как?

Спасибо за внимание рассчитываю на вашу помощь.

Автор: Heinzz 9.10.2010, 01:52
внешний IPадрес
Код

WebRequest request = WebRequest.Create(@"http://whatismyip.com/automation/n09230945.asp");
            WebResponse response = request.GetResponse();
            StreamReader sr = new StreamReader(response.GetResponseStream());
            Console.WriteLine(sr.ReadToEnd());

Автор: Pilger 9.10.2010, 02:03
Цитата
Мне выводит лишних три строчки которые мне ненужно чтобы отображались. 

Отображай только то, что надо.

Цитата
Я еще не смог сделать вывод нумерации строчек в ListView1(ListView1.Items.Add("0")

Добавь переменную Integer и увеличивай каждый раз на 1.

Автор: Heinzz 9.10.2010, 02:13
чтобы сделать нумерацию строчек можно используя вид View.Details сделать первую колонку с номерами.

Автор: Heinzz 9.10.2010, 02:45
Код

 class MyListView : ListView
    {
        public MyListView()
        {
            this.View = View.Details;
            this.Columns.Add("ID");
            this.Columns.Add("Name");
            this.Columns.Add("Age");
            this.Columns.Add("Occupation");
            this.FullRowSelect = true;
        }
        public void AddPerson(Person p)
        {
            ListViewItem item = new ListViewItem(new string[] { this.Items.Count.ToString(), p.Name, p.Age.ToString(), p.Occupation });
            this.Items.Add(item);
        }

    }


    class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public string Occupation { get; set; }
        public Person(string name, int age, string occupation)
        {
            this.Name = name;
            this.Age = age;
            this.Occupation = occupation;
        }
    }

Автор: DENSHER 9.10.2010, 03:08
Heinzz, я хочу получить не только статический (внешний) адрес но и локальный тоже.
Извиняюсь за дотошность , но с ListView1 я пока не очень дружу. Можно сделать пример именно по моему коду , а точнее по моему прикрепленному проекту.

Для более точно картины вот что мне выдавало при использование GetHostByName в ListView1:
1)85.29.158.67 (статический (внешний) адрес)
2)10.119.271.234 (локальный)

а вот что выдает при использование GetHostEntry:
1)fe84::f6:1с6a:aaea:58c4%14
2)2003:5617:a74c::5245:a73d
3)85.29.158.67 (статический (внешний) адрес)
4)10.119.271.234 (локальный)
5)2002:0:5ed6:84fd:f7:1d7a:aaea:59c4

Цитата(Pilger @  9.10.2010,  02:03 Найти цитируемый пост)
Добавь переменную Integer и увеличивай каждый раз на 1.

Можешь по моему прикрепленному проекту сделать пример , если не сложно.

Автор: Pilger 9.10.2010, 04:29
Цитата
Heinzz, я хочу получить не только статический (внешний) адрес но и локальный тоже.

Не каждый напрямую связан с интернетом. Например мой компьютер моего внешнего ай пи не знает, ибо я через рутер сижу.
Цитата
а вот что выдает при использование GetHostEntry

Ты можешь вытащить из IP.AddressList любое значение.
Код

IP.AddressList(0)

А если уж очень хочется, то и GetHostByName никто использовать не запрещает.
Цитата
Можешь по моему прикрепленному проекту сделать пример , если не сложно.

Объявляешь новую переменную Integer перед циклом. И в цикле увеличиваешь значение на 1. "0" меняешь на переменную.

Автор: DENSHER 9.10.2010, 07:52
Pilger , переменную я объявил но никак не могу в цикле увеличить значение на один. Уж прости за назойливость , но чего-то с этим ListView у меня не вяжется. Хотя до этого решал куда серьезнее проблемы , а здесь с нумерацией в тупике ( жесть.

Вот цикл:
Код

Dim num As Integer
        For Each myIP As System.Net.IPAddress In IP.AddressList
            Dim colIps As ListViewItem = ListView1.Items.Add(num) ' Не знаю как вывести нумерацию строчек.
            colIps.SubItems.Add(myIP.ToString)
        Next

Переменная объявлена , но как в цикле увеличиваешь значение на 1?

Автор: Pilger 9.10.2010, 15:32
Код

num += 1

А можно просто ListView1.Items.Сount.

Автор: Heinzz 9.10.2010, 21:23
Только count никаких циклов не надо.
Очень удобно унаследоваться от оригинального ListView и расширить функционал методами добавления, удаления, редактирования записи и сортировки (см. пример выше).
Еще важный момент использовать рефлексию для автоматического считывания названий свойств отображаемых объектов. Ну это чтобы получившийся  контрол был универсальным, вдруг через какое-то время решите поля поменять

Автор: Pilger 9.10.2010, 23:02
Цитата
Очень удобно унаследоваться от оригинального ListView и расширить функционал методами добавления, удаления, редактирования записи и сортировки (см. пример выше).

Вряд ли он это умеет^^.
Цитата
Можно сделать пример именно по моему коду , а точнее по моему прикрепленному проекту.

Автор: DENSHER 10.10.2010, 02:46
Цитата(Pilger @  9.10.2010,  23:02 Найти цитируемый пост)
Вряд ли он это умеет^^.

Да , этого я точно не умею! Опять хочу вернуться к своим баранам. Чего-то у меня не получается не как сделать нумерацию. Это жесть какая-та ((
Pilger , сделай пожалуйста пример кодом. Поскольку я видно еще настолько новичок в этом , что не могу никак это сделать сам. Читал , читал... но так чего-то и не понял... (

Автор: Pilger 10.10.2010, 04:09
Программа выполняет код в цикле n'ное количество раз. В твоем случае в зависимости от количества элементов в AddressList. То есть для каждого элемента она один раз проходит через цикл. Логично, что если ты объявишь переменную до цикла:
Код
Dim num As Integer = 0

, а в конце каждого прохода через цикл будешь увеличивать значение на один больше:
Код
num = num + 1

, то на момент каждого захода в цикл твоя переменная будет на один больше, чем в предыдущем заходе. И соответственно на момент добавления в ListView1 она будет на один больше, чем при предыдущем добавлении. И теперь можно чисто логически понять, куда это значение стоит всунуть.

Еще есть другой путь. У ListView1.Items есть свойство Count, которое возвращает текущее количество строк в ListView. То есть если ты напишешь:
Код
ListView1.Items.Count

,то ты узнаешь, сколько там строк. Зная количество строк думаю ты сразу сообразишь, какой номер будет у следующей строки. И точно так же чисто логически сообразишь, куда его всунуть.
Код
Pilger , сделай пожалуйста пример кодом.

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

Автор: DENSHER 10.10.2010, 15:30
Pilger , видно все же я не понимаю что-то или что-то не правильно делаю. Возможно я уперся в неправильно направлении. Поскольку я все что не пытался сделать у меня в колонке номера получается: либо 0 , либо пишет False.
Спасибо тебе огромно за посты разъяснения , но видно что-то недопонимаю я.

Автор: Pilger 10.10.2010, 20:56
Код

         For Each myIP As IPAddress In IP.AddressList
            ListView1.Items.Add(New ListViewItem({ListView1.Items.Count, myIP.ToString}))
        Next


Код

        Dim AdressList As IPAddress() = IP.AddressList
        For i As Integer = 0 To AdressList.Count - 1
            ListView1.Items.Add(New ListViewItem({i, AdressList(i).ToString}))
        Next


Код

        Dim num As Integer = 0
        For Each myIP As IPAddress In IP.AddressList
            ListView1.Items.Add(New ListViewItem({num, myIP.ToString}))
            num += 1
        Next


Или как ты делал
Код

        For Each myIP As System.Net.IPAddress In IP.AddressList
            Dim colIps As ListViewItem = ListView1.Items.Add(...) ' ListView1.Items.Count или Num
            colIps.SubItems.Add(myIP.ToString)
        Next

Автор: DENSHER 10.10.2010, 23:35
Pilger , благодарю тебя за разъяснительные посты , примеры и твое терпение. Только по твоим примерам я понял свою ошибку. Вот что я делал когда писало False:
Код

Dim num As Integer = 0
        For Each myIP As System.Net.IPAddress In IP.AddressList
            ListView1.Items.Add(New ListViewItem({num = num + 1, myIP.ToString}))
        Next

При этом примере писало 0:
Код

Dim num As Integer = 0
        For Each myIP As System.Net.IPAddress In IP.AddressList
            ListView1.Items.Add(New ListViewItem({num, myIP.ToString}))
        Next

Глупо выглядит , но я уперся в этот вариант как баран. Еще раз спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)