【问题标题】:Displaying a progressbar while executing an SQL Query在执行 SQL 查询时显示进度条
【发布时间】:2011-12-09 15:38:39
【问题描述】:

我想在从 SQL 数据库读取数据时通知用户 我决定创建一个带有进度条的表单,但它不起作用 - 可能是因为需要一个线程。我想以编程方式创建表单

        ProgressBar pb = new ProgressBar();

        pb.MarqueeAnimationSpeed = 30;
        pb.Style = ProgressBarStyle.Marquee;
        pb.Dock = DockStyle.Fill;

        progressForm.ClientSize = new Size(200, 50);
        progressForm.FormBorderStyle = FormBorderStyle.FixedDialog;
        progressForm.StartPosition = FormStartPosition.CenterScreen;
        progressForm.Controls.Add(pb);
        progressForm.ControlBox = false;
        progressForm.TopMost = true;

        progressForm.Show();  
        //do data processes here (all queries and executes)
        progressForm.close();

如何修改上面的代码以实现我的既定目标?

编辑:顺便说一句,我想在我项目的每个数据函数中使用这个进度条表单。例如:fillGrid、runQuery..

@将非常感谢您的回答。我的意思是如何使用类的函数,例如我的 gridFill 函数在那个连接类中:

 class ConnectionClass
    {
       public static SqlConnection connection = new SqlConnection();

    public string sorgu;
    public static string server;
    public static string userId;
    public static string catalog;
    public static string password;
    public static string accessMethod;
    public DataSet ds = new DataSet();
    Form progressForm = new Form();       

    public bool Open()
    {
        try
        {
            if (connection.State != ConnectionState.Open)
            {

                connection.ConnectionString = "Data Source = " + server + ";" +
                                              "Initial Catalog=" + catalog + ";" +
                                              "User ID=" + userId + ";" +
                                              "Password=" + password + ";" +
                                              "Connect Timeout=0";

                connection.Open();
                return true;
            }
            else
            {
                return true;
            }


        }
        catch (Exception ex)
        {
            MessageBox.Show("System message:" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            return false;
        }

    }

    public DataTable Dt(string query)
    {
        DataTable dt = new DataTable();
        if (Open())
        {
            SqlDataAdapter da = new SqlDataAdapter(query, connection);
            try
            {   
                //progressForm.Showdialog()  is this possible???
                da.Fill(dt);
                //progressForm.close(); ??
            }
            catch (Exception ex)
            {
                MessageBox.Show("Sistem Mesajı:" + ex.Message, "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }         
        return dt;
    }

    public bool Run(string query, string hataMsj)
    {
        Form activeForm = Form.ActiveForm;
        query = " SET DATEFORMAT DMY " + query;

        SqlCommand sc = new SqlCommand(query, connection);
        try
        {
            Open();
            sc.ExecuteNonQuery();
            return true;
        }           
        catch (Exception )
        {
            return false;
        }
    }

    public void fillComboBox(string sorgu, ComboBox cb, string text, string value)
    {
        DataTable dt = Dt(sorgu);

        cb.DisplayMember = text;
        cb.ValueMember = value;
        cb.DataSource = dt;
        if (cb.Items.Count > 0)
        {
            cb.SelectedIndex = 0;
        }

    }

    public int fillGridView(string sorgu, DataGridView dgv)
    {
        DataTable dtGrvw = Dt(sorgu);
        dgv.DataSource = dtGrvw;
        return 1;
    }       
    }

以及来自另一个表单(类)的示例查询

   ConnectionClass cc = new ConnectionClass();

    query= "  INSERT INTO tblPersonel (" +
                                          " [sqlUserName] " +
                                          ",[personelNo] " +
                                          ",[ad] " +
                                          ",[soyad] " +
                                          ",[departmanId] " +
                                          ",[emailadres] " +
                                          ",[tcKimlikNo],[kangurubu],[dokumaciNo])VALUES" +
                                          "('" + tbSqlUserName.Text +
                                          "','" + tbPersonelNo.Text +
                                          "','" + tbAd.Text +
                                          "','" + tbSoyad.Text +
                                          "','" + cbDepartman.SelectedValue.ToString() +
                                          "','" + tbMail.Text +
                                          "','" + tbKimlikno.Text + 
                                          "','" + tbKangrubu.Text + 
                                          "','" + tbDokumaciNo.Text + "' ) ";
                    if (cc.Run(query, "Unexpected error on insert new person"))
                    {
                        fillGrid();
                        this.Close();

                    }

    public void fillGrid()
    {
        query= " select * from View_Personel order by personelNo desc";
        cc.fillGridView(query, gridviewPersonel);
    }

我无法想象如何在 bw_DoWork 事件中使用它。因为我的函数有参数。(查询,gridview)当我从另一个类调用它时,我可以将它与参数一起使用......

附言:this Method 对我来说非常好,但没有用。没看懂问题

【问题讨论】:

标签: c# sql multithreading progress-bar backgroundworker


【解决方案1】:

使用 BackgroundWorker 类填充您的 DataGrid。

     Form progressForm;

     public void func() {
        BackgroundWorker bw = new BackgroundWorker ();
        bw.DoWork += new DoWorkEventHandler (bw_DoWork);
        bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler (bw_RunWorkerCompleted);

        progressForm = new Form ();

        ProgressBar pb = new ProgressBar ();

        pb.MarqueeAnimationSpeed = 30;
        pb.Style = ProgressBarStyle.Marquee;
        pb.Dock = DockStyle.Fill;

        progressForm.ClientSize = new Size (200, 50);
        progressForm.FormBorderStyle = FormBorderStyle.FixedDialog;
        progressForm.StartPosition = FormStartPosition.CenterScreen;
        progressForm.Controls.Add (pb);
        progressForm.ControlBox = false;
        progressForm.TopMost = true;

        progressForm.Show ();

        string queryString = "SELECT ...."; // fill query string here
        var params = new KeyValuePair<GridControl, string>(sorgu, queryString);
        bw.RunWorkerAsync (params);
    }

    void bw_DoWork (object sender, DoWorkEventArgs e) {
        KeyValuePair<GridControl, string> params = e.Argument as KeyValuePair<GridControl, string>;
        ConnectionClass cc = new Connection Class();
        cc.fillGrid(params.Value, params.Key);
    }

    void bw_RunWorkerCompleted (object sender, RunWorkerCompletedEventArgs e) {
        progressForm.Close (); //
    }

可以向BackgroundWorker 发送参数。如果您需要多个参数,您可以发送一个包含您需要的任何对象的元组。

编辑:如果您使用的是 3.5,则可以改用 KeyValuePair。为此更新了代码。

【讨论】:

  • 感谢您的评论,它运作良好。但我有一个小问题。我的数据填充函数在一个类中,并接受 2 个参数(查询和网格控件),我在项目中到处使用它 public void fillGridControl(string sorgu, GridControl gc) { BindingSource dataSource = new BindingSource(Dt(sorgu), null); gc.DataSource = 数据源;我可以把这个函数放在 bw_DoWork 事件中吗?
  • @Rapunzo 您可以简单地从 bw_DoWork 事件内部调用您的 fillGridControl 函数。我不知道你的代码,但是有什么理由让它不起作用吗?
  • 我也用代码更新了我的问题,如果你看一下,我将不胜感激
  • 再次更新。应该是你需要的。
  • 我认为这个 Tuple 类不包含在 .Net 3.5 中。所以我还是做不到...
【解决方案2】:

正如Ash Burlaczenko 推荐的那样,您必须为此使用BackgroundWorker

但是,由于您希望将其与 ProgressBar 绑定,我建议您查看 CodeProject 上的这篇文章:ProgressWorker

它非常易于使用,它会自动为您更新进度条。您所要做的就是记住不时调用ProgressWorker.ReportProgress 方法以更新关联的进度条。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多