none
C# - ProgressBar'ın DataGridView İle Birlikte Kullanılması RRS feed

  • Soru

  • Merhaba, herkese günaydın. İki tane DataGridView'ım var ve SQL tablomdan gelen veriler ile bir DataTable aracılığında bu verileri ekliyorum. Ancak DataGridView dolarken bir ProgressBar'ın çalışmasını istiyorum. Başta ProgressBar görünmeyecek ve DataGridView çalışmaya başladığı anda ProgressBar da çalışmaya başlayacak, DataGridView dolduğunda ise ProgressBar tekrar görünmeyecek. Bu işlemi DataGridView'ın her dolduruluşunda tekrarlamak istiyorum. Kodu yazdım ancak çalışmıyor, aynı zamanda herhangi bir hata da vermiyor. Eksiğimin nerede olduğu tam anlayamadım, yardımcı olursanız sevinirim. Kod şu şekildedir;


        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            progressBar1.Visible = true;
            progressBar1.Style = ProgressBarStyle.Blocks;
            progressBar1.Value = progressBar1.Minimum;
            progressBar1.MarqueeAnimationSpeed = 0;
        }
    
        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            progressBar1.Visible = false;
            progressBar1.Style = ProgressBarStyle.Blocks;
            progressBar1.Value = progressBar1.Minimum;
            progressBar1.MarqueeAnimationSpeed = 0;
        }
        
        private void Form1_Load(object sender, EventArgs e)
        {
            CheckForIllegalCrossThreadCalls = false; //Bu kısmı thread çakışmasını önlemek için ekledim, nedense böyle bir hata vermişti, hatayı bastırmak adına bu çözümü buldum.
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            if (radioButton.Checked == true)
            {
                connection.Open();
                //Önemsiz işlemler.
                for (...)
                {
                    for (...)
                    {
                        var query = "...";
                        SqlDataAdapter adp = new SqlDataAdapter(query, connection);
                        adp.SelectCommand.Parameters.Add(...).Value;
                        DataTable d = new DataTable();
                        adp.Fill(d);
                        foreach (DataRow rows in d.Rows)
                        {
                            progressBar.Visible = true;
                            progressBar.Style = ProgressBarStyle.Blocks;
                            progressBar.MarqueeAnimationSpeed = 50;
                            var bw = new BackgroundWorker();
                            bw.DoWork += backgroundWorker1_DoWork;
                            bw.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted;
                            bw.RunWorkerAsync();
                            dgv.Columns[1].DefaultCellStyle.Format = "N3";
                            //Önemsiz işlemler.
                            dgv.Rows.Add(rows["c1"].ToString() + " " + rows["c2"].ToString(), rows["c3"]);
                        }
                    }
                }
                con.Close();
            }
        }

    Yardımlarınız için teşekkür ederim.

    NOT: ProgressBar'ın style kısmı Marquee de olabilir. Hatta galiba Marquee olması daha doğru olacaktır.

    23 Şubat 2019 Cumartesi 07:00

Yanıtlar

  • private void Button1_Click(object sender, EventArgs e)
    {
        if (radioButton.Checked == true)
        {
            progressBar.Style = ProgressBarStyle.Blocks;
            progressBar.MarqueeAnimationSpeed = 50;
            dgv.Columns[1].DefaultCellStyle.Format = "N3";
            //Önemsiz işlemler.
            for (...)
            {
                for (...)
                {
                    DataTable d = null;
                    connection.Open();
                    using (SqlDataAdapter adp = new SqlDataAdapter("...", connection))
                    {
                        adp.SelectCommand.Parameters.Add(...).Value;
                        adp.Fill(d = new DataTable());
                    }
                    connection.Close();
                    progressBar.Value = 0;
                    progressBar.Maximum = d.Rows.Count;
                    progressBar.Visible = true;
                    d?.Rows.Cast<DataRow>().ToList().ForEach(r =>
                    {
                        //Önemsiz işlemler.
                        dgv.Rows.Add($"{r["c1"]} {r["c2"]}", r["c3"]);
                        progressBar.Value++;
                        Application.DoEvents();
                    });
                    progressBar.Visible = false;
                }
            }
        }
    }
    BackgroundWorker kontrolüne ihtiyacınız yok. Sadece bu kodu kullanın.

    Sorunuzun yanıtı bu ise "Yanıt olarak işaretle"yerek siz de forumun işleyişine katkıda bulununuz...

    23 Şubat 2019 Cumartesi 22:03

