简体   繁体   中英

Displaying a progressbar while executing an SQL Query

I want to inform the user while data is being read from an SQL database and I decided to create a form with a progressbar but it doesn't work - maybe because a thread is needed. I want to create the form programmatically

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

How do I modify the code above to achieve my stated goals?

edit: Btw, I want to use this progressbar form in every data functions in my project. For example: fillGrid, runQuery..

@Will thank you very much for your answers. I meant how can I use a function of class for example my gridFill function is in that connection class:

 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;
    }       
    }

and example queries from another form(class)

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

and I cant imagine how can I use it in bw_DoWork event. because my function has parameters.(query, gridview) when I call it from another class I can use it with parameters...

ps : this Method is pretty good for me but it didnt worked. I didnt understand the problem

Use the BackgroundWorker class to fill your 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 (); //
    }

It is possible to send a parameter to the BackgroundWorker. If you need more than one parameter, you can send a Tuple which contains any objects you need.

EDIT: If you're on 3.5, you can use a KeyValuePair instead. Code is updated for that.

Just as Ash Burlaczenko recommended, you'll have to use a BackgroundWorker for that purpose.

Since, however, you'd like to tie it in with a ProgressBar, I'd recommend looking at this article on CodeProject: ProgressWorker .

It's fairly easy to use and it updates the progress bar for you automatically. All you'll have to do is remember to call the ProgressWorker.ReportProgress method from time to time in order to update the associated progress bar.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM