2015-10-19 51 views
0

我想在C#中运行方法时显示从“请稍候加载...”窗体进度。如何显示从C#中加载长方法的进度#

我已经采取了一个按钮,我写了一个方法code.when我们点击该按钮,然后进度表将打开,直到方法进行状态。

private void btn_copy_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       cn = new SqlConnection(EZsql.Properties.Settings.Default.SQLConnstr); 
       if (ddl_db.Text != "") 
       { 
        str1 = ddl_db.Text; 
        try 
        { 
         str = "SELECT TABLE_NAME FROM " + ddl_db.Text + ".INFORMATION_SCHEMA.Tables where TABLE_NAME in ('AH','PRODUCT','SSADMIN','PASSWORD','lsCUSTOMER','PRICE','PRICELIST') order by TABLE_NAME"; 
         if (cn.State != ConnectionState.Open) 
          cn.Open(); 
         cmd = new SqlCommand(str, cn); 
         cmd.CommandType = CommandType.Text; 
         sda = new SqlDataAdapter(cmd); 
         ds = new DataSet(); 
         sda.Fill(ds, "sys.Tables"); 
         dt1 = ds.Tables[0]; 
         i = dt1.Rows.Count; 
        } 
        catch (Exception Ex) { i = 0; } 
        if (i == 7) 
        { 
         try 
         { 
          BackgroundWorker bg = new BackgroundWorker(); 
          bg.DoWork += new DoWorkEventHandler(bg_DoWork); 
          bg.WorkerReportsProgress = true; 
          bg.ProgressChanged += new ProgressChangedEventHandler(bg_ProgressChanged); 
          // Start the worker. 
          bg.RunWorkerAsync(); 
          // Display the loading form. 
          bg.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bg_RunWorkerCompleted); 

         } 
         catch (Exception EX) { } 
         if (istrue == false) 
         { 
          MessageBox.Show("Copied Sucessfully", "", MessageBoxButtons.OK, MessageBoxIcon.Information); 
         } 
         else 
         { 
          MessageBox.Show("Copying Failed", "", MessageBoxButtons.OK, MessageBoxIcon.Information); 
         } 
        } 
        else 
        { 
         MessageBox.Show("Some tables are not there in your database \n Your Database must have 'AH','PRICE','PRICELIST','SSADMIN','PASSWORD','PRODUCT','lsPRICE' tables \n Invalid database", "", MessageBoxButtons.OK, MessageBoxIcon.Warning); 
        } 
       } 
       else 
       { 
        MessageBox.Show("Please select the database", "", MessageBoxButtons.OK, MessageBoxIcon.Warning); 
       } 
      } 
      catch (Exception Ex) { } 
      istrue = false; 
     } 


