[ad_1]
<pre lang="text">Entering 30 inside the textbox should complete the progress bar and entering 300 should complete the progress bar. my actual problem :- When entering 30, the progress bar is completed once and the progress starts again ,And the form should be closed when the progress bar is complete
私が試したこと:
private void form_Load(object sender, EventArgs e) { backgroundWorker1.WorkerReportsProgress = true; backgroundWorker1.RunWorkerAsync(); } private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { int str = textbox1.text; for (int i = 0;i <= str; i++) { // updatepicbox(); backgroundWorker1.ReportProgress(i); System.Threading.Thread.Sleep(100); } } private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { updatepicbox(); progressBar1.Value = e.ProgressPercentage; label1.Text = string.Format("{0}%", e.ProgressPercentage); progressBar1.Update(); } private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { this.Hide(); }
解決策 2
あ TextBox
を持っていません text
財産。 プロパティは呼び出されます Text
– C# では大文字と小文字が区別されることに注意してください。
の Text
プロパティは string
. その値を int
変数。
(ここで VB.NET からコードを変換しようとしているのではないかと疑い始めています。)
へのパラメータ の ReportProgress
方法[^] として文書化されています “完了したバックグラウンド操作の割合 (0 ~ 100)”. ただし、実際には、渡す値に対する検証はありません。ただし、それを使用してプログレス バーを更新する場合は、 Minimum
と Maximum
その進行状況バーの値。
これらのエラーを修正すると、次のようになります。
private void Form_Load(object sender, EventArgs e) { if (!int.TryParse(textbox1.Text, out int maximum)) maximum = 100; progressBar1.Minimum = 0; progressBar1.Maximum = maximum; backgroundWorker1.WorkerReportsProgress = true; backgroundWorker1.RunWorkerAsync(maximum); } private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { int maximum = (int)e.Argument; for (int i = 0; i <= maximum; i++) { backgroundWorker1.ReportProgress(i); System.Threading.Thread.Sleep(100); } } private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { updatepicbox(); progressBar1.Value = e.ProgressPercentage; double percentComplete = (double)e.ProgressPercentage / progressBar1.Maximum; label1.Text = percentComplete.ToString("P0"); }
解決策 3
int str = textbox1.text;
の TextBox クラス (System.Windows.Forms) | マイクロソフト ラーン[^] という名前のプロパティがありません text
. 指定するつもりなら Text
、それはまだ間違っています Text
プロパティは string
ではない int
.
解決策 4
そのコードはコンパイルされません:
int str = textbox1.text;
は無効です C#: “text
” は TextBox クラスのプロパティではありません。”Text
” であり、C# からの暗黙的な変換はありません。 string
任意の数値型に。
さらに、DoWork デリゲートは UI スレッドではなくバックグラウンド ワーカー スレッドで実行されるため、何らかの方法で任意の Control にアクセスしようとすると、クロススレッド例外が発生します。これには TextBox.Text プロパティが含まれます。
代わりに、Tryparse を使用して値を変換する必要があります。
int val; if (!int.TryParse(textbox1.text, out val)) { ... report problem to user, it's not a number ... return; } ...
ただし、そのコードは、バックグラウンド ワーカーではなく、GUI スレッドで実行する必要があります。
TextBox.TextChanged メソッドを処理し、ワーカー スレッドでチェックできるクラス レベルの変数を更新します。 lock
複数のスレッドアクセスの問題を防ぐための変数、とにかく 30 * Sleep(100) はわずか 3 秒であり、 Hide
フォームを閉じるのではなく、ビューから削除するだけです。
[ad_2]
コメント