3

で困っていMarquee ProgressBarます。を取得するには、メソッド ( refreshList())を実行する必要がありList<string>ます。List次に、これをに割り当てるComboBoxのでComboBox、新しい で更新されItemsます。refreshList()3〜4秒かかるので、実行したかったMarquee ProgressBar. しかし、私はできませんでした。ProgressBar大丈夫ですが、ComboBoxnew をロードしませんItems

私のrefreshList()方法:

private void refreshList(List<string> list)
{
    albumList.DataSource = null;
    albumList.DataSource = list;
}

次のコードがありますが、正常に動作します。

private void changeDirectoryToolStripMenuItem_Click(object sender, EventArgs e)
{
    fbd.RootFolder     = Environment.SpecialFolder.MyComputer;
    folderPath = "";
    if (fbd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
    {
        folderPath     =  fbd.SelectedPath;
        refreshList(N.getList(folderPath));

    }
}

しかし、私は を追加してProgressBar、このコードを書きました:

private void changeDirectoryToolStripMenuItem_Click(object sender, EventArgs e)
{
    fbd.RootFolder     = Environment.SpecialFolder.MyComputer;
    folderPath = "";
    if (fbd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
    {
        folderPath     =  fbd.SelectedPath;
        bgWorker.WorkerReportsProgress = true;
        bgWorker.RunWorkerAsync();

    }
}

そして、私refreshList()doWork()メソッドに入れました:

private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
    refreshList(N.getList(folderPath));
}

しかし、残念ながらこれはうまくいきません。この問題を解決するのを手伝ってくれる人はいますか? 前もって感謝します。

4

1 に答える 1

1

ProgressBar コントロールのMarqueeAnimationSpeedおよびValueプロパティを使用して、マーキーを停止および開始できます。WorkerReportsProgress *を使用する必要はありません。通常の進行状況バーをインクリメントしていないためです。マーキーを「回転」させたいだけです。

次のようなことができます。

    public Form1()
    {
        InitializeComponent();
        //Stop the progress bar to begin with
        progressBar1.MarqueeAnimationSpeed = 0;             
        //If you wire up the event handler in the Designer, then you don't need 
        //the following line of code (the designer adds it to InitializeComponent)
        //backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted;
    }

    private void changeDirectoryToolStripMenuItem_Click(object sender, EventArgs e)
    {
        fbd.RootFolder = Environment.SpecialFolder.MyComputer;
        folderPath = "";
        if (fbd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            folderPath = fbd.SelectedPath;
            //This line effectively starts the progress bar
            progressBar1.MarqueeAnimationSpeed = 10;                 
            bgWorker.RunWorkerAsync(); //Calls the DoWork event

        }
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        e.Result = N.getList(folderPath); //Technically this is the only work you need to do in the background
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        //these two lines effectively stop the progress bar
        progressBar1.Value = 0;
        progressBar1.MarqueeAnimationSpeed = 0;
        //Now update the list with the result from the work done on the background thread 
        RefreshList(e.Result as List<String>);
    }


    private void RefreshList(List<String> results)
    {
        albumList.DataSource = null; //You don't need this line but there is no real harm.
        albumList.DataSource = list;
    }

RunWorkerCompletedデザイナーの [プロパティ] バーの [イベント] セクションを介して、イベントを backgroundWorker1_RunWorkerCompletedに接続することを忘れないでください。

まず、成功したフォルダー選択の一部として、MarqueeAnimationSpeed プロパティをゼロ以外の正の数に設定して、ProgressBar のアニメーションを開始します。

次に、RunWorkerAsync を呼び出した後、コードは DoWork メソッドでリストを作成し、その結果を DoWorkEventArgs に割り当てます。この結果は、RunWorkerCompleted イベント (DoWork の終了時に発生) に渡されます。

このbackgroundWorker1_RunWorkerCompletedメソッドでは、プログレス バーを停止し (値を 0 に設定して効果的に元の状態に戻します)、リストを refreshList メソッドに渡してデータバインドし、ComboBox に入力します。

VS2012、Windows フォーム、.Net 4.0 を使用してテスト済み (N.getList にかかる時間をエミュレートする Thread.Sleep を使用)

*WorkerReportsProgress および関連する ReportProgress メソッド/イベントは、進行状況バーを増やしたい場合に使用されます。GUI に 10% 完了、20% 完了、50% 完了などを伝えることができます。

于 2013-01-01T13:53:58.287 に答える