2017-03-23 3 views
0

Ich bin in meiner Windows Form-Anwendung Logik von einer Klasse zu einer anderen zu trennen. Wenn alles in einer Klasse funktioniert, funktioniert es gut, aber ich verlagere die Logik jetzt auf die eigenen Klassen. Probleme mit dem backgroundWorker aus einer anderen Klasse haben.Zugriff auf Hintergrundarbeitskraft aus einer anderen Klasse

ich in Klasse A

public partial class ClassA : Form 
    BackgroundWorker essentialBgWorker = new BackgroundWorker(); 

    public ClassA() 
     { 
      InitializeComponent(); 
      //essentialBgWorker 
      essentialBgWorker.DoWork += new DoWorkEventHandler(essentialBgWorker_DoWork); 
      essentialBgWorker.ProgressChanged += new ProgressChangedEventHandler(essentialBgWorker_ProgressChanged); 
      essentialBgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(essentialBgWorker_RunWorkerCompleted); 
      essentialBgWorker.WorkerReportsProgress = true; 
     } 

Das ist eine Form, die eine Taste aufweist, die bei Anklicken kopiert Dateien in ein anderes Verzeichnis. Diese

private void copyButton_Click(object sender, EventArgs e) 
{ 
    clickedButton = ((Button)sender).Name.ToString(); 
    itemsChanged = ((Button)sender).Text.ToString(); 
    essentialBgWorker.RunWorkerAsync(); 
} 

läuft die Hintergrundarbeiter:

public void essentialBgWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    string buttonSender = clickedButton; //copyButton, deleteButton, etc. 
    switch (buttonSender) 
    { 
     case "copyButton": 
      //this is pseudocode - the important part being that this is where I would call the method from the other class 
      ClassB.copyDocuments(); 
      break; 
     case "deleteButton": 
      //this is pseudocode - the important part being that this is where I would call the method from the other class 
      ClassB.deleteDocuments(); 
      break; 
     default: 
      essentialBgWorker.CancelAsync(); 
      break; 
    } 
} 

In meiner anderen Klasse (ClassB) für dieses Beispiel habe ich die Methode, die aufgerufen wird, wenn die Schaltfläche geklickt wird (sollte die Logik sein Handling).

public void copyDocuments() 
{ 
    ClassA classA = new ClassA(); 
    // 
    //the logic that handles copying the files 
    //gets the filecount! 

    //Report to the background worker 
    int totalFileCount = fileCount; 
    int total = totalFileCount; //total things being transferred 
    for (int i = 0; i <= total; i++) //report those numbers 
    { 
     System.Threading.Thread.Sleep(100); 
     int percents = (i * 100)/total; 
     classA.essentialBgWorker.ReportProgress(percents, i); 

     //2 arguments: 
     //1. procenteges (from 0 t0 100) - i do a calcumation 
     //2. some current value! 
    } 
    //Do the copying here 
} 

Ich halte ein Problem mit dieser Linie mit:

classA.essentialBgWorker.ReportProgress(percents, i);

Diese Linie gearbeitet, als es in KlasseA war - aber sobald es in ClassB bringen gibt einen Fehler:

ClassA.essentialBgWorker' is inaccessible due to it's protection level

Nur auf der Suche nach etwas Hilfe auf dem richtigen Weg zu bekommen es von der anderen Klasse zu feuern.

+1

Ist "essentialBgWorker" eine Öffentlichkeit? Und wenn ja, stellen Sie sicher, dass es nicht statisch ist. – Trey

+0

Können Sie die Deklaration von essentialBgWorker in KlasseA hinzufügen? –

+0

Aktualisiert den Code mit der Erklärung des Arbeitnehmers in ClassA – Hanny

Antwort

1

Sie müssen hinzufügen öffentlichen Modifikator essentialBgWorker

public BackgroundWorker essentialBgWorker = new BackgroundWorker(); 
+0

Bam, arbeitete wie ein Charme. Zahlen, es wäre etwas so einfaches !! – Hanny

+0

Semi verwandt - aber ClassA ist eine Form (wie Sie sehen können); Wenn ClassA derzeit in ClassB instanziiert wird, lädt es während der Ausführung der Arbeit eine sekundäre Form. Gibt es eine Möglichkeit, dies zu verhindern? – Hanny

+0

Benötigen Sie ClassA als Formular? –

Verwandte Themen