从C#中的线程调用表单控件

时间:2011-10-12 10:15:42

标签: c# multithreading

我现在陷入了严重的问题。 Plz帮助我....

我创建了一个FORM调用form1。它包含一个文本框T1。我开始跑... 在form1中有一个运行的线程,它执行一些进程P,它是另一个CLASS的成员,它调用class2。 要运行进程P,我需要来自文本框T1的值。我该怎么做?

让我告诉你,我已经尝试过了。 我在class2中创建了form1的实例,然后尝试读取textbox(T1)值。但那是空的,我想出了理由......休息,我尝试了财产......再次失败......

PLZ帮我解决这个问题。我被困了几个小时......

3 个答案:

答案 0 :(得分:1)

这只是一个指向正确方向的例子。如在另一个答案中所提到的,您可能必须调用以防止跨线程异常。

在名为 FORM 的类中添加方法或属性:

public string GetTextboxContent()
{
    return textbox.Text;
}

class2 更改为以下内容:

class class2
{
    private MyForm m_form;

    public class2(MyForm form)
    {
        m_form = form;
    }

    public void DoThreadStuff()
    {
        string value = m_form.GetTextboxContent();
    }
}

你说“我在class2中创建了form1的实例,然后尝试读取textbox(T1)值。但这是空的”:不要创建新实例:将现有实例传递给 class2

答案 1 :(得分:0)

    Assuming Class1 is the class which does some process in thread. Create the property which corresponds to type of your main form. In this case, its called Form1. 



     class Class1
        {
    //his is the property
            public Form1 MyMainForm { get; set; }

            public  void    ShowText()
            {

//here the control is accesses 
//((TextBox)MyMainForm.Controls.Find("textBox1",true)[0])
                MessageBox.Show(((TextBox)MyMainForm.Controls.Find("textBox1",true)[0]).Text);
            }
        }

    im assuming ShowText() method is called on new thread, when button is clicked.

     private void button1_Click(object sender, EventArgs e)
            {
    //craete instance of class1
                Class1 c = new Class1();
    //set the  property            
    c.MyMainForm = this;
    //start the method is new thread
                ThreadStart ts=new ThreadStart(c.ShowText);
                Thread t=new Thread(ts);
                t.Start();
            }

答案 2 :(得分:0)

试试这个..

你上课..

ClassText
{
   YourClass(String textVAlue)
   {
   }
 }

你的表格..

ClassText ct = new ClassText();
ct.YourClass(Textbox1.text);