2017-11-24 4 views
1

データベースから選択してデータグリッドを設定するストアドプロシージャがあります。そのプロセスを進行状況バーに表示しようとしています。プログレスバーを期待どおりに動作させることができましたが、プロセスのパーセンテージを示すのが難しいです。私はどこが間違っているか知っていますが、私はそれを修正する方法を知らないだけです。私はprogressBar.Maximumをdt.Rows.Count.Andに設定しています。これは、私のデータベースに4つの項目があるため、最後に4%の例が得られたからです。 100の代わりにdoWorkのdt.Rows.Countに変更しても動作しません。どのようにテキストブロックの進行状況バーの割合を取得するには?

これは私のコードです:

private void bSelect_Click(object sender, RoutedEventArgs e) 
    { 
     BackgroundWorker worker = new BackgroundWorker(); 
     worker.WorkerReportsProgress = true; 
     worker.DoWork += worker_DoWork; 
     worker.ProgressChanged += worker_ProgressChanged; 

     worker.RunWorkerAsync(); 
     // int i = 0; 
     SqlConnection con = new SqlConnection(ConString); 
     SqlCommand cmd = new SqlCommand("tblProbaSelect", con); 
     cmd.CommandType = CommandType.StoredProcedure; 
     SqlParameter puname = new SqlParameter("@username", SqlDbType.NVarChar, 50); 
     SqlDataAdapter adapter; 
     DataSet ds = new DataSet(); 

     puname.Value = tbUsername.Text; 

     cmd.Parameters.Add(puname); 

     try 
     { 
      adapter = new SqlDataAdapter(cmd); 
      adapter.Fill(dt); 

      progressBar.Minimum = 0; 
      progressBar.Maximum = 100; 
      double step = (100/((double)dt.Rows.Count));v 

      /* 
      for (i = 0; i <= dt.Rows.Count - 1; i++) 
      { 
       progressBar.Value += 1; 
       Thread.Sleep(1000); 
       // MessageBox.Show(dt.Rows[i][0].ToString()); 
      }*/ 
      tabela.ItemsSource = dt.DefaultView; 
     } 

     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 

     finally 
     { 
      cmd.Dispose(); 
      con.Close(); 
     } 



    } 
    void worker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     for (int i = 0; i < 100; i++) 
     { 
      progressBar.Value += step; 
      (sender as BackgroundWorker).ReportProgress(i); 
      Thread.Sleep(100); 
     } 
    } 

    void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     progressBar.Value = e.ProgressPercentage; 
    } 

編集:私は、それが実際にデータベースクエリに基づいていない0から100.Butの割合を取得するために管理しています。 私が行った変更は、selectメソッドを関数に入れて、doWorkの部分でその関数を呼び出すことです。でも、進捗値はクエリ自体ではなくfor値に基づいています。 私の新しいコード:

public void selectQ() 
    { 
     SqlConnection con = new SqlConnection(ConString); 
     SqlCommand cmd = new SqlCommand("tblProbaSelect", con); 
     cmd.CommandType = CommandType.StoredProcedure; 
     SqlParameter puname = new SqlParameter("@username", SqlDbType.NVarChar, 50); 
     SqlDataAdapter adapter; 
     DataSet ds = new DataSet(); 


     this.Dispatcher.Invoke((Action)(() => 
     { 
      puname.Value = tbUsername.Text; 


     })); 
     cmd.Parameters.Add(puname); 
     try 
     { 
      adapter = new SqlDataAdapter(cmd); 
      adapter.Fill(dt); 
      this.Dispatcher.Invoke((Action)(() => 
      { 
       progressBar_Copy.Minimum = 0; 
       progressBar.Maximum = 100; 
       double step = (100/((double)dt.Rows.Count)); 


      })); 


      this.Dispatcher.Invoke((Action)(() => 
      { 
       // Thread.Sleep(1000); 
       tabela.ItemsSource = dt.DefaultView; 

      })); 

     } 

     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 

     finally 
     { 
      cmd.Dispose(); 
      con.Close(); 
     } 


    } 
