C# WinForm:
 程序里另开的一个线程去修改主窗体上的控件的属性或使用他的方法  在主窗体的类下写个委托 再指定其调用方法  然后在线程里用这个方法就行了;
 我的问题是:另开的线程要去修改主窗体上的控件(注:这个不是.net自带的那些常用控件,而是第三方的控件,是个dll,但是我有dll的源码)
 请问如何让这个线程去修改窗体上的这个自定义的控件。谢谢,请详加说明。

解决方案 »

  1.   

      private void setText(String text)
            {
                if (this.textBox1.InvokeRequired)
                {
                    setTextCallBack b = new setTextCallBack(setText);
                    this.Invoke(b, new object[] { text });
                }
                else
                {
                    this.textBox1.Text = text;
                }
            }线程如果在主窗体里,直接写  setText(....)
    因为多个线程与窗体控件交互,有冲突,所以要这样写 ,关键点 
    InvokeRequired
     setTextCallBack b = new setTextCallBack(setText);
                    this.Invoke(b, new object[] { text });
      

  2.   

    是的呀  上面的仁兄,我就是按照那样写   而且能够修改窗体上的东西  除了那个用户控件
      我说下我的具体情况吧,是这样子的:
      我在联系System.Runtime.Remoting
      在窗体上  我订阅了一个远程对象的事件,在这个事件体里我要去修改用户控件离的listview  
      事件一点问题都没有的  我作过试验  在这个事件体里修改窗体的东西一点问题都没  但就是用户控件不行呐 
      
      

  3.   

    修改控件还是修改控件的属性?
    修改控件的属性和你的有无dll源码没关系的,直接可以像一般的控件那样使用
      

  4.   

    就是将用户控件里的listview里的item清理掉
      

  5.   

    MethodInvoker mi = new MethodInvoker(FormShow);
                        prform.BeginInvoke(mi); private void FormShow() 
            {
                switch (re_message)
                {prform......
                               }
            }
     //主窗体
            public Form PRForm
            {
                get {
                    return prform;
                }
                set {
                    prform = value;
                }
            }
      

  6.   

    在其他线程中使用BeginInvoke()
      

  7.   

    你看一下这个例子,是修改主线线程的一个grid的DataSource 属性的,也是修改第三方控件的
            delegate void UpdateGridDelegate(UltraGrid grid, DataTable table);
            void UpdateGrid(UltraGrid grid, DataTable table)
            {
                if (InvokeRequired)
                {
                    Invoke(new UpdateGridDelegate(UpdateGrid), grid, table);
                    return;
                }
                grid.DataSource = null;
                grid.DataSource = table;
            }
            void FilterRun()\\ 线程执行的方法
            {
                DataSet ds = new DataSet();
                for (int i = 0; i < excelDataSet.Tables.Count; i++)
                {
                    DataTable dt = SqlBulkfilter(excelDataSet.Tables[i], "TempTable" + i);
                    UpdateGrid(uGrid[i], dt);
                    ds.Tables.Add(dt);
                }
                excelDataSet = ds;
                Export(ds);
                bFilterProgress = true;
            }