2017-02-01 2 views
-1
private void button3_Click(object sender, EventArgs e) 
     { 
      Thread t = new Thread(
       () => textBox4.AppendText(getman(textBox3.Text))); 
      t.Start(); 


     } 

     List<string> getman(string url) 
     { 
      List<string> result = new List<string>(); 

      try 
      { 
       HttpWebRequest r = (HttpWebRequest)WebRequest.Create(url); 
       r.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0"; 
       r.Method = "GET"; 
       HttpWebResponse res = (HttpWebResponse)r.GetResponse(); 
       StreamReader sr = new StreamReader(res.GetResponseStream()); 
       string oku = sr.ReadToEnd(); 

       Regex regex = new Regex(textBox1.Text + "(.*?)" + textBox2.Text); 
       MatchCollection m = regex.Matches(oku); 
       foreach (Match match in m) 
       { 
        result.Add(match.Groups[1].ToString() + "\r\n"); 
       } 

       res.Close(); 
       sr.Close(); 

      } 
      catch { } 

      return result; 
     } 

Es gibt die folgenden Fehler:Wie kann ich den Wert für eine String-Liste zurückgeben?

  1. Fehler Die beste überladene Methode Match für 'System.Windows.Forms.TextBoxBase.AppendText (string)' hat einige ungültige Argumente

  2. Fehlerargument 1: kann nicht von 'System.Collections.Generic.List' zu 'string'

+2

Ihr Code wird sowieso nicht funktionieren, weil Sie nicht UI-Steuerelemente von einem anderen Thread bearbeiten können. –

+1

'getman' gibt eine Liste zurück, was erwartest du damit? – Sayse

Antwort

-1

konvertieren Wie MSDN sagt (https://msdn.microsoft.com/es-es/library/system.windows.forms.textboxbase.appendtext(v=vs.110).aspx) Append Methode hat keine Überlastung für List<string>, wie Sie versuchen zu tun. Das ist dein Hauptproblem.

Ich weiß nicht genau, was Sie mit diesem Code erreichen wollen, aber wenn Sie möchten, dass Ihr TextBox mit dem gefüllt wird, was Ihre Liste enthält, ist hier ein Beispiel, wie man es durch Kommas trennt:

string getman(string url) 
    { 
     List<string> result = new List<string>(); 

     try 
     { 
      HttpWebRequest r = (HttpWebRequest)WebRequest.Create(url); 
      r.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0"; 
      r.Method = "GET"; 
      HttpWebResponse res = (HttpWebResponse)r.GetResponse(); 
      StreamReader sr = new StreamReader(res.GetResponseStream()); 
      string oku = sr.ReadToEnd(); 

      Regex regex = new Regex(textBox1.Text + "(.*?)" + textBox2.Text); 
      MatchCollection m = regex.Matches(oku); 
      foreach (Match match in m) 
      { 
       result.Add(match.Groups[1].ToString() + "\r\n"); 
      } 

      res.Close(); 
      sr.Close(); 

     } 
     catch { } 

     return String.Join(",", result.ToArray()); 
    } 

Neben all dies, so scheint es, dass selbst wenn Ihr Code OK scheint, Sie Threading Arbeit Manipulation UI-Steuerelemente tun, die sicher in einem anderen Thread erstellt worden sind, da der Thread, in dem Sie accesing ihnen erklärt wird, genau da. Für Thema Sichere Anrufe an Ihre UI, überprüfen Sie dies:

https://msdn.microsoft.com/en-us/library/ms171728(v=vs.110).aspx

0

Sie müssen Schleife durch die Liste und fügen Sie jede Saite einzeln:

foreach(string line in getman(TextBox3.Text)) 
{ 
    TextBox4.AppendText(line); 
} 

Zusätzlich steuert pingelig denen fädelt Sie verwenden für dieses Zeug. Sie müssen wahrscheinlich das TextBox4-Steuerelement Invoke, bevor die Dinge wirklich ordnungsgemäß funktionieren.

+0

Danke. Ich habeCheckForIllegalCrossThreadCalls = false; in meiner Form laden und es funktioniert gut. Was ist daran falsch, wenn das auch funktioniert? –

+0

Die Einstellung 'CheckForIllegalCrossThreadCalls' auf' false' ** macht die Dinge nicht "gut"; Es verbirgt nur das Problem von dir. Wie bereits erwähnt, ist die richtige Methode 'Invoke()' zu verwenden. –

+0

Wo/wie kann ich die Aufrufmethode genau in diesem Code verwenden? –

Verwandte Themen