2016-02-05 2 views
0

Теперь я сообщаю о каждом имени файла, в котором я ищу, и он работает нормально. Но теперь я также хочу сообщить о процентах прогресса в progressBar1, который у меня есть в дизайнере. В расчет также следует включить, если программа вводит цикл while. Я добавил переменную counterFiles, но не знаю, как это сделать.Как я могу рассчитать проценты и сообщить об этом фоном?

У меня есть этот метод:

public List<string> FindLines(string DirName, string TextToSearch) 
{ 
    int countFiles = 0; 
    int counter = 0; 
    List<string> findLines = new List<string>(); 
    DirectoryInfo di = new DirectoryInfo(DirName); 

    if (di != null && di.Exists) 
    { 
     if (CheckFileForAccess(DirName) == true) 
     { 
      foreach (FileInfo fi in di.EnumerateFiles("*", SearchOption.AllDirectories)) 
      { 
       if (string.Compare(fi.Extension, ".cs", true) == 0) 
       { 
        countFiles++; 
        //countFiles/
        backgroundWorker1.ReportProgress(0, fi.Name); 
        System.Threading.Thread.Sleep(200); 
        using (StreamReader sr = fi.OpenText()) 
        { 
         string s = ""; 
         while ((s = sr.ReadLine()) != null) 
         { 
          if (s.Contains(TextToSearch)) 
          { 
           counter++; 
           findLines.Add(s); 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
    return findLines; 
} 

В BackgroundWorker DoWork и progresschanged события

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
     FindLines(@"d:\c-sharp", "string s1 = treeView1.SelectedNode.Tag as string;"); 
} 

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    label2.Text = e.UserState.ToString(); 
} 
+0

Вы пробовали поиск в google на progressbar и progress progress рабочий рабочий. Http://stackoverflow.com/questions/13874122/running-a-method-in-backgroundworker-a nd-show-progressbar – MethodMan

+0

Я знаю формулу для расчета прогресса * total/100 Проблема в том, как узнать общее количество в моем коде? В ссылке вы указали, что пользователь знает количество файлов, но как я могу найти количество каталогов в моем коде как общее? –

+0

есть несколько проектов, которые показывают, что вы ищете, есть один на сайте «CodeProject» .. выполните поиск в Google для 'C# CodeProject backgroundworker progressbar' – MethodMan

ответ

0

Вам нужно будет использовать AJAX в Jquery, чтобы сделать это.

В файле CS:

Declare:

public static int DownloadPercent { get; set; } 

Затем с помощью метода загрузки, прогресс изменил метод, и полный методы:

private void StartDownload(string DownloadSource, string SaveLocation) 
    { 
     try 
     { 
      Thread thread = new Thread(() => 
      { 
       WebClient client = new WebClient(); 
       client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged); 
       client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted); 
       client.DownloadFileAsync(new Uri(DownloadSource), SaveLocation); 
      }); 
      thread.Name = "aFieldDownload"; 
      thread.Start(); 
     } 
     catch (Exception err) 
     { 
      DownloadPercent = 999; 
     } 
    } 
    void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) 
    { 
     byteHasBeenDownloaded = true; 
     try 
     { 
      double bytesIn = double.Parse(e.BytesReceived.ToString()); 
      double totalBytes = double.Parse(e.TotalBytesToReceive.ToString()); 
      double percentage = bytesIn/totalBytes * 100; 
      DownloadPercent = int.Parse(Math.Truncate(percentage).ToString()); 
     } 
     catch (Exception err) 
     { 
      DownloadPercent = 999; 
     } 
    } 
    void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e) 
    { 
     if (byteHasBeenDownloaded) 
     { 
      DownloadFinishTime = DateTime.Now; 
      UpdateActionDuration(false); 
     } 
    } 

Затем добавьте этот метод, который вы будете звоните с использованием AJAX для обновления процентов:

[WebMethod] 
    public static int GetDownloadPercentage() 
    { 
     return DownloadPercent; 
    } 

Для JavaScript, используйте это в качестве загрузки документа:

$(document).ready(function() { 
    setTimeout(updateDownProgress, 100); 
}); 

Используйте эту функцию JavaScript в качестве Updater:

function updateDownProgress() { 
$.ajax({ 
    type: "POST", 
    url: "Home.aspx/GetDownloadPercentage", 
    data: "{}", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    async: true, 
    success: function (msg) { 
     $("#cp_MAIN_CONTENT_DownPercentage").text(msg.d + "% DOWNLOADED"); 
     $("#cp_MAIN_CONTENT_progressBarDown").val(msg.d); 
     if (msg.d < 100) { 
      setTimeout(updateDownProgress, 100); 
      if (msg.d > 0) { $(".StartDownloadButton").prop("disabled", true); } 
      else { $(".StartDownloadButton").prop("disabled", false); } 
     } 
     else if (msg.d > 100) { 
      //Use for Error codes 
     } 
    } 
}); 
} 

И, наконец ... Используйте этот HTML для вашего прогресса:

<asp:Panel ID="pDownLoading" CssClass="loading" runat="server"> 
      <progress id="progressBarDown" runat="server" value="0" max="100"></progress> <asp:Label ID="DownPercentage" runat="server"></asp:Label> 
     </asp:Panel> 
Смежные вопросы