2011-07-05 69 views
3

我一直想弄清楚如何让我的文本框的文本或其他属性从一个后台工作。有人知道怎么做这个吗?我不能将它作为参数传递,因为它需要实时。谢谢您的帮助!来自后台工作者的文本框文本?

+1

也许一些代码。 – ata

+1

为什么你现在的代码不工作?你有例外吗?如果是的话,什么样的? – svick

+0

你是什么意思的“从背后”? –

回答

5

我认为你只是需要调用属性(伪代码):

private void bgw1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    // looping through stuff 
    { 
    this.Invoke(new MethodInvoker(delegate { Text = textBox1.Text; })); 
    } 
} 
+0

谢谢..我没有意识到这很简单。 – user556396

+5

我被压制,你没有提到异常*跨线程操作无效:控制从其创建的线程以外的线程访问。*在您的问题中。 – Bolu

2

使用ReportProgress方法和事件背景工人。这将切换到正确的线程为你。

1

我想你应该使用invoke方法。

这是我的例子。

delegate void myDelegate(string name); 
//... 
private void writeToTextbox(string fCounter) 
{ 
    if (this.InvokeRequired) 
    { 
     myDelegate textWriter = new myDelegate(displayFNums); 
     this.Invoke(textWriter, new object[] { fCounter }); 
    } 
    else 
    { 
     textbox1.Text = "Processing file: " + fileCounter + "of" + 100; 
    } 
} 
//... 

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    //... 
    writeToTextbox(fileCounter.ToString()); 
} 

在dowork我操纵一些文本文件,我通知用户有多少文件我已经处理到目前为止。

+0

用您的实际方法名称替换“displayFNums” “writeToTextbox” – dataCore

2

或者如果有必要在WPF:

private void bgWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    string text = null; 
    myTextBox.Dispatcher.Invoke(new Action(delegate() 
    { 
     text = myTextBox.Text; 
    })); 
}