2012-05-09 2 views
1

В моей winform есть индикатор выполнения, который должен увеличиваться в зависимости от количества файлов, которые обрабатывает программа. он отлично работает на одном поле (win xp), но не на другом (winserver 2008). К моменту завершения процесса бар не заполняется полностью. Оба имеют одинаковый каркас .net 3.5C# dynamic ProgressBar

private void data_process() 
    { 
     int progress_num = (100/checkedListBox1.Items.Count); 
     ....... 
     progressBar1.Value = progressBar1.Value + progress_num;} 

Знаете ли вы, почему? и у вас есть лучшее решение?

------ это новый код

private void button1_Click(object sender, EventArgs e) 
{ 
     progressBar1.Value = 0; 
     richTextBox1.Clear(); 
     richTextBox1.Focus(); 
     if (checkedListBox1.CheckedItems.Count < 1) 
     { 
      MessageBox.Show("No file is selected", "Warning"); 

     } 

     else 
     { 
      if ((region != null) && (venue != null) && (lhversion != null) && (release_version != null) && (desc != null)) 
      { 
       progressBar1.Maximum = checkedListBox1.Items.Count + 3; 
       progressBar1.Step = 1; 
       //progressBar1.Value = progressBar1.Value + 10; 
       progressBar1.PerformStep(); 
       login(); 
       //progressBar1.Value = progressBar1.Value + 10; 
       progressBar1.PerformStep(); 
       data_process(); 
       //progressBar1.Value = progressBar1.Value + 10; 
       progressBar1.PerformStep(); 
       if (user_in == true) 
       { 
        richTextBox1.SelectionColor = Color.Blue; 
        richTextBox1.AppendText("Done"); 
       } 
      } 

private void data_process() 
{ 
      string line; 
      //int progress_num = (70/checkedListBox1.Items.Count); 

      foreach (object itemChecked in checkedListBox1.CheckedItems) // for each selected file 
      { 
        ... 
        progressBar1.PerformStep(); 
      } 
} 
+2

Хорошо, «что не работает нормально»? Убедитесь, что вы «уступаете» управление интерфейсу, чтобы он мог реагировать на события и рисовать вещи. (Долгосрочные задачи часто запускаются в другом потоке, скажем, с помощью [BackgroundWorker] (http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx), который поддерживает отчетность.) –

+0

Бар не заполняется полностью к моменту окончания процесса –

ответ

3

Постараюсь использовать родную команду, чтобы увеличить индикатор без расчета приращения
(что происходит, когда детали> 100 ?)

progressBar1.Maximum = checkedListBox1.Items.Count; 
progressBar1.Step = 1; 
... 
progressBar1.PerformStep(); 
+0

Я думал, что 100 представляет 100%. поэтому, если у вас есть 5 файлов, каждый раз, когда вы закончите с файлом, бар увеличивается на 20%. это не ?? –

+0

Да, Максимум будет 5, поэтому 1 шаг будет нарисовать пятую ширину полосы выполнения. [См. Здесь] (http://msdn.microsoft.com/en-us/library/system.windows.forms.progressbar.maximum.aspx) – Steve

+0

Мне кажется, что вы теряете информацию о ходе работы в своем коде. Например, если у вас есть 75 элементов в вашем списке, вы получите значение приращения 1,33333. Int будет округлять до 1, поэтому вы теряете одну треть элемента прогресса при каждом обновлении в этом примере. Это может привести к тому, что ваш бар не будет «заполнен», когда процесс будет завершен. – Chris