Frage

Ich habe in meiner Anwendung eine Benutzersteuerung erstellt, die ein Textfeld und dann 2 Schaltflächen enthält. Eine Schaltfläche besteht darin, die DB aus dem Textfeld Daten hinzuzufügen und die zweite Aktion abzeigt. Diese Benutzersteuerung wird dann zu mehreren Dialogs (Formulare) hinzugefügt, aber ich möchte, dass die Schaltflächen dieselben Ereignisse auslösen, aus denen ich die Schaltflächen auf der Benutzersteuerung und nicht im Dialogfeld platziert habe.

Was ich versuche zu tun, ist, nachdem sie auf die Schaltfläche Daten hinzufügen klicken und es erfolgreich ist. Ich möchte, dass es den Dialog schließt, auf dem sich die Steuerung befindet.

BEARBEITEN:

Ich weiß nicht, wie ich dies codieren kann, um den Dialog zu schließen, wenn es von einer Benutzersteuerung ausgelöst wird. Ich weiß nicht, wo ich anfangen soll, weil ich noch keine Benutzersteuerungen verwendet habe. Normalerweise habe ich nur die Steuerelemente auf einem Dialog, das das erlaubt DialogResult = DialogResult.OK;

Vielen Dank

War es hilfreich?

Lösung

Formulare, die modal geöffnet wurden, schließen automatisch, wenn ihre Dialogresult eingestellt ist. Aus den Geräuschen setzen Sie die Dialogresult der Steuerung, nicht die Form. Um das zu tun, was Sie tun möchten, benötigen Sie das Steuerelement, um die Einstellung des Dialogfelds "Dialogfeld" oder auszulösen. Sie können dies von beiden tun:

1. Wenn Sie eine Referenz der Form auf die Steuerung durchlaufen, die es dem Steuerelement ermöglicht, es einzustellen.

2. Erstellen Sie ein Ereignis für die Steuerung, auf die die Formulare hören und es ihm schließen. (empfohlener Weg)

3. (Die hackige Art) Legen Sie das Dialogergebnis des Formulars mit diesem Code fest:

this.ParentForm.DialogResult = DialogResult.OK;

Das Formular muss auch modell angezeigt werden, andernfalls müssen Sie die Close () -Methode manuell anrufen.

Andere Tipps

Sie möchten Delegierten verwenden, um dieses Problem zu lösen.

Definieren Sie in dem Code hinter Ihrer Kontrolle einen Delegierten, mit dem Sie Ihr Hauptformular auszeichnen sollen. Wo immer Sie in Ihrer Steuerung das übergeordnete Formular schließen möchten, werden Sie dieses benutzerdefinierte Ereignis anheben, das von Ihrem übergeordneten Formular behandelt wird. Aus diesem Grund nehmen wir an, dass Sie das übergeordnete Formular auf einer Schaltfläche schließen möchten. Klicken Sie in die Steuerung.

public delegate void CloseHostFormEventHandler(Object sender, EventArgs e);

public partial class MyControl : Control {

    public event CloseHostFormEventHandler CloseFormEvent;


    public closeButton_Clicked(object sender, EventArgs) {
        // do your db stuff

        // you could create your own class here and pass the object to your main form if you wanted
        EventArgs myargs = new EventArgs(); 

        // tell host form to close itself
        CloseFormEvent(this, myargs);

    }
}

Jetzt in Ihrem übergeordneten Formular möchten Sie das von der Kontrolle erhobene Ereignis verarbeiten.

public partial class MyForm : Form {

    public MyForm() {

        InitializeComponent();

        // ill assume your control was added via the designer and thus done in InitializeComponent()

        // hook up event handler
        mycontrol.CloseFormEvent += CloseFormEventHandler(closeformCallback);
    }

    protected void closeformCallback(object sender, EventArgs e) {
        DialogResult = DialogResult.OK;
        this.Close();
    }


}

Ich werde eine wilde Vermutung machen, da Sie nicht viele Informationen gegeben haben.

Der Dialog schließt nicht, da es kein modaler Dialog ist. Versuchen Sie es mit dem Zeigen mit ShowDialog() statt Show().

Wie Tony sagt. Sie müssten die enge Methode aufrufen.

Was Sie tun könnten, ist einen Verweis auf die Aufruf von dort in Ihre Kontrolle zu geben und von dort aus seine enge Methode zu rufen.

Sie können den Klick -Event -Handler auf Ihrem Benutzer steuern, der so etwas steuert:

        Form f = this.ParentForm;
        if (f != null)
        {
            f.DialogResult = DialogResult.OK;
        }

Dialogresult schließt a nicht a nicht modal bilden.

Sie müssen die schließende Methode des Formulars oder in diesem Fall aufrufen.

BEARBEITEN

Oder verwenden Sie ShowDialog () anstelle von Show ().

Wieder bearbeiten

Entsprechend Dialogresult -Dokumentation:

Wenn ein Formular als modales Dialogfeld angezeigt wird, wird auf die Schaltfläche Schließen (die Schaltfläche mit einem X in der oberen rechten Ecke des Formulars), die das Formular versteckt und die Dialogresult-Eigenschaft auf Dialogresult.cancel eingestellt wird. Die Verschlussmethode wird nicht automatisch aufgerufen, wenn der Benutzer auf die Schaltfläche Schließen eines Dialogfelds klickt oder den Wert der Dialogresult -Eigenschaft festlegt. Stattdessen ist das Formular versteckt und kann erneut angezeigt werden, ohne eine neue Instanz des Dialogfelds zu erstellen. Aufgrund dieses Verhaltens müssen Sie die Entsendungsmethode des Formulars aufrufen, wenn das Formular von Ihrer Anwendung nicht mehr benötigt wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top