2012-04-09 13 views
0

Ich habe ein Problem damit, das übergeordnete Formular so lange geöffnet zu lassen, bis ich es nach der Verwendung von ShowDialog() schließe.Beibehalten des übergeordneten DialogButtons nach dem Schließen des untergeordneten DialogButtons

Ich habe versucht, dies zu tun, aber konnte nicht bekommen. Ich denke, es gibt etwas Einfaches, das ich vielleicht vermisst hätte. Kannst du mir bitte helfen, dies festzuhalten?

Das Problem ist, Ich habe Formular 1, auf Knopfdruck öffnet Form 2. Ich führe einige Validierungen in Form 2 durch und überprüfe die Validierungen. Wenn die Validierung nicht erfolgreich ist, öffne ich ein Dialogfeld, mit Wiederholen und Abbrechen. Wenn ich Retry drücken, sollte das Steuerelement zurück zum Formular 2 und Formular 2 sollte nicht geschlossen werden. Wenn Sie Abbrechen drücken, sollten sowohl das DialogBox-Formular als auch das Formular 2 geschlossen werden. Im Moment, egal was ich drücke, schließen sich beide Formulare.

Ich habe online gesucht und konnte keine Lösung finden. Ging durch diese Lösung, aber beide Formen schließen sich immer noch für mich. Why does closing a nested child dialog also close the parent dialog?

Mein Code: (Beispielbeispielszenario)

Form 1:

private void button1_Click(object sender, EventArgs e) 
{ 
    Form2 testForm = new Form2(); 
    DialogResult dialogResult = new DialogResult(); 
    dialogResult = testForm.ShowDialog(this); 
    if(dialogResult == DialogResult.OK) 
    { 
     //Do something 
    } 
} 

Form 2:

private void button1_Click(object sender, EventArgs e) 
{ 

    DialogResult validDataResult = MessageBox.Show("Invalid Data Entered. Please provide the correct data." 
      , "Data Management" 
      , MessageBoxButtons.RetryCancel); 

    if (validDataResult == DialogResult.Cancel) 
    { 
     this.Close(); 
    } 
} 
+0

Mit dem obigen Code ist es nicht reproduzierbar. Erben Sie Form2 von Form1 und schreiben Sie Ihre eigene virtuelle Close-Methode in Form1? – Dhananjay

Antwort

1

in Form2. cs tun, um Ihre Validierung und dann
(validationOK vorausgesetzt, ist das wahr/falsch Ergebnis Ihrer Schecks)

if(validationOK == false) 
{ 
    // Ask retry or cancel to the user 
    if(DialogResult.Cancel == MessageBox.Show("Validation Fail", "Validation failed, press retry to do it againg", MessageBoxButtons.RetryCancel)) 
     this.DialogResult.Cancel; // Set the dialog result on form2. This will close the form. 

    // if you have the validation done in a button_click event and that button has its 
    // property DialogResult set to something different than DialogResult.None, we need 
    // to block the form2 from closing itself. 

    // uncomment this code if the above comment is true 
    // else 
    // this.DialogResult = DialogResult.None; 
} 
0

Sie haben die DialogResult von Form2 zu setzen, bevor Sie anrufen können this.Close(). Ansonsten bleibt es der Standardwert. (Der Code unten ist nur eine Vermutung der tatsächlichen Doppel schließen Logik, da Sie nicht, dass angab)

Form2.cs:

if (validDataResult == DialogResult.Cancel) 
    DialogResult = DialogResult.Cancel; 
else 
    DialogResult = DialogResult.OK; 
Close(); 

Form1.cs:

if(dialogResult == DialogResult.OK) 
{ 
    Close(); 
} 
else 
{ 
    //Do something 
} 
+0

Hallo Justin. Ich möchte nicht, dass das Formular 1 jederzeit geschlossen ist. Ich habe das DialogResult in Formular 2 vor dem Schließen festgelegt. Aber ich muss das Formular 2 nicht explizit schließen. dialogResult = testForm.ShowDialog (this); (Von Form1.cs). Der Aufruf des ShowDialogs führt automatisch das button1 click -Ereignis aus und schließt das Formular. Irgendwelche Vorschläge, wie ich das ändern kann? – Sailoosha

+1

@Sailoosha Ich denke, hier gibt es ein Missverständnis. Können Sie Ihren gesamten Code Form1 und Form2.cs veröffentlichen? Ich denke, Sie lassen ein wichtiges Stück Daten weg. Wenn Sie sagen, dass das click -Ereignis ausgeführt wird, schließt es das Formular vor dem Öffnen oder öffnet es den Dialog "Ungültige Daten eingegeben"? –

+0

Danke Justin. Ich habe gerade die Lösung gefunden. Ich habe an dem von Ihnen vorgeschlagenen Code wenig geändert. Das Ändern des DialogResult des Formulars zu NONE löste das Problem. – Sailoosha