我正在使用backgroundworker中的循环填充listview,而后台worker最初是从第二个活动表单运行的。要想象它我打开一个form1然后打开另一个用于运行form1.backgroundworker runasync的表单(form2)。
Form1与backgroundworker - 在后面
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker wk = new BackgroundWorker { WorkerReportsProgress = true };
listView1.View = View.Details;
DataTable dtdt = new DataTable();
dtdt = qr.history();
for (int i = 0; i < dtdt.Rows.Count; i++)
{
DataRow dr = dtdt.Rows[i];
ListViewItem listitem = new ListViewItem(dr["custnum"].ToString());
listitem.SubItems.Add(dr["custname"].ToString().Trim());
listitem.SubItems.Add(dr["ratecable"].ToString().Trim());
listitem.SubItems.Add(dr["rateinternet"].ToString().Trim());
listitem.SubItems.Add(dr["rateext"].ToString().Trim());
listitem.SubItems.Add(dr["status"].ToString().Trim());
listitem.SubItems.Add(dr["classname"].ToString().Trim());
listitem.SubItems.Add(dr["SVCstadd"].ToString().Trim());
listitem.SubItems.Add(dr["SVCctadd"].ToString().Trim());
listitem.SubItems.Add(dr["svctelno"].ToString().Trim());
listitem.SubItems.Add(dr["bilstadd"].ToString().Trim());
listitem.SubItems.Add(dr["bilctadd"].ToString().Trim());
listitem.SubItems.Add(dr["billtel"].ToString().Trim());
listitem.SubItems.Add(dr["billtel2"].ToString().Trim());
listitem.SubItems.Add(dr["fax"].ToString().Trim());
listitem.SubItems.Add(dr["zoneno"].ToString().Trim());
listitem.SubItems.Add(dr["zoneName"].ToString().Trim());
listitem.SubItems.Add(dr["bookno"].ToString().Trim());
listitem.SubItems.Add(dr["seqno"].ToString().Trim());
listitem.SubItems.Add(dr["Balance"].ToString().Trim());
listitem.SubItems.Add(dr["balance1"].ToString().Trim());
listitem.SubItems.Add(dr["balance2"].ToString().Trim());
listitem.SubItems.Add(dr["balance3"].ToString().Trim());
listitem.SubItems.Add(dr["billamnt"].ToString().Trim());
listitem.SubItems.Add(dr["maxdate"].ToString().Trim());
qr.lsi = listitem;
//error {"Invoke or BeginInvoke cannot be called on a control until the window handle has been created."}
this.BeginInvoke(new MethodInvoker(delegate { additemtoLV(listitem); }));
}
System.Threading.Thread.Sleep(100);
}
private delegate void additemtoLVdelegat(ListViewItem ls);
public void additemtoLV(ListViewItem ls)
{
if (IsHandleCreated)
{
BeginInvoke(new additemtoLVdelegat(additemtoLV), ls);
}
else
{
listView1.Items.Add(ls);
}
}
Form2 - 用于调用form1.backgroundworker - 在form1前面 - 注意form1已经打开
private void Close_Click(object sender, EventArgs e)
{
form1 f1 = new form1 ();
f1.backgroundWorker1.RunWorkerAsync();
this.Close();
}
答案 0 :(得分:0)
根据您的代码,form1未打开。你必须调用Form.Show并等待Form.Load。
form1 f1 = new form1 ();
f1.backgroundWorker1.RunWorkerAsync();
我建议您在Form1_Load
中启动后台工作程序private void Form1_Load(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
并显示Form1以允许触发Form1_Load。
private void Close_Click(object sender, EventArgs e)
{
form1 f1 = new form1();
f1.Show();
}