2016-06-04 2 views
0

Ich habe mehrzeilige Textbox, die ich den Wert für jede Zeile (sowie Index-Wert) mit;Foreach Line in Textfeld im Hintergrundarbeiter C# WPF

public void doProcess() 
{ 
     if (!string.IsNullOrEmpty(Convert.ToString(deliverynumbers.Text))) 
     { 

      string _deliverynumbers = deliverynumbers.Text; 
      string[] delimiter = {Environment.NewLine}; 
      string[] array_deliverynumbers = _deliverynumbers.Split(delimiter, StringSplitOptions.None); 

      int count = array_deliverynumbers.Length; 
      int current = 0; 

      foreach (string text in array_deliverynumbers) 
      { 
        if (!string.IsNullOrEmpty(Convert.ToString(text))) 
        { 

         current++; 
         Double Total_Percentage = count; 
         Double Current_Percentage = current; 
         Double progressAmount = (Current_Percentage/Total_Percentage * 100); 
         //backgroundWorker.ReportProgress(Convert.ToInt32(progressAmount)); 

         //could use this to update progress bar 
         //progress.Value = progressAmount; 

         //Do some other processes like for each line, create a file and name it to the value of the line value... 


        } 

       } 


     } 

} 

Allerdings, wenn ich die doProgress versuchen() innerhalb eines DoWork Anruf I „erhalten eine erste Chance Ausnahme des Typs 'System.InvalidOperationException' ... unten ist die DoWork Code;

private void DoWork(object sender, DoWorkEventArgs e) 
    { 
     //This works 
     for (int i = 0; i <= 100; i++) 
     { 
      Thread.Sleep(100); 
      backgroundWorker.ReportProgress(i); 
     } 

     //But this causes the exception 
     doProgress(); 
    } 

I haben auch verschiedene Teile des doProgress() Code entfernt, um zu sehen, was es tut, aber keiner funktioniert ...

EDIT

auch wenn (! String.IsNullOrEmpty (Convert.ToString (deliverynumbers.Text))) {} bricht es ..

private void DoWork(object sender, DoWorkEventArgs e) 
    { 
     if (!string.IsNullOrEmpty(Convert.ToString(deliverynumbers.Text))) 
     { 

     } 
    } 
+2

Direkter Zugriff auf UI-Steuerelemente vom Arbeitsthread erzeugt eine 'System.InvalidOperationException', Sie müssen auf Steuerelemente zugreifen, die einen Delegaten verwenden, oder Sie können Ihren textBox.Text als Argument an backgroundWorker oder thread übergeben. – raidensan

+0

Danke für die Idee Kumpel! +1 – BENN1TH

Antwort

0

habe es funktioniert ... nach unten ..

im Grunde das dauert Werte aus 2 Textfeldern (eins ist ein Pfadwert und eins ist ein Dateipfad) & ein mehrzeiliges Textfeld und für jede Zeile in der mehrzeiligen Textbox, kopieren Sie die Datei (Dateipfad Textfeld Wert) in den Ordner Pfad (Pfad Textfeld Wert) und Benenne die kopierte Datei in den Wert der Zeile um (aus mehrzeiliger Textbox).

es zu dieser Massenkopien einfach auszudrücken und benennt eine Datei in den ausgewählten Ordner aus der Liste in das mehrzeilige Textbox

Mein Onclick-Ereignis

public void begin_process_Click(object sender, RoutedEventArgs e) 
    { 

     //Hide Form 
     form_process.Visibility = Visibility.Hidden; 

     //Show Loader (with progress bar) 
     loader.Visibility = Visibility.Visible; 

     //Get Multiline Text Box Value 
     string _deliverynumbers = deliverynumbers.Text; 

     //Get source file path 
     string sourceFile = file_path.Text; 

     //Get copy to path 
     string destinationPath = share_drive_folder_path.Text; 

     //Create object to pass through backgroundWorker.RunWorkerAsync(args); 
     Object[] args = { _deliverynumbers, sourceFile, destinationPath }; 

     //pass "args" through.. 
     backgroundWorker.RunWorkerAsync(args); 

    } 

und in meinem DoWork() Methode - noch Ausnahme Ausnahme fangen und zusätzliche Ordner & Dateiprüfungen etc.

private void DoWork(object sender, DoWorkEventArgs e) 
    { 
     BackgroundWorker worker = sender as BackgroundWorker; 

     //Get arguments we passed in onclick event 
     Object[] arg = e.Argument as Object[]; 

     //Do stuff for multiline value - which is via (string)arg[0] 
     string[] delimiter = { Environment.NewLine }; 
     string _deliverynumbers = (string)arg[0]; 
     string[] array_deliverynumbers = _deliverynumbers.Split(delimiter, StringSplitOptions.None); 

     //Generate Indexing 
     int count = array_deliverynumbers.Length; 
     int current = 0; 

     //ForEach Line in multiline TextBox 
     foreach (string text in array_deliverynumbers) 
     { 
      if (!string.IsNullOrEmpty(Convert.ToString(text))) 
      { 

       //Update Indexing 
       current++; 

       //Determine Progress bar percentage 
       Double Total_Percentage = count; 
       Double Current_Percentage = current; 
       Double progressAmount = (Current_Percentage/Total_Percentage * 100); 

       //Copy source file for each line in TextBox & rename new copied file to the line value & source file format 
       string new_filename = text.Substring(2, text.Length - 2); 
       string sourceFile = (string)arg[1]; 
       string destinationPath = (string)arg[2]; 
       string destinationFileName = new_filename + System.IO.Path.GetExtension(sourceFile); 
       string destinationFile = System.IO.Path.Combine(destinationPath, destinationFileName); 

       //Check Folder exists 
       if (!System.IO.Directory.Exists(destinationPath)) 
       { 
        System.IO.Directory.CreateDirectory(destinationPath); 
       } 

       //Copy & Move and rename 
       System.IO.File.Copy(sourceFile, destinationFile, true); 

       //Sleep for a bit incase processing is to quick 
       Thread.Sleep(100); 


       //Update progress bar with new amount      
       backgroundWorker.ReportProgress(Convert.ToInt32(progressAmount)); 


      } 

     } 


    }