程序的主窗体mianform将会起一个后台线程接收数据
当有数据来时,线程要修改form1子窗体里的控件值查了些资料,如用代理... 但还是不清楚如何用?

解决方案 »

  1.   

    首先在winform中(YM002)写上需要进行委托的方法,如控制控件显示内容的,这里的例子是绑定DataGrid的方法:
    //绑定DataGrid
    public void ConnectToData(string sSearch)

    // Create the ConnectionString and crete a SqlConnection. 
    // Insert code to process data.
    DG_CarList.TableStyles.Clear();
    DataSet ds = new DataSet();
             ds = db.getrs(sSearch,"Car_Info");
    if(ds == null)
    {
    return;
    } nRows = ds.Tables[0].Rows.Count; //动态添加一列Boolean类型的列,可在DataGrid中显示为CheckBox
    ds.Tables["Car_Info"].Columns.Add("choose",Type.GetType("System.Boolean"));
    DG_CarList.SetDataBinding(ds,"Car_Info");
    //防止产生最后一空行
    CurrencyManager cm = (CurrencyManager)this.BindingContext[DG_CarList.DataSource, DG_CarList.DataMember];      
    ((DataView)cm.List).AllowNew = false; DataGridTableStyle ts1 = new DataGridTableStyle(); 
    ts1.MappingName = ds.Tables[0].TableName; 
    // Set other properties. 
    ts1.AlternatingBackColor = Color.LightGray; 
    DataGridColumnStyle CheckboxCol = new DataGridBoolColumn(); 
    CheckboxCol.HeaderText = "选择"; 
    CheckboxCol.MappingName = "choose"; 
    CheckboxCol.Width = 50;
    ((DataGridBoolColumn)CheckboxCol).AllowNull = false;
    ((DataGridBoolColumn)CheckboxCol).FalseValue = false;
    ((DataGridBoolColumn)CheckboxCol).TrueValue = true; ts1.GridColumnStyles.Add(CheckboxCol); 
    /* Add a GridColumnStyle and set its MappingName 
    to the name of a DataColumn in the DataTable. 
    Set the HeaderText and Width properties. */ 

    DataGridColumnStyle ObjectIDCol = new DataGridTextBoxColumn();
    ObjectIDCol.MappingName = "ObjectID"; 
    ObjectIDCol.HeaderText = "管理号"; 
    ObjectIDCol.ReadOnly = true;
    ObjectIDCol.Width = 70; 
    ts1.GridColumnStyles.Add(ObjectIDCol); 
    //....
    DG_CarList.TableStyles.Add(ts1);
    }然后在该代码文件的最后加入:
    //新建立一个调用ConnectToData的委托
    public delegate void ConnectToDataCallback(string sSearch); 在另一页面,即执行后台线程的页面中:
    if(YM001.ymCarList != null)
    {
    string sSearch = "....";
    //使用委托,用于绑定车辆列表页面的DataGrid
    YM001.ymCarList.Invoke(new YM002.ConnectToDataCallback(YM001.ymCarList.ConnectToData)
    , new object[]{sSearch});
    }其中YM001为主菜单页面,ymCarList为YM002的对象,而ConnectToData是委托的方法
    该委托的目的是, 当有新数据进入数据库,且通过YM001产生的YM002的对象ymCarList不为空,则调用YM002的ConnectData方法,重新绑定DataGrid
    该页面已经使用半年,尚无异常报出
      

  2.   

    PS:ymCarList是静态对象,其在YM001主菜单页面中,点击打开YM002用的按钮时实例化
    而激发委托是在后台文件的代码中,即在控制线程的函数中
    YM002----编制需要委托的方法
             声明委托
    YM001----建立YM002的静态对象:ymCarList,并将其实例化后台文件,如ClsReceiveData.cs-----激发委托:YM001.ymCarList.Invoke(new YM002.ConnectToDataCallback(YM001.ymCarList.ConnectToData)
      

  3.   

    你看了就知道
    http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/misMultithreading.mspx
      

  4.   

    http://www.cnblogs.com/rustle/articles/11301.aspx