Domanda

Ho creato un controllo utente nella mia applicazione che ha una casella di testo e poi 2 pulsanti su di esso. Un tasto è quello di aggiungere dati al DB dalla casella di testo e la seconda di annullare l'azione. Questo controllo utente viene quindi aggiunto a più finestre di dialogo (forme) ma voglio i pulsanti per attivare gli stessi eventi, che la ragione ho messo i tasti del controllo utente e non il dialogo.

Quello che sto cercando di fare è dopo aver fatto clic sul pulsante Aggiungi dati ed è successo, voglio che per chiudere la finestra che il controllo si trova su.

EDIT:

Non so come fare per la codifica questo per chiudere la finestra quando viene attivato da un controllo utente. Non so da dove cominciare, perché non ho usato prima di User Controls. In genere non mi resta che i controlli su una finestra di dialogo che permette la DialogResult = DialogResult.OK;

Grazie

È stato utile?

Soluzione

I moduli aperto modale si chiuderà automaticamente quando il loro DialogResult è impostato. Dai suoni di esso, si sta impostando il DialogResult del controllo, non la forma. Per fare che cosa si sta cercando di fare, è necessario il controllo per impostare o attivare l'impostazione di conseguenza le forme genitore di dialogo. È possibile eseguire questa operazione:

1. Passando attraverso un riferimento del modulo per il controllo, che consente il controllo per impostarla.

2. Crea un evento sul controllo che le forme ascolti a, che racconta la chiusura. (modo recomemnded)

3 (Il modo hacky) Imposta la finestra di dialogo forme risultato utilizzando questo codice:.

this.ParentForm.DialogResult = DialogResult.OK;

dovrà anche il modulo per essere mostrato modale, altrimenti sarà necessario chiamare il metodo Close () manualmente.

Altri suggerimenti

Si vorrà utilizzare delegati per risolvere questo problema.

Nel codice dietro del vostro controllo, definire un delegato, che verrà utilizzato per informare il modulo principale per chiudersi. Ovunque nel controllo che si desidera avere il form padre vicino, si alzerà questo evento personalizzato che sarà gestita dal modulo genitore. Per fare un esempio, ci ASSUM si desidera chiudere il form padre su un clic sul pulsante nel controllo

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);

    }
}

Ora nel tuo form padre, si vorrà gestire l'evento sollevato dal controllo.

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();
    }


}

ho intenzione di prendere un ipotesi poiché non l'ha dato molte informazioni.

La finestra di dialogo non si chiude perché non è una finestra di dialogo modale. Prova mostrando con ShowDialog() piuttosto che Show().

Come Tony dice. Si avrebbe bisogno di chiamare il metodo close.

Che cosa si potrebbe fare è passare un riferimento alla chiamata da nel vostro controllo e chiamare il suo metodo close da lì.

Si può mettere nel gestore di eventi Click sul vostro qualcosa di controllo utente in questo modo:

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

DialogResult non si chiude un non modale forma.

È necessario chiamare il metodo Close della forma o in questa finestra caso.

Modifica

O uso ShowDialog () al posto di Show ().

modificare di nuovo

DialogResult documentazione :

Quando un modulo viene visualizzato come una finestra di dialogo modale, facendo clic sul pulsante Chiudi (il pulsante con una X nell'angolo in alto a destra del modulo) fa sì che il modulo per essere nascosto e la proprietà DialogResult per essere impostata su DialogResult. Annulla. Il metodo Close non viene chiamato automaticamente quando l'utente fa clic sul pulsante Chiudi di una finestra di dialogo o imposta il valore della proprietà DialogResult. Invece, il modulo è nascosto e può essere dimostrato ancora una volta senza creare una nuova istanza della finestra di dialogo. A causa di questo comportamento, è necessario chiamare il metodo Dispose della forma quando la forma non è più necessaria per l'applicazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top