Merhabalar,

Bu makalemde DevExpress komponentlerinden olan WaitForm komponentinin progressbar ile nasıl kullanılabileceğini anlatmaya çalışacağım. Bu işlem bize özellikle bir liste içindeki kayıtların tek tek işlendiği durumlarda kullanıcıya %20,30,.. tamamlandı şeklinde bilgi vermemiz için gereklidir. Bu sayede hem kullanıcıya anlık bir bilgi vermiş oluruz hemde güzel bir görünüm elde etmiş oluruz.

Not : Bu makalede kullanılan DevExpress sürümü 13.2.9'dur. Farklı versiyonlarda belki değişiklik yapılmış olabilir. Konu ile ilgili dökümana buradan ulaşabilirsiniz..

Öncelikle yeni bir Windows Forms Application oluşturalım.

Ardından porjemize sağ tıklayıp aşağıdaki şekilde yeni bir Wait Form ekleyelim.

Not: Eğer sizde Progress Indicator.. görünmüyor ise, hemen üst taraftaki New Item'a tıklayarak ekleyebilirsiniz..

Ben isim olarak frmWait verdim. İstediğiniz bir isim verebilirsiniz.

Şimdi wait formumuza çift tıklayarak designer görünümüne geçelim ve aşağıdaki şekilde yeni bir satır ekleme ekranına ulaşalım.

Açıklan ekranda, önce üst tarafta bulunan ComboBox'tan Columns alanını Rows olarak seçelim. Daha sonra aşağıdaki Add butonu ile yeni bir satır ekleyelim. Bu işlemden sonra listede 2 adet row görünecektir. 1. row a tıklayıp sağ taraftan Size Type kısmına gelelim ve Absoloute seçeneğini şeçelim. Değer olarak 50 yazalım. Ardından 2. row a tıklayalım ve yine sağ taraftan Size Type kısmına gelip Autosize seçeneğini işaretleyelim. Ardından OK tuşu ile ayarlarımızı kaydedelim.

Eğer 2. satırın yüksekliği formunuza göre az gelmiş ise, formunuzun yüksekliğini değiştirebilirsiniz. Tavsiye olarak formunuzun Height özelliğini 85 yaparsanız sorunsuz görüntülenecektir. Bu işlemin ardından ToolBox üzerinden ProgressBarControl isimli kontrolümüzü bulalım. Burada sürükle bırak ile formun üzerine kontrolümüzü bırakamıyoruz malesef. Bunun için Toolbox üzerinde ProgressBarControl'e bir kez tıklayalım ve aşağıdaki resimdeki gibi 2. row üzerinde bir çizim gerçekleştirelim.

Çizimi gerçekleştirdikten sonra progressbar a bir kez tıklayın ve Properties menüsünden Dock özelliğini Fill olarak ayarlayın. Bu şekilde progressbar kontrolümüz 2. row içerisine yerleşmiş olacaktır. Daha sonra progressbarımızın özelliklerinden Properties > ShowTitle özelliğini True olarak ayarlayalım. Bu şekilde progressbar üzerinde % ile ilerlemeyi görmüş oluyoruz. Ayrıca varsayılan olarak progressbar görünmeyeceği için Visible özelliğini de False olarak ayarlamayı unutmayalım..

Şimdi formumuz üzerinde F7 tuşuna basarak kod tarafına geçelim. Burada Overrides içinde bulunan kodlarımızı açalım. Kodlarımız aşağıdaki şekildedir. İlgili metodların açıklamaları ise kod içerisinde mevcuttur..

frmWait.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraWaitForm;
 
namespace WindowsFormsApplication12
{
    public partial class frmWait : WaitForm
    {
        public frmWait()
        {
            InitializeComponent();
            this.progressPanel1.AutoHeight = true;
        }
 
        #region Overrides
 
        //Wait form üzerindeki Please Wait yazısını değiştirmek için kullanılır.
        public override void SetCaption(string caption)
        {
            base.SetCaption(caption);
            this.progressPanel1.Caption = caption;
        }
 
        //Wait form üzerindeki Loading.. yazısını değiştirmek için kullanılır.
        public override void SetDescription(string description)
        {
            base.SetDescription(description);
            this.progressPanel1.Description = description;
        }
 
        //Forma gelen komutların işlendiği metoddur. Detayları ileride anlatılacaktır.
        public override void ProcessCommand(Enum cmd, object arg)
        {
            base.ProcessCommand(cmd, arg);
        }
 
        #endregion
 
        public enum WaitFormCommand
        {
        }
    }
}

Bizim için önemli olan metod ProcessCommand isimli metoddur. Bu metoda SplashScreenManager isimli sınıfımız üzerinden gönderilen komutlar düşmektedir. Önce gelen komutları nasıl işleyeceğimizi inceleyelim ardından bu komutların nasıl gönderildiğini anlatacağım.

Öncelikle WaitFormCommand isimli enum içerisine yapacağımış işlemlerimizi tanımlayalım.

Bizim şu anda toplam 3 tane işlemimiz olacak.

  1. Progressbarımızı görünür hale getireceğiz (visible = true yaparak).
  2. Progressbarımıza maximum bir değer gireceğiz.
  3. Progressbarımızın anlık değerini değiştireceğiz.

Bu 3 adımızı enum içerisinde tanımlayalım. Enumumuz aşağıdaki şekilde olacaktır.

public enum WaitFormCommand
{
    SetProgressBarVisible,
    SetProgressBarMaximum,
    SetProgressBarPosition
}

