如何使用datagridview链接进度条 [英] How to link a progressbar with datagridview

查看:57
本文介绍了如何使用datagridview链接进度条的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Hi
我在点击按钮时尝试将进度条与datagridview链接。问题是在进度条开始运行之前获取了datagridview。



我如何编辑我的代码,以便在获取/填充datagridview时,进度条显示进度。

我正在使用背景工作者。



Hi I'm trying to link a progressbar with datagridview when a button is clicked.The problem is that the datagridview is fetched before the progressbar starts to run.

How can i edit my code so that the progressbar show me the progress while the datagridview is fetch / filled.
I'm using a Backgroundworker.

/* Backgroundworker for the progressBar*/
            private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
            {
                int sum = 0;
                //for (int i = 1; i <= 100; i++)
                    for (int i = 0; i < datagridview1.Rows.Count - 1; i++)
                {
                    Thread.Sleep(10);
                    sum = sum + i;
                    backgroundWorker1.ReportProgress(i);
                    if (backgroundWorker1.CancellationPending)
                    {
                        e.Cancel = true;
                        backgroundWorker1.ReportProgress(0);
                        return;
                    }
                }

                e.Result = sum;
            }





按钮功能:





The Button function:

  private void btnShow_Click(object sender, EventArgs e)
    {
        progressBar1.Visible = true;

        if (cb1.SelectedItem != null && cb2.SelectedItem != null)
        {
            string C = ConfigurationManager.ConnectionStrings["D"].ConnectionString;
            SqlConnection con = new SqlConnection(C);
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;
            cmd.CommandText = ("[dbo].[spData]");
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@Table_Name", cb1.SelectedValue.ToString());
            cmd.Parameters.AddWithValue("@Table_Name2", cb2.SelectedValue.ToString());
            SqlDataAdapter adapter = new SqlDataAdapter(cmd);



if (cb1.SelectedValue.ToString() != null && cb2.SelectedValue.ToString() != null)
            {
                try
                {

                    con.Open();
                    dt = new System.Data.DataTable();
                    adapter.Fill(dt);
                    //datagridview1.AutoGenerateColumns = true;
                    datagridview1.DataSource = dt;
                    lbtblCount.Text = cb1.Text + " Anzahl : " +  datagridview1.Rows.Count.ToString();

                }

                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                finally
                {
                    con.Close();
                }

            }

        }
        else
        {
            MessageBox.Show("Safety check");
        }

        // Check if the backgroundworker is already busy running the asynchronous operation
        if (!backgroundWorker1.IsBusy)
        {
            //This method will start the execution asynchronously in the background
            backgroundWorker1.RunWorkerAsync();
        }
        else
        {
            label7.Text = " Busy processing, please wait";
        }
    }





很乐意提供帮助



Would be glad for an help

推荐答案

请检查



初学者的BackgroundWorker类示例 [ ^ ]


您好,



这里有一个示例检查这个



Hi,

Here a sample check this

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        BackgroundWorker bw;
        bool isGetDataFromDb = false;
        int progressCount = 0;

        private void button1_Click(object sender, EventArgs e)
        {
            dataGridView1.Rows.Clear();
            dataGridView1.AutoGenerateColumns = false;
            this.progressBar1.Value = 0;
            bw = new BackgroundWorker();
            bw.DoWork += (s, se) => 
            {
                se.Result = FillDatagRide();
                isGetDataFromDb = true;
            };
            bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
            bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
            bw.WorkerSupportsCancellation = true;
            bw.WorkerReportsProgress = true;
            bw.RunWorkerAsync();

            //just to show progress bar till data get from db.
            for (int i = 1; i < 50; i++)
            {Thread.Sleep(50);
                
                if (isGetDataFromDb)
                {
                    break;
                }
                bw.ReportProgress(++progressCount);
            }

        }

        void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            this.progressBar1.Value = e.ProgressPercentage;
        }

        void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            ArrayList result = e.Result as ArrayList;
            foreach (var item in result)
            {
                Thread.Sleep(100);
                this.progressBar1.Value = ++progressCount;
                Invoke((MethodInvoker)(() => dataGridView1.Rows.Add(item)));
            }

            this.progressBar1.Value=100;
        }

        private ArrayList FillDatagRide()
        {
            //Code Get data from db
            Thread.Sleep(1000);
            return new ArrayList();//contain data from db 
        }
    }


这篇关于如何使用datagridview链接进度条的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