2017-01-27 2 views
1

Ci-dessous un bouton, lorsqu'il est pressé, il appelle une fonction qui pings un tas d'adresses IP. Si l'adresse IP renvoie une réponse, elle ajoute l'adresse IP à output_networkSearch.Text.Modification de Textbox.text dans une méthode; Pour boucle non en boucle en raison de Retour

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

    } 

Ci-dessous n'est pas la méthode entière, juste la partie que je ne peux pas obtenir de travailler. La boucle for commence quel que soit le dernier chiffre de l'adresse IP de la passerelle par défaut de l'utilisateur et s'arrête à la limite autorisée (1 - 255).

// i est égal au dernier chiffre de la passerelle par défaut IP, si elle était 192.168.0.1 alors i = 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; 

         } 
        } 

Cela a fonctionné sur une application de la console, mais pour une application WPF il semble pour parcourir la boucle une fois et arrêter en raison de la déclaration de retour.

Mon idée pour contourner ce problème serait de supprimer les instructions de réponse de retour et essayer d'accéder directement au TextBox (output_networkSearch).

Je ferais quelque chose comme:

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; 

         } 
        } 

Cependant, je ne peux pas accéder à la zone de texte dans la méthode pour une raison quelconque. Je viens juste de commencer à apprendre C#, donc je ne suis pas entièrement familier avec le fonctionnement.

Voici une image d'un concept partiellement fonctionnel. Comme vous pouvez le voir, la limite est fixée à 10, donc elle doit pinguer les adresses IP 1 à 10 et donner une réponse ACTIVE ou FERMÉE. Cela a fonctionné dans ma version d'application de console.

WPF version

Console version

+0

Je modifierais la méthode pour qu'au lieu de "retour réponse" "Je voudrais ajouter l'adresse IP réussie à une chaîne. puis à la fin de la boucle for, renvoyez la chaîne. alors vous pouvez mettre à jour la zone de texte avec cette chaîne comme d'habitude. L'inconvénient de ceci est que la zone de texte n'est mise à jour qu'une fois toutes les adresses IP envoyées, plutôt qu'une mise à jour continue. – meganaut

Répondre

0

Cela pourrait faire l'affaire pour vous

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) 
} 

Maintenant, après la boucle la liste qui est responses aurait la liste de toutes les adresses IP qui sont actives et fermées . Comme la façon dont vous l'avez fait dans l'application console.

+0

Oui! cela a fonctionné. Le seul inconvénient est qu'il vérifie d'abord toutes les adresses IP puis met à jour la zone de texte. Donc, s'il y a quelques adresses IP à vérifier, cela prend un certain temps. Je l'ai terminé avec return 'string.Join (" \ n ", responses.ToArray());' pour retourner une liste. http://i.imgur.com/yD0I6Uz.jpg – Ari

0

Je pense que vous avez besoin d'utiliser threading, il y a besoin de beaucoup de threads de travail en backend pour balayer, quand ils finissent de travailler puis de répondre au résultat MainForm, donc j'écris du code espoir peut vous aider!

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

La réponse précédente était correcte (même si elle n'a pas touché à un point plus avancé que vous aurez besoin d'apprendre en fin de compte ... la délégation et l'invocation ... longue histoire ... ne sera pas vous ennuyer à présent).

Qu'est-ce que vous avez écrit distille à ceci:

// SIDE REMARQUE: vous ne pouvez pas traiter réellement une adresse IPv4 en quatre quadriceps "purs" (mais ce n'est pas votre question)

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"; 
    } 
} 

... et si vous (mentalement) suivez ce que vous avez écrit, il est assez simple de voir que la boucle ne cycle qu'une seule fois. À l'entrée de la boucle, je serai à égalité avec searchStart. Ensuite, vous entrez le test if. Si ce test est vrai, vous tombez dans le vrai côté de la branche (c'est-à-dire, "... ACTIVE").Sinon, vous allez tomber dans la branche else (c'est-à-dire, "... FERMÉ".)

Vous revenez TOUJOURS, cela quittera la boucle (et la fonction qui la contient). "break" et "return" (et vraisemblablement goto ... mais c'est pour un jour différent) quitteront TOUJOURS la portée actuelle (scope étant un bloc de code enveloppé par '{' et '}' (be ils suivants?

explicitement ou implicitement écrit).

la réponse précédente était correcte. Il ajuste votre code afin que la boucle ajoute la chaîne que vous composez à chaque itération à une liste de chaînes. Puis, quand vous quittez la boucle (parce que j'atteins searchLimit) cette liste de les chaînes contiendront N beaucoup, eh bien, les chaînes. Vous voulez probablement retourner ou continuer à travailler cela. Tout ce qui a été dit, vous ne pouvez pas (techniquement vous pouvez mais vous ne devriez pas) faire tout cela dans un fil d'interface utilisateur. Si vous le faites, l'interface utilisateur bloquera (et ne répondra plus à 100% à l'utilisateur) pendant que la boucle s'exécute (et les appels réseau qu'elle exécute), etc.

+0

C'est ce que j'ai remarqué, il se bloque pendant l'exécution de la boucle. Tout cela joue juste parce que je viens juste de ramasser C# récemment. Mais merci pour la réponse car c'est évidemment quelque chose que je devrai réaliser et apprendre plus tard. – Ari

+0

Ma pensée était de mettre à jour le texte mais je ne sais pas pourquoi je ne peux pas accéder au bloc de texte à l'intérieur de ma méthode. – Ari