Laden...

Keine Programmlogik im Formular und umgekehrt

Erstellt von barzefutz vor 16 Jahren Letzter Beitrag vor 16 Jahren 2.748 Views
B
barzefutz Themenstarter:in
95 Beiträge seit 2007
vor 16 Jahren
Keine Programmlogik im Formular und umgekehrt

Hallo!

Eins vorneweg: Ich habe die Suchfunktion bereits benutzt, aber von den Sachen die ich dort zum Thema gefunden habe, habe ich leider nichts verstanden.

Es geht um die Trennung von Programmlogik und Formularen. Ich habe irgendwo mal gelesen, der Formularcode soll wirklich nur Dinge machen, die direkt mit vom Benutzer ausgelösten Ereignissen und anderen Formularobjekten zusammenhängen. Also hieße das doch vereinfacht gesagt, dass alle möglichen Formularobjekte nur die Benutzerinteraktion entgegennehmen und dann Methoden einer Programmlogik-Klasse aufrufen.

Dazu habe ich aber ein paar Fragen:

Nehmen wir an, ich habe einen Button "Download". Wenn dieser geklickt wird, ruft das Formular eine Downloadmethode der Logik-Klasse auf. Wenn der Download erfolgreich gestartet wurde, soll der Download-Button inaktiviert werden (also nicht mehr klickbar). Wie würde man das machen? Den Button aus der Logik-Klasse heraus zu deaktivieren wäre ja mehr als "dreckig", da diese Klasse ja eigentlich nichts mit den Formularobjekten am Hut haben sollte. Aber wie geht es sonst?

Und dann:
Vielleicht hat ja jemand von euch einen Link zu einem fertigen C#-Projekt, wo die Trennung von Formularen, Programmlogik und Daten vorbildlich gelöst wurde? Ich habe mir einige Open-Source-C# Projekte angeschaut, doch zu meiner Enttäuschung war in diesen Projekten keine vorbildliche Trennung der genannten Komponenten vorhanden.

Ich bedanke mich im Voraus bei allen, die mir antworten!

1.549 Beiträge seit 2004
vor 16 Jahren

mach das doch mit threads. also den downlod in einen neuen Thread starten und danach den butten deaktiviren

Wir Arbeiten eigendlich nicht wir nehmen nur das geld

S
8.746 Beiträge seit 2005
vor 16 Jahren

Werfe man die Forums-Suche an und suche nach "MVC". Das ist ein Pattern in der Art, die dir vorschwebt. Da wirst du auch einige Alternativen dazu finden.

2.187 Beiträge seit 2005
vor 16 Jahren

Tach


public class Downloader
{
  public event EventHandler DownloadStarted;
  public void StarDownload()
  {
     // Download als Thread starten ...
     if(this.DownloadStarted!=null)
     {
       this.DownloadStarted(this,new EventArgs());
     }
  }
}

public class Form : System.Windows.Forms.Form
{
  private void Button_Click(object sender, EventArgs e)
  {
    Downloader download = new Downloader(/* Wat ever*/);
    download.DownloadStarted += new EventHandler(this.download_DownloadStarted);
    download.StartDownload();
  }

  private void download_DownloadStarted(object sender, EventArgs e)
  {
    this.Button.Enabled = false;
  }
}

Dann Brauchst du natürlich auch noch weitere Events, für ander GUI aktionen.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo barzefutz,

den konkreten Fall würde wohl man mit Events realisieren. Mach in deiner Logic-Klasse eigene Events ([FAQ] Eigenen Event definieren) für Download(Successful)Started und DownloadCompleted (und vielleicht noch DownloadAborted). Das GUI abonniert dann die Events und kann in den EventHandlern die Buttons (de)aktivieren.

herbivore

R
265 Beiträge seit 2005
vor 16 Jahren

Hallo Leute,

warum nicht direkt:


private void Button_Click(object sender, EventArgs e)
  {
    Button.Enable = false;
    Downloader download = new Downloader(/* Wat ever*/);
    download.StartDownload();
  }


2.187 Beiträge seit 2005
vor 16 Jahren

Na weil StarDownload nur ein Beispiel war. Es geht ja allgemein um die Entkoplung von Logick und UI. =)

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Reverent,

damit hast du ja nur das Problem des Deaktivierens gelöst. Das Problem mit dem späteren Aktivieren bleibt. Mit Events kann man beides lösen.

herbivore

B
barzefutz Themenstarter:in
95 Beiträge seit 2007
vor 16 Jahren

Klasse, vielen Dank für eure Antworten! Besonders das Beispiel ist sehr anschaulich. Ich werde es mal ausprobieren und wenn noch Fragen sind, melde ich mich. Bis dahin vielen vielen Dank!

: Noch eine kurze Frage: Nehmen wir an, ich würde die Downloader-Klasse in nahezu allen Formular-Events benötigen. Wäre es dann in Ordnung, sie am Anfang der Formularklasse zu deklarieren und sie damit für das gesamte Formular zugänglich zu machen? Oder macht man sowas in der Regel nicht?

363 Beiträge seit 2007
vor 16 Jahren

Na wenn deine Klasse recht neutral ist reicht ein Deklaration und Initialisierung aus. Sofern du deine Parameter an die Methoden übergibst. Mußt du das allerdings im Konstruktor machen, wirst du um einen separaten Aufruf nicht herum kommen.

Gruß Cookiie

"Hail to the King, Baby!"

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo barzefutz,

nehmen wir an, ich würde die Downloader-Klasse in nahezu allen Formular-Events benötigen.

da die Downloader-Klasse das GUI und damit das Form nicht kennt/kennen soll/kennen darf, erübrigt sich die Frage eigentlich schon im Ansatz.

Andersherum ist es natürlich ok. Das Formular darf eine Instanz der Downloader-Klasse natürlich in den Instanzvariablen speichern.

herbivore

B
barzefutz Themenstarter:in
95 Beiträge seit 2007
vor 16 Jahren

Hallo,

ich bins nochmal. Ich habe noch eine Frage. Nehmen wir an, ich habe eine Funktion, die ein Array aus einer Datenbank holt. Dann möchte ich eine ListBox oder was auch immer mit den Daten aus diesem Array füllen. Ist es dann angemessen, im Formularcode (beispielsweise im Click-Event eines Buttons) das Array in einer Schleife zu durchlaufen und die ListBox zu füllen? Oder gibt es auch dafür einen eleganteren Weg (da ja im Formularcode möglichst keine Programmlogik sein sollte)?

Danke schön für alle Antworten!

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo barzefutz,

st es dann angemessen, im Formularcode (beispielsweise im Click-Event eines Buttons) das Array in einer Schleife zu durchlaufen und die ListBox zu füllen?

ja, klar.

(da ja im Formularcode möglichst keine Programmlogik sein sollte)

Das füllen einer ListBox ist ja keine Programmlogik (im Sinne von Businesslogik) sonder nGUI-Logik und deshalb ist es nicht nur ok, wenn das Formular die ListBox füllt, sondern das Formular ist für das Füllen der ListBox zuständig.

Oder gibt es auch dafür einen eleganteren Weg?

Ja, DataBinding.

herbivore