【问题标题】:How to show a progress from while loading a long method in c#如何在 c# 中加载长方法时显示进度
【发布时间】:2015-10-20 17:31:58
【问题描述】:

我想在 C# 中运行方法时显示“请等待加载...”表单的进度。

我已经使用了一个按钮,因为我已经编写了一个方法代码。当我们单击该按钮时,进度表单将打开,直到方法处于进行中状态。

  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();

        }

当我点击复制按钮时,它会显示弹出加载表单,但是当过程完成时它并没有关闭并且没有显示复制成功。

【问题讨论】:

  • 代码不完整..在这种情况下无能为力,请通过包含复制方法来更新问题。

标签: c# sql


【解决方案1】:

我猜错误的原因是您从 copy() 方法访问您的控件。要从 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() + "%");
}

【讨论】:

  • 我应该在哪里使用这个事件以及如何将此事件与我的方法 copy() 联系起来,请尽可能按照我的代码提及代码
  • @tarunsusarapu 在我的答案中添加了示例。
  • 对不起,我尝试了您在此处提到的代码,但我没有在这里得到输出,我使用了一个名为弹出窗口的加载页面来显示加载。当我点击复制按钮时,它会显示弹出加载表单,但是当过程完成时它没有关闭并且没有显示复制成功。我将在上面更新我的问题;
  • 我更新了上面的完整代码,观察代码,看看我应该在哪里更新?
  • @tarunsusarapu 您应该实例化并在 btn_copy_Click 方法的末尾显示“请稍候”弹出窗口。请记住,btn_copy_Click 中的所有操作都在 UI 线程上运行,但您在 bg_DoWork 中所做的事情并不能保证在 UI 线程上运行。另外,您应该全局存储对弹出窗口的引用(在呈现类的字段中),以便在 bg_RunWorkerCompleted 中调用 pp.Close() (此方法的代码也运行在 UI 线程上)使弹出窗口消失。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多