Tüm Yanıtlar

  • private void Button1_Click(object sender, EventArgs e)
    {
        if (radioButton.Checked == true)
        {
            progressBar.Style = ProgressBarStyle.Blocks;
            progressBar.MarqueeAnimationSpeed = 50;
            dgv.Columns[1].DefaultCellStyle.Format = "N3";
            //Önemsiz işlemler.
            for (...)
            {
                for (...)
                {
                    DataTable d = null;
                    connection.Open();
                    using (SqlDataAdapter adp = new SqlDataAdapter("...", connection))
                    {
                        adp.SelectCommand.Parameters.Add(...).Value;
                        adp.Fill(d = new DataTable());
                    }
                    connection.Close();
                    progressBar.Value = 0;
                    progressBar.Maximum = d.Rows.Count;
                    progressBar.Visible = true;
                    d?.Rows.Cast<DataRow>().ToList().ForEach(r =>
                    {
                        //Önemsiz işlemler.
                        dgv.Rows.Add($"{r["c1"]} {r["c2"]}", r["c3"]);
                        progressBar.Value++;
                        Application.DoEvents();
                    });
                    progressBar.Visible = false;
                }
            }
        }
    }
    BackgroundWorker kontrolüne ihtiyacınız yok. Sadece bu kodu kullanın.

    Sorunuzun yanıtı bu ise "Yanıt olarak işaretle"yerek siz de forumun işleyişine katkıda bulununuz...

    23 Şubat 2019 Cumartesi 22:03
  • Hocam yanıtınız için teşekkür ederim. BackgroundWorker'ı sildim, program çalışmakta ancak sorunlar var. Ben form ilk açıldığında görünmesini istemiyordum. Bunu sağlamak için şu kodu yazdım;

               
    public Form3()
    {
        InitializeComponent();
        progressBar.Visible = false;
    }
    Bunu sağlayabildim, program ilk açıldığında progressbar görünmüyor. Sonrasında ise söylediğiniz kodu aynen yazdım. Sorun nedir diye soracak olursanız; ben butona bastığım andan itibaren çalışması gerekirken datagridview dolduktan sonra çalışıyor ve %25 oranında dolup kalıyor, en sonunda visible = false dediğimiz için istediğim gibi kapanıyor. Ancak sonrasında ise programda donma oluyor, herhangi bir şeye basamıyorum. Bu kadar kasma yapmasının sebebini anlamadım. Normalde benim yapmak istediğim program ilk açıldığında görünmeyecek, ben butona bastığım andan itibaren datagridview dolarken progressbar dolacak ve datagridview'ın dolma işlemi kapandığında progressbar da tamamen kapanacak, sanki benimkinde gizlemişiz ama arkada halen çalışıyormuş gibi kasıyor. Aynı şekilde kullanıcı tekrar butona basıp DGV üzerinde bir şey görüntelemek isterse tekrar tekrar çalışıp aynı işlemi gerçekleştirecek. Sizce hangi kısmında eksiğim var? Tekrardan teşekkürler, saygılarımı sunarım.
    24 Şubat 2019 Pazar 00:52
  • İç içe, üç adet for döngüsü var. Önemsiz işlemler olarak belirttiğiniz kısımda işlem yoğunluğu nedir bilmiyorum.

    Metodun, son kullandığınız halini paylaşırsanız yardımcı olabilirim.


    Sorunuzun yanıtı bu ise "Yanıt olarak işaretle"yerek siz de forumun işleyişine katkıda bulununuz...

    24 Şubat 2019 Pazar 06:53
  •     private void button1_Click(object sender, EventArgs e)
        {
            if (radioButton.Checked == true)
            {
                progressBar.Visible = true;
                progressBar.Style = ProgressBarStyle.Blocks;
                progressBar.MarqueeAnimationSpeed = 85;
                dgv.Columns[1].DefaultCellStyle.Format = "N3";
                connection.Open();
                //Önemsiz işlemler.
                for (...)
                {
                    for (...)
                    {
                        var query = "...";
                        SqlDataAdapter adp = new SqlDataAdapter(query, connection);
                        adp.SelectCommand.Parameters.Add(...).Value;
                        DataTable d = new DataTable();
                        adp.Fill(d);
                        progressBar.Value = 0;
                        progressBar.Maximum = d.Rows.Count;
                        foreach (DataRow rows in d.Rows)
                        {
                            //Önemsiz işlemler.
                            dgv.Rows.Add(rows["c1"].ToString() + " " + rows["c2"].ToString(), rows["c3"]);
                            progressBar.Value++;
                            Application.DoEvents();
                        }
                    progressBar.Visible = false;
                    }
                }
                connection.Close();
            }
        }
    Bu şekilde bir kodlama yaptım Murat bey. Önemsiz olarak belirtilen kısımlar duplicate satırları silme, listbox içerisindeki satırlar üzerinde split işlemi yapma gibi durumları içeriyor.
    24 Şubat 2019 Pazar 07:29
  • thread kullanımı sanırım yardımcı olacaktır. hatanın sebebi program yükleme yaparken kastığı için progressbar da o kasma anında çalışmıyor haliyle. Kasmayı dikkate almayıp aynı anda başka bir iş yaptırmak(thread) gerekiyor sanırım.
    25 Şubat 2019 Pazartesi 09:21
  • Multi-thread olayından bahsediyorsunuz anladığım kadarıyla. Bunu nasıl koda dökebileceğimi biliyor musunuz? Yardımcı bir kaynak var mıdır acaba Hakan bey?
    25 Şubat 2019 Pazartesi 21:40