private void bg_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 

     //some progress report - here you can access your controls 
     //this.tbProgress.Text = (e.ProgressPercentage.ToString() + "%"); 
    } 
    void copy() 
    { 
     popup pp = new popup(); 
     pp.ShowDialog(); 
     if (Chb_Cust.Checked == true) 
     { 
      try 
      { 
       str = "delete AH where AC_TYPENO='A' or AC_TYPENO='D'"; 
       if (cn.State != ConnectionState.Open) 
        cn.Open(); 
       cmd = new SqlCommand(str, cn); 
       cmd.CommandTimeout = 1000; 
       cmd.CommandType = CommandType.Text; 
       cmd.ExecuteNonQuery(); 
       str = "Insert into AH select * from " + str1 + ".dbo.AH where " + str1 + ".dbo.AH.AC_TYPENO='A' or " + str1 + ".dbo.AH.AC_TYPENO='D'"; 
       if (cn.State != ConnectionState.Open) 
        cn.Open(); 
       cmd = new SqlCommand(str, cn); 
       cmd.CommandTimeout = 1000; 
       cmd.CommandType = CommandType.Text; 
       cmd.ExecuteNonQuery(); 
      } 
      catch (Exception EX) { istrue = true; } 
     } 
     if (Chb_Supp.Checked == true) 
     { 
      try 
      { 
       str = "delete AH where AC_TYPENO='B' or AC_TYPENO='C'"; 
       if (cn.State != ConnectionState.Open) 
        cn.Open(); 
       cmd = new SqlCommand(str, cn); 
       cmd.CommandTimeout = 1000; 
       cmd.CommandType = CommandType.Text; 
       cmd.ExecuteNonQuery(); 
       str = "Insert into AH select * from " + str1 + ".dbo.AH where " + str1 + ".dbo.AH.AC_TYPENO='B' or " + str1 + ".dbo.AH.AC_TYPENO='C'"; 
       if (cn.State != ConnectionState.Open) 
        cn.Open(); 
       cmd = new SqlCommand(str, cn); 
       cmd.CommandTimeout = 1000; 
       cmd.CommandType = CommandType.Text; 
       cmd.ExecuteNonQuery(); 
      } 
      catch (Exception EX) { istrue = true; } 
     } 
     if (Chb_COA.Checked == true) 
     { 
      try 
      { 
       str = "delete AH where AC_TYPENO!='B' and AC_TYPENO!='C' and AC_TYPENO!='A' and AC_TYPENO!='D'"; 
       if (cn.State != ConnectionState.Open) 
        cn.Open(); 
       cmd = new SqlCommand(str, cn); 
       cmd.CommandType = CommandType.Text; 
       cmd.CommandTimeout = 1000; 
       cmd.ExecuteNonQuery(); 
       str = "Insert into AH select * from " + str1 + ".dbo.AH where " + str1 + ".dbo.AH.AC_TYPENO!='B' and " + str1 + ".dbo.AH.AC_TYPENO!='C' and " + str1 + ".dbo.AH.AC_TYPENO!='A' and " + str1 + ".dbo.AH.AC_TYPENO!='D'"; 
       if (cn.State != ConnectionState.Open) 
        cn.Open(); 
       cmd = new SqlCommand(str, cn); 
       cmd.CommandTimeout = 1000; 
       cmd.CommandType = CommandType.Text; 
       cmd.ExecuteNonQuery(); 
      } 
      catch (Exception EX) { istrue = true; } 
     } 
     if (Chb_Price_Last.Checked == true) 
     { 
      try 
      { 
       str = "drop table PRICE,PRICELIST,lsCUSTOMER "; 
       if (cn.State != ConnectionState.Open) 
        cn.Open(); 
       cmd = new SqlCommand(str, cn); 
       cmd.CommandType = CommandType.Text; 
       cmd.CommandTimeout = 1000; 
       cmd.ExecuteNonQuery(); 
       str = "select * into PRICE from " + str1 + ".dbo.PRICE"; 
       if (cn.State != ConnectionState.Open) 
        cn.Open(); 
       cmd = new SqlCommand(str, cn); 
       cmd.CommandTimeout = 1000; 
       cmd.CommandType = CommandType.Text; 
       cmd.ExecuteNonQuery(); 
       str = "select * into PRICELIST from " + str1 + ".dbo.PRICE LIST"; 
       if (cn.State != ConnectionState.Open) 
        cn.Open(); 
       cmd = new SqlCommand(str, cn); 
       cmd.CommandTimeout = 1000; 
       cmd.CommandType = CommandType.Text; 
       cmd.ExecuteNonQuery(); 
       str = "select * into lsCUSTOMER from " + str1 + ".dbo.lsCUSTOMER"; 
       if (cn.State != ConnectionState.Open) 
        cn.Open(); 
       cmd = new SqlCommand(str, cn); 
       cmd.CommandTimeout = 1000; 
       cmd.CommandType = CommandType.Text; 
       cmd.ExecuteNonQuery(); 
      } 
      catch (Exception EX) { istrue = true; } 
     } 
     if (Chb_Prod.Checked == true) 
     { 
      try 
      { 
       str = "drop table PRODUCT "; 
       if (cn.State != ConnectionState.Open) 
        cn.Open(); 
       cmd = new SqlCommand(str, cn); 
       cmd.CommandTimeout = 1000; 
       cmd.CommandType = CommandType.Text; 
       cmd.ExecuteNonQuery(); 
       str = "select * into PRODUCT from " + str1 + ".dbo.PRODUCT"; 
       if (cn.State != ConnectionState.Open) 
        cn.Open(); 
       cmd = new SqlCommand(str, cn); 
       cmd.CommandTimeout = 1000; 
       cmd.CommandType = CommandType.Text; 
       cmd.ExecuteNonQuery(); 
      } 
      catch (Exception EX) { istrue = true; } 
     } 
     if (Chb_Admin_Setup.Checked == true) 
     { 
      try 
      { 
       str = "drop table SSADMIN "; 
       if (cn.State != ConnectionState.Open) 
        cn.Open(); 
       cmd = new SqlCommand(str, cn); 
       cmd.CommandTimeout = 1000; 
       cmd.CommandType = CommandType.Text; 
       cmd.ExecuteNonQuery(); 
       str = "select * into SSADMIN from " + str1 + ".dbo.SSADMIN"; 
       if (cn.State != ConnectionState.Open) 
        cn.Open(); 
       cmd = new SqlCommand(str, cn); 
       cmd.CommandTimeout = 1000; 
       cmd.CommandType = CommandType.Text; 
       cmd.ExecuteNonQuery(); 
      } 
      catch (Exception Ex) { istrue = true; } 
     } 
     if (Chb_User_Pass.Checked == true) 
     { 
      try 
      { 
       str = "drop table PASSWORD,PS,PSDESC "; 
       if (cn.State != ConnectionState.Open) 
        cn.Open(); 
       cmd = new SqlCommand(str, cn); 
       cmd.CommandTimeout = 1000; 
       cmd.CommandType = CommandType.Text; 
       cmd.ExecuteNonQuery(); 
       str = "select * into PASSWORD from " + str1 + ".dbo.PASSWORD"; 
       if (cn.State != ConnectionState.Open) 
        cn.Open(); 
       cmd = new SqlCommand(str, cn); 
       cmd.CommandTimeout = 1000; 
       cmd.CommandType = CommandType.Text; 
       cmd.ExecuteNonQuery(); 
       str = "select * into PS from " + str1 + ".dbo.PS"; 
       if (cn.State != ConnectionState.Open) 
        cn.Open(); 
       cmd = new SqlCommand(str, cn); 
       cmd.CommandTimeout = 1000; 
       cmd.CommandType = CommandType.Text; 
       cmd.ExecuteNonQuery(); 
       str = "select * into PSDESC from " + str1 + ".dbo.PSDESC"; 
       if (cn.State != ConnectionState.Open) 
        cn.Open(); 
       cmd = new SqlCommand(str, cn); 
       cmd.CommandTimeout = 1000; 
       cmd.CommandType = CommandType.Text; 
       cmd.ExecuteNonQuery(); 
      } 
      catch (Exception EX) { istrue = true; } 
     } 
     try 
     { 
      str = "SP_Collation"; 
      if (cn.State != ConnectionState.Open) 
       cn.Open(); 
      cmd = new SqlCommand(str, cn); 
      cmd.CommandTimeout = 1000; 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.ExecuteNonQuery(); 
     } 
     catch (Exception EX) { istrue = true; } 
     pp.Close(); 
     //try 
     //{ 
     // str = "SP_Collation"; 
     // cn.Close(); 
     // cn.ConnectionString += ";Connect Timeout=1000"; 
     // if (cn.State != ConnectionState.Open) 
     //  cn.Open(); 
     // cn.ChangeDatabase(str1); 
     // cmd = new SqlCommand(str, cn); 
     // cmd.CommandType = CommandType.StoredProcedure; 
     // cmd.CommandTimeout = 1000; 
     // cmd.ExecuteNonQuery(); 
     //} 
     //catch (Exception EX) { } 
    } 
    private void bg_DoWork(object sender, DoWorkEventArgs e) 
    { 
     BackgroundWorker worker = sender as BackgroundWorker; 
     // you should invoke worker's ReportProgress method iside your copy() method 
     worker.ReportProgress((i * 10)); 
     copy(); 
    } 