void worker_DoWork(object sender, DoWorkEventArgs e) 
    { 
      for (int i = 0; i < 100; i++) 
      { 
       progressBar.Value += step; 
       (sender as BackgroundWorker).ReportProgress(i); 
       Thread.Sleep(100); 
      } 

     selectQ(); 
    } 
+0

のX%=(I * 100.0 /カウント) –

答えて

1

あなたは

progressBar.Maximum = 100; 
double step = (100/((double)dt.Rows.Count)); 

を必要とし、それは完全になるまでのサイクルのための

progressBar.Value += step; //At the very last step round to 100 
+0

私はのためにdoWork内側にパットしているし、それはあなたが私にあなたのコード表示することができ、それは – Alexander

+0

@Alexanderをしたのと同じ動作しますか? –

+0

私はコードで私の質問を編集しました。 – Alexander

0

の内側にこの操作の進行状況を知ることができません。プログレスバーの最大値を取得するには、すべてのレコードが必要です。あなたがあなたのすべての記録を持っていれば、その仕事はすでに完了しています。
DataTable.RowChangedイベントを使用して、データアダプタが新しい行をテーブルに追加したことを知ることができますが、長期実行操作(SQLクエリ)を2回実行することができます。あなたのプログレスバーは正常に動作しますDO NOT DO THAT DOAT

不確定なプログレスバーを使用して、表示のオンとオフを切り替えることをお勧めします。

<ProgressBar x:Name="progressBar_Copy" IsIndeterminate="True"/> 

または

progressBar_Copy.IsIndeterminate = true; 

あなたはあまりにもあなたの使い捨てのオブジェクトのためのブロックを使用して使用する必要があります。ただ、いずれかの背後にあるXAMLまたはコードでtrueにプログレスバーのIsIndeterminateプロパティを設定します。私はあなたにサンプルを書いた。

void ExecuteQuery() 
    { 
     BackgroundWorker worker = new BackgroundWorker(); 
     worker.DoWork += worker_DoWork; 
     worker.RunWorkerCompleted += worker_RunWorkerCompleted; 
     progressBar_Copy.Visibility = Visibility.Visible; 
     worker.RunWorkerAsync(tbUsername.Text); 
    } 

    void worker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     BackgroundWorker worker = sender as BackgroundWorker; 
     string username = e.Argument as string; 
     if (!string.IsNullOrEmpty(username)) 
     { 
      using (SqlConnection con = new SqlConnection(ConString)) 
      using (SqlCommand cmd = new SqlCommand("tblProbaSelect", con)) 
      { 
       cmd.CommandType = CommandType.StoredProcedure; 
       cmd.Parameters.AddWithValue("@username", username); 
       using (SqlDataAdapter adapter = new SqlDataAdapter(cmd)) 
       { 
        DataTable dt = new DataTable(); 
        try 
        { 
         con.Open(); 
         adapter.Fill(dt); 
         e.Result = dt; 
        } 
        catch (Exception ex) 
        { 
         e.Result = ex; 
        } 
       } 
      } 
     } 
    } 

    private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     if (e.Result is Exception) 
     { 
      MessageBox.Show(((Exception)e.Result).Message); 
     } 
     else 
     { 
      DataTable dt = e.Result as DataTable; 
      if (dt != null) 
       tabela.ItemsSource = dt.DefaultView; 
     } 

     progressBar_Copy.Visibility = Visibility.Hidden; 
    } 
+0

私は未確定のプログレスバーを作成することができました。私はパーセンテージでそれを作ることができるかどうかを知りたがっています。 – Alexander

+0

私が述べたように、クエリを2回実行する必要があります。一度行数を取得すると、2回目に行ったときに、DataTable.RowChangedイベントに接続し、ワーカーの進行状況を変更してパーセンテージを更新するように呼び出します。進行中のバーを表示するだけで、作業を2倍にすることができます。 – cjmurph

関連する問題