Bu işlemimizi tamamladıktan sonra ProcessCommand isimli methodumuzu aşağıdaki şekilde değiştirelim. İlgili açıklamalar kod içerisinde verilmiştir.

public override void ProcessCommand(Enum cmd, object arg)
{
    switch ((WaitFormCommand)cmd)
    {
        case WaitFormCommand.SetProgressBarVisible:
            //Gelen komut eğer SetProgressBarVisible komutu ise, arg bir boolean değer olmalıdır. Bu değeri biz progressbarımızın Visible özelliğine aktarıyoruz.
            this.progressBarControl1.Visible = (bool)arg;
            break;
        case WaitFormCommand.SetProgressBarMaximum:

            //Gelen komut eğer SetProgressBarMaximum komutu ise, arg bir integer değer olmalıdır. Bu değeri biz progressbarımızın Properties.Maximum özelliğine aktarıyoruz.
            this.progressBarControl1.Properties.Maximum = (int)arg;
            break;
        case WaitFormCommand.SetProgressBarPosition:
            //Gelen komut eğer SetProgressBarPosition komutu ise, arg bir integer değer olmalıdır. Bu değeri biz progressbarımızın Position özelliğine aktarıyoruz.
            this.progressBarControl1.Position = (int)arg;
            break;             
    }

    base.ProcessCommand(cmd, arg);
}

Evet şimdi WaitForm tarafında işlemlerimiz tamamlandı. Bu wait formumuzu nasıl kullanacağımıza bakalım şimdi.

Form1 e geçiyorum ve bir adet GridControl nesnesini formuma ekliyorum. Datasource olarak NorthwindDb kullanacağım. Direkt olarak Dataset ile gride verileri çekiyorum. Formumuzun görünümü aşağıdaki şekilde olacaktır.

Şimdi yine F7 tuşuna basarak kod tarafına geçiyorum. Burada ilgili kodları ve açıklamaları dikkatlice okuyunuz.

Form1.cs

using DevExpress.XtraSplashScreen;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace WindowsFormsApplication12
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            ordersTableAdapter1.Fill(northwndDataSet1.Orders);
        }
 
        private void btnBaslat_Click(object sender, EventArgs e)
        {
            //SplashScreenManager classını kullanabilmeniz için using DevExpress.XtraSplashScreen; tanımını yapmanız gerekmektedir.
 
            /*
             * frmWait isimli WaitFormu açıyoruz.
             * ShowForm metodundan sonra SplashScreenManager içerisindeki Default isimli property ile, komut göndermek istediğimiz forma ulaşabiliriz.
             */
 
            SplashScreenManager.ShowForm(typeof(frmWait));
 
            /*
             * Başlık ve açıklama yazıları değiştiriliyor. 
             * Burada isterseniz enum içerisine başlık ve açıklama yazılarını değiştirmek için komut tanımlayabilir ve form tarafında da bu değişikliği yapabilirsiniz.
            */
            SplashScreenManager.Default.SetWaitFormCaption("Lütfen bekleyiniz..");
            SplashScreenManager.Default.SetWaitFormDescription("Liste üzerinde çalışılıyor..");
            
            //Başlamadan önce 3 saniye bekletiliyor.
            System.Threading.Thread.Sleep(3000);
 
            /*
             * WaitFormumuza SendCommand metodu ile istediğimiz komutu gönderiyoruz. 
             * Hatırlarsanız WaitForm içinde ProcessCommand isimli metod override edilmişti. Bizde içerisini değiştirmiştik. 
             * O şekilde gelen komutu işlemiştik. Bu da komutu gönderme kısmı.
            */
 
            //Öncelikle visible=true yaparak progressbarın görünmesini sağlıyoruz.
            SplashScreenManager.Default.SendCommand(frmWait.WaitFormCommand.SetProgressBarVisible, true);
 
            //Ardından Progressbarımızın maximum değerini bildiriyoruz.. (default olarak 100'dür bunu bildirmez isek for içerisinde i = 101 olduğunda hata alırız.)
            SplashScreenManager.Default.SendCommand(frmWait.WaitFormCommand.SetProgressBarMaximum, gridView1.RowCount);
 
            //Grid içerisindeki kayıt sayısı kadar dönerek progressbar üzerinde görüntüleme işlemi yapılıyor.
            for (int i = 0; i < gridView1.RowCount; i++)
            {
                //Açıklama yazısı içinde şu kadar işlem tamamlandı şeklinde bilgi veriyoruz..
                SplashScreenManager.Default.SetWaitFormDescription(string.Format("Yapılan işlem: {0}/{1}", i + 1, gridView1.RowCount));
 
                //Waitformumuza SetProgressBarPosition isimli komutu ve değerimizi göndererek, progressbarın ilerlemesini sağlıyoruz.
                SplashScreenManager.Default.SendCommand(frmWait.WaitFormCommand.SetProgressBarPosition, i);
 
                //Burada siz yapacağınız işlemlerinizi yapabilirsiniz. Ben sonucu görebilmek adına kısa bir süre uygulamayı uyuttum. :)
                System.Threading.Thread.Sleep(15);                
            }
            //Açılmış olan WaitFormu katapıyoruz..
            SplashScreenManager.CloseForm();
        }
    }
}

Ve mutlu son :) Uygulamamızın çalışır hali aşağıdaki resimdeki gibidir..

İsterseniz ilgili projeyi de buradan indirip inceleyebilirsiniz..

Başka bir makalede görüşmek üzere. Kalın sağlıcakla.