从后台工作者

时间:2016-06-21 02:41:37

标签: c# winforms invoke

我正在使用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();



    }

1 个答案:

答案 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();
}
相关问题