2017-01-27 20 views
1

Ниже приведена кнопка, при нажатии она вызывает функцию, которая связывает множество IP-адресов. Если IP-адрес возвращает ответ, он добавляет IP-адрес в output_networkSearch.Text.Изменение Textbox.text в рамках метода; Для цикла, не связанного с циклом из-за возврата

private void button_networkSearch_Click(object sender, RoutedEventArgs e) 
    { 
     output_networkSearch.Text = networkSearch(Convert.ToInt32(input_searchLimit.Text)); 

    } 

Ниже представлен не весь метод, а только та часть, с которой я не могу работать. Цикл for начинается с любой последней цифры на IP-адресе шлюза пользователей по умолчанию и останавливается на любом лимите, который они ввели (1 - 255).

// я равен последней цифре в шлюз по умолчанию IP, если он был 192.168.0.1, то я = 1.

for (int i = Convert.ToInt32(splitGatewayIP[3]); i <= searchLimit; i = i + 1) 
        { 
         // If the method receieves a ping reply... 
         if (PingHostSweep(gatewayIPRebuild + i)) 
         { 
          // Returns 192.168.0. + i + ACTIVE 
          string response = gatewayIPRebuild + i + " ACTIVE"; 

          return response; 
         } 
         else 
         { 
          string response = gatewayIPRebuild + i + " CLOSED"; 

          return response; 

         } 
        } 

Это работало на консольное приложение, но для приложения WPF кажется для запуска цикла через один раз и остановки из-за оператора return.

Моя идея обойти это было бы, чтобы удалить операторы Return Response и попробовать и получить доступ к TextBox (output_networkSearch) напрямую.

Так что я хотел бы сделать что-то вроде:

for (int i = Convert.ToInt32(splitGatewayIP[3]); i <= searchLimit; i = i + 1) 
        { 
         // If the method receieves a ping reply... 
         if (PingHostSweep(gatewayIPRebuild + i)) 
         { 
          // Returns 192.168.0. + i + ACTIVE 
          string response = gatewayIPRebuild + i + " ACTIVE"; 

          output_networkSearch.Text = reponse; 
         } 
         else 
         { 
          string response = gatewayIPRebuild + i + " CLOSED"; 

          output_networkSearch.Text = reponse; 

         } 
        } 

ОДНАКО, я не могу получить доступ к текстовому полю в рамках метода по некоторым причинам. Я только начал изучать C#, поэтому я не совсем понял, как это работает.

Вот изображение частично работающей концепции. Как вы можете видеть, предел установлен на 10, поэтому он должен ping IP-адреса с 1 по 10 и дать ответ ACTIVE или CLOSED. Это действительно работало в моей версии консольного приложения.

WPF version

Console version

+0

Я бы изменил метод, чтобы вместо «return response» «Я бы добавил успешный IP-адрес к строке. затем в конце цикла for верните строку. то вы можете обновить текстовое поле этой строкой в ​​соответствии с нормальным. Нижняя сторона этого заключается в том, что текстовое поле обновляется только после того, как все IP-адреса были отсканированы, а не постоянное обновление. – meganaut

ответ

0

Это может сделать трюк для вас

List<string> responses = new List<string>(); 
string response; 
for (int i = Convert.ToInt32(splitGatewayIP[3]); i <= searchLimit; i = i + 1) 
{ 
    if (PingHostSweep(gatewayIPRebuild + i)) 
    { 
     response = gatewayIPRebuild + i + " ACTIVE"; 
    } 
    else 
    { 
     response = gatewayIPRebuild + i + " CLOSED"; 
    } 
    responses.Add(response) 
} 

Теперь после цикла списка, который является responses бы список всех IP-адресов, которые являются активными и закрытыми , Как и в консольном приложении.

+0

