2016-06-01 9 views
0

Ich schreibe eine C# Desktop-Anwendung, die eine DLL (die ich schrieb) verwendet, um Daten aus einer Datenbank abrufen.Aktualisieren einer C# Desktop-Anwendung GUI von einer DLL

Die DLL hat eine Vielzahl von Funktionen, je nachdem, welche Daten der Benutzer wünscht. Ich möchte ein Etikett auf der Benutzeroberfläche meiner Anwendung aktualisieren, wie die Datenbankfunktionen in der DLL abgeschlossen sind.

mein Code wie so angelegt:

Anwendung:

private void getData(object sender, EventArgs e) 
{ 
    dll.DoDatabaseFunctions(); 
} 

DLL:

public static DataTable getThisStuff 
{ 
    //connections to SQL DB and runs command 
    //HERE is where I would like to send something back to the application to update the label 
} 

public static DataTable getThatStuff 
{ 
    //connections to SQL DB and runs command 
    //HERE is where I would like to send something back to the application to update the label 
} 

würden Irgendwelche Ideen sehr geschätzt!

+0

Sind die Daten irgendwo in der 'DataTable' Sie zurückkommen? Kann das Formular diesen Wert nicht erhalten und das Label aktualisieren? –

+0

Verwenden Sie Ereignisse, überprüfen Sie [dieses Lernprogramm] (https://msdn.microsoft.com/en-us/library/aa645739 (v = vs.71) .aspx) – Maarten

+0

Entschuldigung, die DLL erstellt eine PDF-Datei mit den Daten aus die Funktionen. Die DLL gibt nur einen Dateipfad zurück, um die PDF zu öffnen, sobald alle Datenbankfunktionen abgeschlossen sind. Ich möchte im Grunde, dass die DLL die Anwendung dynamisch auf dem aktuellsten Stand hält. –

Antwort

1

Erstellen Sie eine event in Ihrer DLL-Klasse, die Sie in Ihrem GUI abonnieren können.

Declare Ereignis in Ihrem DLL:

public event Action DataReady; 

Raise Ereignis in dll bei Bedarf:

DataReady?.Invoke(); 

oder

var dataReady = DataReady; 
if (dataReady != null) 
    dataReady(); 

in gui Ereignis abonnieren:

dll.DataReady += OnDataReady; 

Update-Label in gui wenn Ereignis ausgelöst wird:

public void OnDataReady() 
{ 
    label.Text = "Whatever"; 
} 

Sie Action<T1,..,Tn> für Ihre Veranstaltung verwenden können, wenn Sie die Parameter benötigen. Zum Beispiel:

public event Action<string> DataReady; 
DataReady?.Invoke("data"); 

dll.DataReady += OnDataReady; 
public void OnDataReady(string arg1) 
{ 
    label.Text = arg1; 
} 

Schließlich Austragen Ereignis, wenn nicht mehr benötigt:

dll.DataReady -= OnDataReady; 
+0

Sie sind mein Held, vielen Dank –

+0

Kein Problem! Wenn dies für Sie funktioniert und Sie glauben, dass es anderen helfen kann, markieren Sie es bitte als Antwort. Vielen Dank – Tom

0

Sie Veranstaltungen nutzen können. Definieren Sie ein Ereignis in Ihrer DLL-Klasse, und Sie können nicht wirklich Statik verwenden, da Sie eine Instanz benötigen (statische Ereignisse sind keine gute Idee).

Etwas wie folgt aus:

private void getData(object sender, EventArgs e) 
{ 
    var dllInstance = new Dll(); 
    dll.Updated += dllUpdateReceived; 
    dllInstance.DoDatabaseFunctions(); 
} 

private void dllUpdateReceived(object sender, DllUpateEventArgs e) 
{ 
    var updateDescription = e.UpdateDescription; 
    // TODO: Update a label with the updates 

} 

Und die notwendigen thingies im DLL-Projekt:

public class DllUpdateEventArgs: EventArgs { 
    public string UpdateDescription { get; set; } 
} 

public class Dll { 
    public event EventHandler<DllUpdateEventArgs> Updated; 
    private void OnUpdated(string updateDescription) { 
     var updated = Updated; 
     if (updated != null) { 
      updated(this, new DllUpdateEventArgs { UpdateDescription = updateDescription }); 
     } 
    } 

    public void DoDatabaseFunctions() { 
     // Do things 
     OnUpdated("Step 1 done"); 
     // Do more things 
     OnUpdated("Step 2 done"); 
     // Do even more things 
     OnUpdated("Step 3 done"); 
    } 
} 
Verwandte Themen