データベースから選択してデータグリッドを設定するストアドプロシージャがあります。そのプロセスを進行状況バーに表示しようとしています。プログレスバーを期待どおりに動作させることができましたが、プロセスのパーセンテージを示すのが難しいです。私はどこが間違っているか知っていますが、私はそれを修正する方法を知らないだけです。私は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();
}
のX%=(I * 100.0 /カウント) –