2015-08-07 8 views
4

Итак, у меня есть этот код ниже. Я нашел предварительный пост и работал отсюда. Но по какой-то причине он не перебирает и не обновляет ячейки с ответом. Он обновляет только последний ip в списке.C# Windows Forms ping.SendAync проблемы с DataGridView

private static void ping_PingCompleted(object sender, PingCompletedEventArgs e) 
{ 
    var reply = e.Reply; 
    DataGridViewRow row = e.UserState as DataGridViewRow; 
    DataGridViewCell PingStat = row.Cells["cPing"]; 
    if (!(reply == null)) 
    { 
     switch (reply.Status) 
     { 
      case IPStatus.Success: 
       PingStat.Value = string.Format("Reply from {0}: bytes={1} time={2}ms TTL={3}", reply.Address, reply.Buffer.Length, reply.RoundtripTime, reply.Options.Ttl); 
       break; 
      case IPStatus.TimedOut: 
       PingStat.Value = "Connection has timed out..."; 
       break; 
      default: 
       PingStat.Value = string.Format("Ping failed: {0}", reply.Status.ToString()); 
       break; 
     } 
    } 
} 


private void bPing_Click(object sender, EventArgs e) 
{ 
    String ip; 
    Ping ping = new Ping(); 
    foreach (DataGridViewRow row in dgvData.Rows) 
    { 
     if(!row.IsNewRow) 
     { 
      ip = row.Cells["cIPAddress"].Value.ToString(); 

      ping.PingCompleted += new PingCompletedEventHandler(ping_PingCompleted); 

      ping.SendAsync(ip, 1000, row); 

      System.Threading.Thread.Sleep(5); 
     } 
    } 
} 

Что я делаю неправильно? Я думал, добавив строку в ping.SendAsync, она будет отслеживать все ответы на соответствующие ip/row?

ОБНОВЛЕНО код Я работаю с

 private static void ping_PingCompleted(object sender, PingCompletedEventArgs e) 
    { 
     var reply = e.Reply; 
     DataGridViewRow row = e.UserState as DataGridViewRow; 
     DataGridViewCell PingStat = row.Cells["cPing"]; 
     if (reply != null) 
     { 
      switch (reply.Status) 
      { 
       case IPStatus.Success: 
        PingStat.Value = string.Format("Reply from {0}: bytes={1} time={2}ms TTL={3}", reply.Address, reply.Buffer.Length, reply.RoundtripTime, reply.Options.Ttl); 
        break; 
       case IPStatus.TimedOut: 
        PingStat.Value = "Connection has timed out..."; 
        break; 
       default: 
        PingStat.Value = string.Format("Ping failed: {0}", reply.Status.ToString()); 
        break; 
      } 
     } 
    } 
    private void bPing_Click(object sender, EventArgs e) 
    { 
     foreach (DataGridViewRow row in dgvData.Rows) 
     { 
      if (!row.IsNewRow) 
      { 
       Debug.WriteLine("Rows"); 
       String ip; 
       Ping ping = new Ping(); 
       ip = row.Cells["cIPAddress"].Value.ToString(); 
       ping.PingCompleted += new PingCompletedEventHandler(ping_PingCompleted); 

       ping.SendAsync(ip, 1000, row); 

       System.Threading.Thread.Sleep(5); 
      } 
     } 
    } 
+1

Что делать, если вы создаете новые экземпляры 'Ping' для каждой строки? –

+0

Позвольте мне сделать это снимок –

+0

Я сделал то, что предложил Макс фон Хиппель, и все еще нет. –

ответ

1

Я думаю, что проблема в том, что у вас есть один Ping и один IP и они продолжать получать сброс до последней строки. Если вы переместите эти vars в цикл foreach, каждая строка в DataGridView будет иметь свой «собственный» Ping и ip, и поэтому у вас не будет проблемы с каждой строкой, эффективно отменяющей предыдущую.

private void bPing_Click(object sender, EventArgs e) 
{ 
    foreach (DataGridViewRow row in dgvData.Rows) 
    { 
     if(!row.IsNewRow) 
     { 
      String ip; 
      Ping ping = new Ping(); 
      ip = row.Cells["cIPAddress"].Value.ToString(); 
      ping.PingCompleted += new PingCompletedEventHandler(ping_PingCompleted); 

      ping.SendAsync(ip, 1000, row); 

      System.Threading.Thread.Sleep(5); 
     } 
    } 
} 

Кроме того, я не знаком с «Ping», но вы можете увидеть, если это необходимо утилизировать или положить его в Использование цикла.

Также нет необходимости бросать строку в строку.

+0

Пошел прямо над моей головой. Я обязательно сделаю это и посмотрю, что произойдет. –

+0

Не беспокойтесь! Если это не поможет, дайте мне знать, и я придумаю лучший ответ. Haha –

+1

К сожалению, это не проблема. Или, по крайней мере, не единственный. Он по-прежнему дает одни и те же результаты только для заполнения информации для последнего ip в моем datagridview. –

0

Что об этом:

private void bPing_Click(object sender, EventArgs e) { 
    foreach (DataGridViewRow row in dgvData.Rows) { 
     try { 
      Ping pinger = new Ping(); 
      PingReply reply = await pinger.SendPingAsync(row.Cells["cIPAddress"].Value.ToString(),1000); 
      switch (reply.Status) { 
       // do your stuff here 
      } 
     } catch (PingException) { 
      // Handle exception here 
     } 
    } 
} 
+0

Это дает те же результаты. Кажется, что пинг проходит через код для всех. Но только последний ip в списке фактически возвращает нечто отличное от нуля –

Смежные вопросы