程序的主窗体mianform将会起一个后台线程接收数据
当有数据来时,线程要修改form1子窗体里的控件值
查了些资料,如用代理... 但还是不清楚如何用?
首先在winform中写上需要进行委托的方法,如控制控件显示内容的,这里的例子是绑定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
该页面已经使用半年,尚无异常报出
PS:ymCarList是静态对象,其在YM001主菜单页面中,点击打开YM002用的按钮时实例化
而激发委托是在后台文件的代码中,即在控制线程的函数中
YM002----编制需要委托的方法
声明委托
YM001----建立YM002的静态对象:ymCarList,并将其实例化
后台文件,如ClsReceiveData.cs-----激发委托:YM001.ymCarList.Invoke(new YM002.ConnectToDataCallback(YM001.ymCarList.ConnectToData)
搜索Control.Invoke
你看了就知道
http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/misMultithreading.mspx
http://www.cnblogs.com/rustle/articles/11301.aspx