private void bg_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 
     object result = e.Result; 
     popup pp = new popup(); 

     } 

当过我的拷贝按钮,点击它会显示弹出式加载的形式,但在过程完成,并没有显示成功复制没有关闭。

+0

代码是不完整的..不能帮助在这种情况下,请通过包括复制方法更新问题。 – Rakin

回答

2

我想错误的原因是你从副本()方法访问您的控件。要报告BackgroundWorker的进度,您应该使用其事件ProgressChanged

请参考以下HowTo from Microsoft

您应该添加:

bg.WorkerReportsProgress = true; 
bg.ProgressChanged += new ProgressChangedEventHandler(bg_ProgressChanged); 

和修改bg_DoWork方法:

private void bg_DoWork(object sender, DoWorkEventArgs e) 
     { 
BackgroundWorker worker = sender as BackgroundWorker; 
// you should invoke worker's ReportProgress method iside your copy() method 
//worker.ReportProgress((i * 10)); 
//copy(); 
} 

,并添加一个方法,进度报告:

private void bg_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    //some progress report - here you can access your controls 
    //this.tbProgress.Text = (e.ProgressPercentage.ToString() + "%"); 
} 
+0

我应该在哪里使用这个事件以及如何将这个事件与我的方法copy()联系起来,如果可能的话,我会按照我的代码提及代码 –

+0

@taruwhatarapu在我的答案中添加了样本。 –

+0

对不起,我尝试了代码,因为你在这里提到,但我没有得到这里的输出,我已经采取了一个名为popup的加载页面来显示加载。当我点击复制按钮时,它会显示弹出加载窗体,但它没有关闭,当进程完成并且不显示复制成功。我会在上面更新我的问题; –