Laden...

Felder sperren / Methode ausführen

Erstellt von Dexter323 vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.199 Views
D
Dexter323 Themenstarter:in
89 Beiträge seit 2008
vor 16 Jahren
Felder sperren / Methode ausführen

Guten morgen,

ich wärme mal wieder ein bsetimmt 100 mal angesprochenes Problem auf, aber die Hilfe unter [FAQ] Kommunikation von 2 Forms hilft nicht wirklich weiter.

es geht um folgendes:

Habe ein Form, welches mit als Hauptmenu dient
in diesem Form gibt es einen Button der bei Click ein 2. Form ausführt, das so ausschaut

nun soll auf "Abmelden" buttons , label und textfelder andere eigenschaften , z.B: "Enabled = false" u.a. gesetzt werden.

Der Lösungsansatz von mir und meinem Kollegen sieht wie folgt aus....
inklusive der tollen Fehlermeldung 🤔

3.511 Beiträge seit 2005
vor 16 Jahren

In so einem Falle arbeite ich immer mit Interfaces. Sprich, es gibt ein Interface z.B. IMainWindow, welches alle Methoden bereit stellt, die das Verhalten der MainForm verändern können.
Hier in deinem Falle wäre es anscheinend die Methode set_loggedout. Dein Interface könnte also so ausehen


public interface IMainWindow
{
  bool SetLoggedOut();
}

Wenn du jetzt eine weitere Form erzeugst, übergibst du das Interface an die Form


// Ich gehe davon jetzt aus, das diese Methode in der MainForm steht und
// diese Form IMainWindow implentiert.
using (AndereForm form = new AndereForm(this))
{
  // Machwas.
}

"this" setze ich hier ein, weil der Constructor der "AndereForm" so aussieht. Da die Form, die das Interface implementiert, kann man hier this schreiben.


private IMainWindow m_MainWindow;

public AndereForm(IMainWindow mainWindow)
{
  this.m_MainWindow = mainWindow;
}

Jetzt kannst du irgendwo in der neuen Form sagen


public void ButtonClick(object sender, EventArgs e)
{
  if (this.m_MainWindow.SetLoggedOut())
    Console.WriteLine("Hat geklappt");
}

Ich mach es immer so, das alle Methoden des Interfaces entweder ein bool, oder ein int zurückgeben, damit die Klasse, die das Interface nutzt auch weis, ob der jeweilige Aufruf auch wirklich geklappt hat. Oder man gibt bei Objekten null zurück, um festzustellen, ob es geklappt hat.

So, ich hoffe du hast es einigermaßen verstanden 🙂

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

D
Dexter323 Themenstarter:in
89 Beiträge seit 2008
vor 16 Jahren

fast ganz verstanden, nur ....


private IMainWindow m_MainWindow;

public AndereForm(IMainWindow mainWindow)
{
  this.m_MainWindow = mainWindow;
}

habe kein Object von IMainWindow, is ja das Interface. Muss ich auch implementieren, nur wie ? habe davon 0 ahnung...

MfG dex

3.511 Beiträge seit 2005
vor 16 Jahren

Also,

Erster Schritt:
du brauchst als erstes ein Interface


public interface IMainWindow
{
  bool SetLoggedOut();
} 

Dieses Interface muss deine MainForm implementieren. D.h., das bei der Deklaration deiner MainForm folgendes stehen müsste


public class MainForm: Form, IMainWindow
{
//...
}

Diese Anweisung bedeutet jetzt nichts weiter, als das MainForm von Form erbt und das Interface IMainWindow implementiert.
Alle Methoden, die jetzt im Interface IMainWindow deklariert wurden, müssen jetzt auch in der MainForm selber implementiert werden. Du brauchst also jetzt in der MainForm ebenfalls eine Methode "SetLoggedOut".


public class MainForm: Form, IMainWindow
{
//...

  public bool SetLoggedOut()
  {
    Console.WriteLine("SetLoggedOut wurde aufgerufen");
    return true; // Je nachdem
  }
}

Jetzt hat deine MainForm das Interface IMainWindow implementiert. Der Compiler sagt dir allerdings bescheid, wenn das Interface falsch oder unvollständig implementiert wurde, der ist so nett 🙂

Zweiter Schritt:
Deine zweite Form braucht jetzt dieses Interface, damit es natürlich die Methoden aus dem Interface auch feuern kann. Dazu eignet sich immer am besten den Constructor zu nutzen, um das Interface zu übergeben.
Also


public ZweiteForm: Form
{
  private IMainWindow m_MainWindow;

  public ZweiteForm(IMainWindow mainWindow)
  {
    this.m_MainWindow = mainWindow;
  }
}

Wenn diese Form jetzt aus deiner MainForm erzeugt wird, musst du jetzt natürlich dementsprechend das Interface weitergeben. Das wprde dann mit


public void Bla();
{
  using (ZweiteForm form = new ZweiteForm(this)) //*
  {
    // Mach Was
  }
}

passieren.
* this kannst du hier nehmen, wenn ja die MainForm das Interface IMainWindow implementiert hat. Der Compiler "sieht" das MainForm das Interface hat und gibt dann zur Laufzeit eine Referenz auf das Interface weiter.

Jetzt kannst du irgendwo in der Klasse "ZweiteForm" dieses Interface nutzen.


public ZweiteForm: Form
{
  // Alles andere

  private void ButtonClick(object sender, EventArgs e)
  {
    if (this.m_MainWindow != null) // darf an sich ja nicht null sein. Im Constructor prüfen!
      this.m_MainWindow.SetLoggedOut();
  }
}

In der Konsolenausgabe dürfte jetzt der String "SetLoggedOut wurde aufgerufen" stehen.

So, das wars erstmal. Bei Fragen fragen 🙂

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

D
Dexter323 Themenstarter:in
89 Beiträge seit 2008
vor 16 Jahren

Jetzt hat deine MainForm das Interface IMainWindow implementiert. Der Compiler sagt dir allerdings bescheid, wenn das Interface falsch oder unvollständig implementiert wurde, der ist so nett smile

und genau das ist das Problem:

implementiert den Schnittstellenmember "IMainWindow.set_loggedout()" nicht. "Hauptmenue.set_loggedout()" ist statisch, nicht öffentlich oder hat den falschen Rückgabewert.

und ich habe das identisch gelöst, wie du ,... er haut meldung übrigens im DESIGNER raus.

GRUND gerade gefunden:

ich hatte die Methode mit internal deklariert -> geht nicht , MUSS public sein -.-#

D
Dexter323 Themenstarter:in
89 Beiträge seit 2008
vor 16 Jahren

VIELEn dank für dein SUPER hilfe

läuft einwandfrei , nochmal danke Khalid =)