Как использовать Ping.SendAsync для работы с datagridview? - PullRequest
0 голосов
/ 17 марта 2012

У меня есть приложение, которое проверяет каждый IP в сетке данных, чтобы составить список адаптивных IP-адресов RoundtripTime. Когда я завершу этот шаг, я верну RoundtripTime обратно в сетку данных.хотите использовать DataGridViewRow row = this.current_row; для получения текущей строки, но я просто получаю сообщение об ошибке Ключевое слово 'this' недоступно в static function.so, как вернуть значение обратно в datagridview?

Спасибо.*

Ответы [ 2 ]

0 голосов
/ 17 марта 2012

Что сказал KAJ. Но есть вероятность перепутать результаты ping-запросов, потому что они не связаны с ip-адресами в сетке. Невозможно сказать, какой хост ответит первым, и если пинг> 5 мс, может произойти все что угодно, потому что между обратными вызовами меняется текущая строка. Что вам нужно сделать, это отправить ссылку на datagridviewrow для обратного вызова. Для этого используйте перегрузку SendAsync:

ping.SendAsync(ip, 1000, row);

И в обратном вызове:

DataGridViewRow row = e.UserState as DataGridViewRow;

Возможно, вы также захотите проверить ответ. Статус, чтобы убедиться, что время запроса не истекло.

0 голосов
/ 17 марта 2012

this относится к текущему экземпляру. Статический метод не против экземпляра, а только против типа. Так что this нет в наличии.

Так что вам нужно удалить ключевое слово static из объявления обработчика события. Тогда метод будет против экземпляра.

Вам также может понадобиться перенести код обратно в поток пользовательского интерфейса, прежде чем пытаться обновить представление таблицы данных - если это так, то вам потребуется код, подобный следующему:

delegate void UpdateGridThreadHandler(Reply reply);

private void ping_PingCompleted(object sender, PingCompletedEventArgs e)
{
    UpdateGridWithReply(e.Reply);
}

private void UpdateGridWithReply(Reply reply)
{
    if (dataGridView1.InvokeRequired)
    {
        UpdateGridThreadHandler handler = UpdateGridWithReply;
        dataGridView1.BeginInvoke(handler, table);
    }
    else
    {
        DataGridViewRow row = this.current_row; 
        DataGridViewCell speed_cell = row.Cells["speed"];
        speed_cell.Value = reply.RoundtripTime;
    }
}
...