2011-12-20 41 views
0

您好我正在使用HtmlAgilityPack从Web上使用c#中的一些数据。这里是代码:C#如何在文本框中逐个显示可用数据

private void button1_Click(object sender, EventArgs e) 
    { 
     var url = this.textBox1.Text; 
     var webGet = new HtmlWeb(); 
     var document = webGet.Load(url); 

     var metaTags = document.DocumentNode.SelectNodes("//meta"); 
     if (metaTags != null) 
     { 
      foreach (var tag in metaTags) 
      { 
       var name = tag.Attributes["name"].Value; 
       var content = tag.Attributes["content"].Value; 

       this.textBox2.Text = name + " : " + content; 
      } 
     } 
    } 

它从文本框1获取链接并显示输出到文本框2。它显示最后可用的数据。我可以拼接可用数据,但它会一次显示所有数据。其实我想显示一个数据,当其他人正在处理,以便用户可以实现报废进度。有谁可以请帮忙?

+0

你的意思是'textBox2'只显示最后一个'name:content',但是你想一次一个地显示它们一个延迟? – user807566 2011-12-20 16:37:41

+0

是的。我想要 – qmaruf 2011-12-20 16:45:30

回答

0

假设你的代码的前半部分是正确的,这个显示数据一个接一个。很可能,foreach循环执行得太快,您无法注意到“一个一个”的效果。

如果您需要将每个结果显示足够长以供某人阅读,则可以应用人为延迟。也许与Timer或类似的东西。

另一种方法是使用多行文本框(例如RichTextBox)并将每个结果放在新行上。或者一个ComboBox,这将不占用更多的空间。这些选项允许您保存数据,而不必覆盖它。

+0

Thread.Sleep(1000);不管用 。当我使用“this.textBox2.Text = name +”:“+ content +”\ r \ n“;它覆盖了以前的textbox2数据,这不是我想要的。 – qmaruf 2011-12-20 16:58:58

+0

@qmaruf如果你不想覆盖,你将不得不使用'this.textBox2.Text = this.textBox2.Text + name +“:”+ content;'你每次使用'='符号重新分配'this.textBox2.Text'的值。 此外,Thread.Sleep()有什么问题? – user807566 2011-12-20 18:24:47

0

您可以使用Timer控件来延迟循环中下一个值的显示。

您也可以使用BackgroundWorker来完成此操作。但是这会增加代码的复杂性。请看看Beginners Guide to Threading in .NET: Part 5

或者你可以使用Thread.Sleep(xx),它会延迟你指定的毫秒执行。

Thread.Sleep(2000); 
    this.textBox2.Text += name + " : " + content + Environment.NewLine; 
+0

没有任何简单的方法可以做到这一点?? – qmaruf 2011-12-20 17:14:12

+0

使用thread.sleep会导致当前线程的执行延迟几毫秒。检查更新后的答案 – 2011-12-20 17:56:55

+0

Thread.sleep(XX)只是延迟了最终输出,所有数据一次显示在一起。 – qmaruf 2011-12-21 10:33:59

相关问题