2011-01-20 58 views
1

我有一个线程运行在需要更新文本框的值的类中,但调用不会出现在类中。在C#winforms中的类中调用

任何想法如何做到这一点?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading; 
using System.Text.RegularExpressions; 
using System.Windows.Forms; 
using System.IO; 
using CheckedBoxSerpCrawler; 
namespace SERP_Crawler 
{ 
    class Crawl 
    { 
     public Crawl() 
     {    

     var t = new Thread(() => 
       { 
       for (int i = 2; i < (pagesToScroll/10); i++) 
        { 
         //Here i need to invoke CheckUrlList 
        } 
       }); 
     t.SetApartmentState(ApartmentState.STA); 
     t.Start();   

     }//End Constructor 
    private void CheckUrlList(object sender, EventArgs e) 
    { 
     //Here update textbox 
    } 
} 
} 
+1

它是什么类型的?一个用户控件/表单? – WraithNath 2011-01-20 13:28:11

+0

我们真的需要更多的信息,你的问题到底是什么等等 - 也许你甚至想向我们展示一些代码? – basti 2011-01-20 13:39:16

回答

1

智能感知显示这没有任何问题。我不知道你有什么问题?

 TextBox test = new TextBox(); 
     if (test.InvokeRequired) 
     { 
      test.BeginInvoke(...); 
     } 

提到应该工作上面,也许你应该看看http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired.aspx

编辑:为了澄清一些事情 - test在这里您文本框,其值应该被改变。如果您无法访问课程中的TextBox,那么我喜欢使用事件在您的gui-control-class中启动一个方法。但这是另一回事;)

1

您需要调用文本框上的Invoke,而不是要更新文本框的类。如果您查看documentation进行调用:

在拥有控件底层窗口句柄的线程上执行指定的委托。

然后你可以看到它是文本框运行的线程,这很重要。

0

大概这个文本框是在一个窗体上,所以添加一个方法到以字符串作为参数的窗体上,然后在这个方法内使用Invoke来设置文本框的值。在你的课堂内部,在表单上调用这个方法。

0

如果您希望您的班级提供某种通知机制,您真正需要的是事件,而不是直接更新UI。在WinForms应用程序的上下文中,您可以从您的表单处理处理此事件,并在此处执行任何Invoke/BeginInvoke工作。

希望这是有道理的。如果没有,请尝试查找.NET事件以了解它们的工作方式。

但通过一切手段,让你的班级与你的用户界面分离。我不确定为什么有人会鼓励在相反的方向采取行动。