-4

私は C# プログラミングの初心者で、プロジェクト ファイルにプログレス バーを表示する方法に苦労しています。これを解決するのを手伝ってもらえますか?

以下は私のコードです:

try
{
    lblUpdate.Visible = true;
    lblUpdate.Refresh();

    string[] filenames = Directory.GetFiles(sTargetFolderPath);

    // Zip up the files - From SharpZipLib Demo Code
    using (ZipOutputStream s = new ZipOutputStream(File.Create(lblSaveTo.Text + "\\" + sZipFileName + ".pld")))
    {
        s.SetLevel(9); // 0-9, 9 being the highest level of compression

        byte[] buffer = new byte[4096];

        foreach (string file in filenames)
        {

            ZipEntry entry = new ZipEntry(Path.GetFileName(file));

            entry.DateTime = DateTime.Now;
            s.PutNextEntry(entry);

            using (FileStream fs = File.OpenRead(file))
            {
                int sourceBytes;
                do
                {
                    sourceBytes = fs.Read(buffer, 0, buffer.Length);
                    s.Write(buffer, 0, sourceBytes);

                } while (sourceBytes > 0);
            }
        }
        s.Finish();
        s.Close();
    }
}
4

2 に答える 2

0

DoWork メソッドで設定されたファイルを処理するときに UI をフリーズさせないように、backgroundworker を使用する必要があります。また、Progress イベントを使用してプログレス バーを設定する必要があり ます 。 filenames.Length であるファイルの数に対するプログレスバーの最大プロパティ

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Shown += new EventHandler(Form1_Shown);

            // To report progress from the background worker we need to set this property
            backgroundWorker1.WorkerReportsProgress = true;
            // This event will be raised on the worker thread when the worker starts
            backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
            // This event will be raised when we call ReportProgress
            backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
        }
        void Form1_Shown(object sender, EventArgs e)
        {
            // Start the background worker
            backgroundWorker1.RunWorkerAsync();
        }
        // On worker thread so do our thing!
        void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
           int i = 0; 
            foreach (string file in filenames)    
            {
                i++;
                // Report progress to 'UI' thread
                backgroundWorker1.ReportProgress(i);
               // Your background task goes here zip files
            }
        }
        // Back on the 'UI' thread so we can update the progress bar
        void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            // The progress percentage is a property of e
            progressBar1.Value = e.ProgressPercentage;
        }
    }
于 2012-08-31T22:48:09.640 に答える
-1

ツールブックからプログレスバーオブジェクトを作成します(ドラッグアンドドロップするだけです{または、コードを使用して自分で作成することもできます})。

次に、実行するファイルの数(100 / nNumOfFiles)を取得し、ループの各反復でその量だけバーを進行させます。ここで、「prbProgressBar」は進行状況バーです。

    try
{

lblUpdate.Visible = true;
lblUpdate.Refresh();
string[] filenames = Directory.GetFiles(sTargetFolderPath);

// Zip up the files - From SharpZipLib Demo Code
using (ZipOutputStream s = new ZipOutputStream(File.Create(lblSaveTo.Text + "\\" + sZipFileName + ".pld")))
{
    s.SetLevel(9); // 0-9, 9 being the highest level of compression

    byte[] buffer = new byte[4096];
    int nPercentToAdvance = (100 / filenames.Length);
    foreach (string file in filenames)
    {

        ZipEntry entry = new ZipEntry(Path.GetFileName(file));

        entry.DateTime = DateTime.Now;
        s.PutNextEntry(entry);

        using (FileStream fs = File.OpenRead(file))
        {
            int sourceBytes;
            do
            {
                sourceBytes = fs.Read(buffer, 0, buffer.Length);
                s.Write(buffer, 0, sourceBytes);

            } while (sourceBytes > 0);
        }

        this.prbProgressBar.Value += nPercentToAdvance;
    }
    s.Finish();
    s.Close();
}

}

于 2012-08-31T22:21:30.480 に答える