【解決方法】テキスト ボックスの値に応じてプログレス バーはどのように機能しますか?


<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

私が試したこと:

C#
 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)”. ただし、実際には、渡す値に対する検証はありません。ただし、それを使用してプログレス バーを更新する場合は、 MinimumMaximum その進行状況バーの値。

これらのエラーを修正すると、次のようになります。

C#
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

C#
int str = textbox1.text;

TextBox クラス (System.Windows.Forms) | マイクロソフト ラーン[^] という名前のプロパティがありません text. 指定するつもりなら Text、それはまだ間違っています Text プロパティは string ではない int.

解決策 4

そのコードはコンパイルされません:

C#
int str = textbox1.text;

は無効です C#: “text” は TextBox クラスのプロパティではありません。”Text” であり、C# からの暗黙的な変換はありません。 string 任意の数値型に。
さらに、DoWork デリゲートは UI スレッドではなくバックグラウンド ワーカー スレッドで実行されるため、何らかの方法で任意の Control にアクセスしようとすると、クロススレッド例外が発生します。これには TextBox.Text プロパティが含まれます。

代わりに、Tryparse を使用して値を変換する必要があります。

C#
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 フォームを閉じるのではなく、ビューから削除するだけです。

コメント

タイトルとURLをコピーしました