2016-11-21 4 views
0

Ich habe eine BaseControl Klasse, die so ziemlich alles, was ich brauche für die Steuerung..Net UserControl Implementierung Show und ShowDialog Methoden

Es ist bequem für mich, eine void Show und DialogResult ShowDialog Methode von meiner Kontrolle zu implementieren. diese

UPDATE ist der Einfachheit halber als ich meine BaseControls der ganzen Ort und in einigen Fällen verwenden, möchte ich die possibilit zeigen (Show-Dialog), um sie mit einer möglichst einfachen Code ...

Hier der Code des ShowDialog Methode ist, die Show Methode sehr ähnlich zu sein:

Form ContainingForm = null; 
public DialogResult ShowDialog(string title, Control parent) { 
    ContainingForm = new Form(); 
    this.Dock = DockStyle.Fill; 
    ContainingForm.Controls.Add(this); 
    ContainingForm.Text = title; 
    // 
    DialogResult res = ContainingForm.ShowDialog(); 
    ContainingForm.Close(); 
    return res; 
} 

private void Close(DialogResult result) { 
    if (ContainingForm != null) { 
    ContainingForm.DialogResult = result; 
    // original code: form is not closing... 
    // ContainingForm.Close(); 
    } 
} 
// button on BaseControl closing the control 
protected void Button_Click(object sender, EventArgs e) { 
    this.Close(DialogResult.OK); 
} 

ich habe versucht, den Ansatz in this post vorgeschlagen, damit die Close in der ShowDialog Methode. Sowohl in der Originalversion als auch in der überarbeiteten Version, die den obigen Post verwendet, schließt sich das Fenster nicht.

Ich las über das Senden einer "Schließen" Nachricht an die ContainingForm, aber mit einer Invoke hat auch nicht funktioniert.

Auch sollte ich einige andere Probleme erwarten, wenn Sie Show anstelle von ShowDialog verwenden, da das Formular den UI-Thread nicht blockiert?

Wer kennt die Antwort?

+0

Was das Problem mit einem 'Form' ist, die Sie gemacht, so etwas zu versuchen? –

+0

Die Form-Klasse hat keinen parametrisierten Konstruktor, also ist klar, was hier vor sich geht: 'ContainingForm = new Form (übergeordnet);' – LarsTech

+0

Vererbung für Kompatibilität mit Nicht-Winforms-Projekten ... – neggenbe

Antwort

0

Wie sich herausstellt, der folgende Code scheint zu funktionieren:

private void Close(DialogResult result) { 
    if (ContainingForm != null) { 
    ContainingForm.DialogResult = result; 
    ContainingForm.Close(); 
    ContainingForm.Dispose(); 
    } 
}