Да! это сработало. Единственным недостатком является то, что он сначала проверяет все IP-адреса, а затем обновляет текстовое поле. Поэтому, если есть несколько IP-адресов для проверки, это занимает некоторое время. Я закончил его возвратом 'string.Join (" \ n ", answers.ToArray());', чтобы вернуть список. http://i.imgur.com/yD0I6Uz.jpg – Ari

0

Я думаю, что вам нужно использовать threading, необходимо выполнить много потоковой обработки дочерних элементов в бэкэнд для сканирования, когда они завершат их работу, а затем ответьте результат на MainForm, поэтому я напишу код, который может вам помочь!

using System.Threading; 
using System.Threading.Tasks; 


     public void Start(string ip) 
     { 
      Task.Factory.StartNew(() => 
      { 
       // If the method receieves a ping reply... 
       string response; 
       if (PingHostSweep(ip)) 
       { 
        // Returns 192.168.0. + i + ACTIVE 
        response = ip + " ACTIVE"; 
       } 
       else 
       { 
        response = ip + " CLOSED"; 
       } 
       this.Invoke((MethodInvoker)(() => { textBox1.AppendText("\r\n" + response); })); 

      }); 
     } 


     private void button1_Click(object sender, EventArgs e) 
     { 

      for (int i = 1; i <= 255; i++) 
      { 
       Start(String.Format("192.168.100.{0}", i)); 
      } 
     } 
0

Предыдущий ответ был правильным (хотя он не касался более продвинутой степени, что вы будете в конечном счете, необходимо узнать ... делегирования и призывание ... долгая история ... не буду утомлять вас Теперь).

То, что вы написали перегоняется к этому:

// SIDE Примечание: вы не можете на самом деле относиться к IPv4-адрес в виде четырех «чистых» каре (но это не ваш вопрос)

var notNecessarilyAHost = splitGatewayIP[3]; 
var searchStart = Convert.ToInt32(notNecessarilyAHost); 
for (var i = searchStart; i <= searchLimit; ++i) 
{ 
    if (PingHostSweep(gatewayIPRebuild + i)) 
    { 
     return $"{gatewayIPRebuild}{i} ACTIVE"; 
    } 
    else 
    { 
     return $"{gatewayIPRebuild}{i} CLOSED"; 
    } 
} 

... и если вы (мысленно) перейдете к тому, что вы написали, достаточно просто понять, что цикл будет когда-либо циклично. При входе в цикл я будет равен любому запросу searchStart. Затем вы вводите тест if. Если этот тест верен, вы попадаете в истинную сторону ветки (т. Е. «... АКТИВНО»).В противном случае вы перейдете в другую ветку (т. Е. «... ЗАКРЫТЬ». ИЗ ТЕМ ...

Вы ВСЕГДА возвращаетесь. Это выйдет из цикла (и функции, которая содержит его). «break» и «return» (и правдоподобно goto ... но это на другой день) ВСЕГДА выйдут из текущей области (область является блоком кода, завернутым '{' и '}' (be они явно или неявно написано).

После?

предыдущий ответ был правильным. Он регулирует свой код так, чтобы петля добавляет строка, которую вы пишете с каждой итерации в виде списка строк. Тогда, когда вы выходите из цикла (потому что я достигаю searchLimit), что список строки будут содержать N много, ну, строк. Вероятно, вы хотите вернуться или продолжить работу.

Все, что сказано, вы не можете (технически вы можете, но НЕ ДОЛЖНЫ) делать что-либо из этого в потоке пользовательского интерфейса. Если вы это сделаете, пользовательский интерфейс заблокирует (и станет на 100% не отвечать на запросы пользователя) во время цикла (и вызовы сети, которые он запускает) и т. Д.

+0

Вот что я заметил, он блокируется при выполнении цикла. Это все просто поиграть, поскольку я только недавно взял C#. Но спасибо за ответ, потому что это, очевидно, что-то мне нужно будет понять и узнать позже. – Ari

+0

Я думал, что нужно обновить текст, но я не знаю, почему я не могу получить доступ к текстовому блоку внутри моего метода. – Ari