Variable von Form2 an Form1 übergeben

Maliko

Grünschnabel
Hoi,

ich hab da mal ne Frage an euch. Ich verzweifle gerade und *** unser Lehrer hat wichtige Sachen außer Acht gelassen.

Folgendes Problem. Ich möchte gerne aus Form2 welche eine TextBox enthält den Inhalt eben jener TextBox an Form1 übergeben, welche zuvor Form2 aufgerufen hat. Und zwar möchte ich das ganze gerne vernünfitig indirekt via Events machen. Ich habe bereits sowohl das Event als auch das Delegate in Form 2 erstellt, habe jetzt aber keine Ahnung wie der Callback an den Inhalt der Textbox kommt. Kann mir da vielleicht irgendjemand ein simples Codebeispiel posten? Im Netz finde ich nicht zu dem Tema (wenn ich da Variable von Form2 an Form1 übergeben eintippe, dann bekomme ich immer das gegenteil zu sehen).

Ihr würdet mir damit sehr helfen und ich fühl mich dann nicht mehr ganz so unfähig.

Lg Maliko
 
Zuletzt bearbeitet von einem Moderator:
Hi und Willkommen bei tutorials.de,

ist Form2 dann wieder zu oder werden die zum Übergabezeitpunkt beide parallel angezeigt?
 
Form1 ist das Hauptfenster und Form2 wird modal via ShowDialog() angezeigt. Es sind also weiterhin beide Instanzen aktiv. Nach der Übergabe soll Form2 dann geschlossen werden (was dann ja einfach mit this.Close() passiert).
 
Zuletzt bearbeitet:
So. Ich habs jetzt selbst geschafft, indem ich einfach mal ne weile wild rumprobiert habe. Es funktioniert nun. Ich möchte den anderen, die das Problem haben, dies natürlich nicht vorenthalten. Darum hier meine Lösung. Alles was im Code auskommentiert ist, gehört nicht zum Problem und dient nur als Platzierungshilfe.

Form2:
Code:
public delegate void GetDatabaseNameEventHandler(string databaseName);

//public partial class NewDatabaseForm : Form
    {
        public event GetDatabaseNameEventHandler getDatabaseName;

        //public NewDatabaseForm()
        //{
        //    InitializeComponent();
        //}

        private void button1_Click(object sender, EventArgs e)
        {
            if (getDatabaseName != null)
                getDatabaseName(tb_DatabaseName.Text);
            
            this.Close();
        }
    }

Form1
Code:
private void neueDatenbankToolStripMenuItem_Click(object sender, EventArgs e)
{
    if (tv_DatabaseView.Nodes.Count != 0)
        tv_DatabaseView.Nodes.Clear();

    NewDatabaseForm newDatabase = new NewDatabaseForm();
    newDatabase.getDatabaseName += new GetDatabaseNameEventHandler(newDatabase_getDatabaseName);
    newDatabase.ShowDialog();
}

void newDatabase_getDatabaseName(string databaseName)
{
    tv_DatabaseView.Nodes.Add(databaseName);
}

Kleine Info noch, wenn ihr versucht das Event zu feuern, wenn ihr die Form2 zuerst öffnet und dann das Event versucht zu abonnieren, dann erhaltet ihr eine NullReferenceException (in meinem Beispiel nicht, da sie mit einer if-Abfrage abgefangen wurde).

Ich hoffe ich konnte denen etwas helfen, die das Problem auch noch haben.

Liebe Grüße
Maliko
 
Hallo,

hättest du es nicht so machen können, wie es in FileOpenDialog, SaveFileDialog oder FolderBrowseDialog gehandhabt wird?

Die Form B, die als modaler Dialog aus einer Form A mit ShowDialog() geöffnet wird, enthält einen Button "OK" und einen Button "Cancel". Wenn der Benutzer alle erforderlichen Eingaben gemacht hat wird der Button "OK" auf Enabled=true gesetzt.

Wenn auf den Button "OK" geklickt wird, wird im EventHandler das DialogResult von Form B auf DialogResult.OK gesetezt. Wenn auf den Button "Cancel" geklickt wird, wird im EventHandler das DialogResult von Form B auf DialogResult.Ccancel gesetzt.

In der Form B gibt es dann eine Eigenschaft, die den Inhalt der TextBox, also die Text-Eigenschaft zurückgibt. Die Form A muss jedoch den DialogResult-Rückgabewert von ShowDialog() überprüfen. Nur wenn bei DialogResult.OK, darf die Eigenschaft ausgewertet werden, die den Inhalt der TextBox zurück gibt.

Stell dir einen Dialog immer als Funktion vor, bei der der Funktionsinhalt und -ablauf durch den Benutzer beeinflusst wird. Du kannst über WriteOnly-Eigenschaften einen oder mehrere Parameter an den Dialog übergeben, bevor du ShowDialog() aufrufst. Über Readonly-Eigenschaften kannst du du die Ergebnisse (Rückgabewerte) abrufen. Überprüfe jedoch den DialogResult-Rückgabewert von ShowDialog() vorher.

Ein Dialog sollte auch keine Logic oder Datenbank- bzw. File-Zugriffe enthalten. Das passiert entweder vorher oder nachher.
 
Hallo,
du hättest auch einfach einen public string in Form 2 machen und selbigen dann in Form 1 auslesen,
also z.B.

NewDatabaseForm:
Code:
public string DatabaseName = "";

private void button1_Click(object sender, EventArgs e)
        {          
            DatabaseName = tb_DatabaseName.Text;     
            this.Close();
        }

und in Form1:
Code:
private void neueDatenbankToolStripMenuItem_Click(object sender, EventArgs e)
{
    if (tv_DatabaseView.Nodes.Count != 0)
        tv_DatabaseView.Nodes.Clear();
 
    NewDatabaseForm newDatabase = new NewDatabaseForm();
    newDatabase.ShowDialog();
    string getDatabaseName = newDatabase.DatabaseName;
}


Liebe Grüße
Felix
 
Zurück