2011-12-09 33 views
10

SQLデータベース からデータを読み取っているときにユーザーに通知したいが、プログレスバーを使用してフォームを作成することにしたが、スレッドが必要なため。プログラムでフォームを作成したい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(); 

私の目標を達成するために上記のコードを変更するにはどうすればよいですか?

編集:Btw、私はこのプログレスバーフォームをプロジェクトのすべてのデータ関数で使いたいです。例:fillGrid、runQuery ..

@お返事ありがとうございます。別のフォーム(クラス)

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

から

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

と例のクエリと私はどのようにすることができます想像カント:私はどのように私は、例えば、クラスの機能を使用することができ、私のgridFill機能は、その接続クラスである意味しました私はbw_DoWorkイベントでそれを使用します。私の関数にはパラメータがあります。(query、gridview)別のクラスから呼び出すと、パラメータとともに使用できます。

p.s. :this Method私にはかなり良いですが、それは働かなかった。私は問題を理解しませんでした

+7

バックグラウンドワーカークラスを調べます。 http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx –

答えて

3

DataGridには、BackgroundWorkerクラスを使用してください。

 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を使用できます。コードが更新されます。

+0

コメントをいただきありがとうございます。私は少し問題があります。私のデータ塗りつぶし関数はクラス内にあり、2つのパラメータ(クエリとグリッドコントロール)を取り、プロジェクトのどこでも使用します。 public void fillGridControl(string sorgu、GridControl gc) { BindingSource dataSource = new BindingSource(Dt(sorgu) 、 ヌル); gc.DataSource = dataSource; } この関数をbw_DoWorkイベントに入れることはできますか? – Rapunzo

+1

@Rapunzo bw_DoWorkイベントの内部からfillGridControl関数を呼び出すことができます。あなたのコードはわかりませんが、これがうまくいかない理由は何ですか? – Will

+0

私は上記の私の答えを更新しました。 – Will

0

Ash Burlaczenkoと同じように、BackgroundWorkerを使用する必要があります。

ProgressBarでつなぎたいので、CodeProject:ProgressWorkerでこの記事を読むことをおすすめします。

使い方が簡単で、自動的にプログレスバーが自動的に更新されます。関連する進行状況バーを更新するには、随時、ProgressWorker.ReportProgressメソッドを呼び出すことを忘れないでください。

関連する問題