Finestra di dialogo modale di Windows Form che restituisce un oggetto anziché DialogResult

StackOverflow https://stackoverflow.com/questions/239435

  •  04-07-2019
  •  | 
  •  

Domanda

Sono un po 'bloccato con questo, quindi ho sperato che qualcuno potesse aiutarmi.

Sto facendo un'applicazione Winforms e devo mostrare una finestra di dialogo modale (form.ShowDialog) che restituisce un valore (richiede all'utente alcuni valori e li avvolge in un oggetto).

Non riesco proprio a vedere come farlo piuttosto che dare un riferimento all'oggetto o in base a una qualche forma di Proprietà pubblica per leggere i dati in seguito.

Vorrei solo che ShowDialog restituisse qualcosa di diverso, ma non funziona. Thare è un po '"buono" modo di fare questo?

Sono sicuro che il problema non è nuovo, ma dal momento che quasi nessuno sembra più fare Winforms non riesco a trovare alcuna guida sul web.

È stato utile?

Soluzione

Aggiungi un metodo statico al tuo modulo, in questo modo:

public class MyDialog : Form
{
    // todo: think of a better method name :)
    public static MyObject ShowAndReturnObject() 
    {
        var dlg = new MyDialog();
        if (new dlg.ShowDialog() == DialogResult.OK) 
        {
            var obj = // construct an instance of MyObject from dlg
            return obj;
        }
        else
        {
           return null; 
        }
    }
}

Ora puoi chiamarlo dal tuo programma così:

var myObject = MyDialog.ShowAndReturnObject();

... e se annullano la finestra di dialogo, myObject sarà null.

Ora, detto tutto ciò, credo che l'aggiunta di una proprietà alla classe del tuo modulo da cui hai letto dopo aver chiamato ShowDialog () sia l'approccio migliore.

Altri suggerimenti

È possibile creare una proprietà pubblica nella finestra di dialogo che rappresenta il valore restituito:

/* Caller Code */   
var dlg = new MyDialog();
if(dlg.ShowDialog() == DialogResult.OK)
  MessageBox.Show(dlg.MyResult);

/* Dialog Code */
public string MyResult { get { return textBox1.Text; } }

private void btnOk_Click(object sender, EventArgs e)
{
  DialogResult = System.Windows.Forms.DialogResult.OK;
  this.Close();
}

Oppure potresti creare un nuovo metodo ShowDialog all'interno della tua classe form che fa sostanzialmente quello che fa Matt Hamilton. Forse anche un metodo di estensione se è qualcosa che fai in molte forme del tuo problema.

La proprietà pubblica nella finestra di dialogo ha senso. Tuttavia, non chiudere la finestra di dialogo nel gestore eventi Click pulsante OK. Quando si assegna la proprietà DialogResult, il modulo della finestra di dialogo verrà nascosto. Quindi nel modulo di chiamata è possibile determinare se si è fatto clic su OK o Annulla esaminando DialogResult. Quindi è possibile accedere alla proprietà pubblica se si fa clic sul pulsante OK e quindi disporre il modulo di dialogo. Questo dovrebbe essere fatto usando un blocco try-catch-finally nel modulo chiamante o tramite un'istruzione using. È necessario disporre della finestra di dialogo modale per evitare perdite di memoria.

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