2008-11-11 15 views

Respuesta

56

crear una propiedad (o método) en FormOptions, dicen GetMyResult:

using (FormOptions formOptions = new FormOptions()) 
{ 
    formOptions.ShowDialog(); 

    string result = formOptions.GetMyResult; 

    // do what ever with result... 
} 
+0

su solución solo funciona después de cerrar el cuadro de diálogo, qué pasa con el mensaje passwing al formulario primario y viceversa cuando el formulario hijo aún está abierto – Smith

0

muchas maneras de pelar el gato aquí y @Mitch's suggestion es una buena manera de . Si desea que el formulario del cliente tenga más 'control', puede pasar la instancia del padre al hijo cuando se creó y luego puede llamar a cualquier método padre público en el niño.

+2

Prefiero formularios secundarios para saber quién los llama cuando sea posible. Menos acoplamiento ... –

23

También puede crear una propiedad pública.

// Using and namespace... 

public partial class FormOptions : Form 
{ 
    private string _MyString; // Use this 
    public string MyString {  // in 
     get { return _MyString; } // .NET 
    }       // 2.0 

    public string MyString { get; } // In .NET 3.0 or newer 

    // The rest of the form code 
} 

A continuación, puede conseguirlo con:

FormOptions formOptions = new FormOptions(); 
formOptions.ShowDialog(); 

string myString = formOptions.MyString; 
+0

erm, ¿No es eso lo que dije ya? –

+0

Hace lo mismo, solo con una propiedad basada en un método. – stiduck

29

Si sólo está utilizando formOptions que escoger un solo valor y cierre, la sugerencia de Mitch es una buena manera de ir. Mi ejemplo aquí se usaría si necesitaras que el niño se comunicara con el padre mientras permanecía abierto.

En su forma original, añadir un método público que va a llamar a la forma infantil, como

public void NotifyMe(string s) 
{ 
    // Do whatever you need to do with the string 
} 

A continuación, cuando se necesita para poner en marcha la ventana secundaria de la matriz, utilice este código:

using (FormOptions formOptions = new FormOptions()) 
{ 
    // passing this in ShowDialog will set the .Owner 
    // property of the child form 
    formOptions.ShowDialog(this); 
} 

En el formulario secundario, utiliza este código para pasar un valor nuevo a los padres:

ParentForm parent = (ParentForm)this.Owner; 
parent.NotifyMe("whatever"); 

el co De este ejemplo, sería mejor utilizarlo para algo así como una ventana de caja de herramientas que está destinada a flotar sobre la forma principal. En este caso, abriría el formulario secundario (con .TopMost = true) usando .Show() en lugar de .ShowDialog().

Un diseño como este significa que el formulario hijo está estrechamente vinculado al formulario principal (ya que el hijo tiene que asignarle su propietario como ParentForm para llamar a su método NotifyMe). Sin embargo, esto no es automáticamente algo malo.

+0

Intenté su método, sin embargo, no funcionó para mí. Este es el error que obtengo en parent.NotifyMe(). ¿Puedes ayudarme a descubrir qué salió mal? La función es pública en el padre. System.NullReferenceException era no controlada HResult = -2147467261 Message = Referencia a objeto no establecida como una instancia de un objeto. – SLearner

+1

@shashlearner: Asumo que está llamando 'formOptions.ShowDialog();' en lugar de 'formOptions.ShowDialog (este);' como he especificado en el puesto. Si no pasa 'this' en la llamada, la propiedad' .Owner' del formulario secundario será 'null' y obtendrá una excepción de referencia nula. – MusiGenesis

+0

Aah. Gracias @MusiGenesis – SLearner

9

También puede crear una sobrecarga de ShowDialog en su clase secundaria que obtiene un parámetro de salida que le devuelve el resultado.

public partial class FormOptions : Form 
{ 
    public DialogResult ShowDialog(out string result) 
    { 
    DialogResult dialogResult = base.ShowDialog(); 

    result = m_Result; 
    return dialogResult; 
    } 
} 
+1

Me gusta esto. Las ventanas de diálogo siempre me han parecido un poco extrañas, ya que estás mostrando una ventana y luego obteniendo su información una vez que se ha ido. Este enfoque muestra la ventana y recupera la información de una sola vez. – MusiGenesis

0

Creo que la forma más sencilla es utilizar la propiedad Tag en su clase FormOptions establecer la etiqueta = valor que necesita para pasar y después del método ShowDialog leyó como

myvalue x=(myvalue)formoptions.Tag; 
+2

Prefiero no usar la etiqueta en las clases de las que tengo control (es decir, donde puedo agregar una propiedad). Creo que es más limpio usar una propiedad con un nombre y tipo propios. –

3

uso público de propiedad del formulario secundario

frmOptions { 
    public string Result; } 

frmMain { 
    frmOptions.ShowDialog(); string r = frmOptions.Result; } 

Use eventos

frmMain { 
    frmOptions.OnResult += new ResultEventHandler(frmMain.frmOptions_Resukt); 
    frmOptions.ShowDialog(); } 

Uso propiedad pública de forma principal

frmOptions { 
    public frmMain MainForm; MainForm.Result = "result"; } 

frmMain { 
    public string Result; 
    frmOptions.MainForm = this; 
    frmOptions.ShowDialog(); 
    string r = this.Result; } 

Uso objeto Control.Tag; Esto es común para todos los controles de propiedad pública que puede contener un System.Object. Puede mantener allí la cadena o MyClass o MainForm, ¡cualquier cosa!

frmOptions { 
    this.Tag = "result": } 
frmMain { 
    frmOptions.ShowDialog(); 
    string r = frmOptions.Tag as string; } 
0

Cuando se utiliza el método ShowDialog() o Show(), y luego cerrar el formulario, el objeto de formulario no quede completamente destruido (de cierre! = Destrucción). Permanecerá vivo, solo que se encuentra en un estado "cerrado" y aún puede hacerle cosas.

+0

Creo que te refieres a Hide(). Realmente no creo que el formulario sea capaz de cambios después de cerrarlo, a menos que lo haga si está accediendo a él externamente. –

1

Para Picrofo EDY

Depende, si se utiliza el ShowDialog() como una forma de mostrar su forma y para cerrarla utiliza el botón de cierre en lugar de this.Close(). La forma no se eliminará ni se destruirá, solo se ocultará y se podrán realizar cambios después de que desaparezca. Para cerrarlo correctamente, necesitará el método Dispose() o Close(). Por otro lado, si usa el método Show() y lo cierra, el formulario se eliminará y no se podrá modificar después.

1

Si está mostrando el formulario secundario como un cuadro de diálogo modal, puede establecer la propiedad DialogResult de forma secundaria con un valor de la enumeración DialogResult que a su vez oculta el cuadro de diálogo modal y devuelve el control al formulario de llamada. En este momento, los padres pueden acceder a los datos del formulario secundario para obtener la información que necesita.

Para más información revise este enlace: http://msdn.microsoft.com/en-us/library/system.windows.forms.form.dialogresult(v=vs.110).aspx

0

Bueno solo me he encontrado con el mismo problema aquí - tal vez un poco diferente. Sin embargo, creo que así es como lo resolví:

  1. en mi forma padre Yo declare el formulario hijo sin instancia, p.RefDateSelect myDateFrm; Así que esto está disponible a mis otros métodos dentro de esta clase/forma

  2. siguiente, un método muestra el niño por nueva instancia:

    myDateFrm = new RefDateSelect(); 
    myDateFrm.MdiParent = this; 
    myDateFrm.Show(); 
    myDateFrm.Focus(); 
    
  3. mi tercer método (que quiere que los resultados de los niños) puede venir en cualquier momento & resultados simplemente obtener:

    PDateEnd = myDateFrm.JustGetDateEnd(); 
    pDateStart = myDateFrm.JustGetDateStart();` 
    

    Nota: los métodos del niño JustGetDateStart() son públicas dentro infantil como:

    public DateTime JustGetDateStart() 
    { 
        return DateTime.Parse(this.dtpStart.EditValue.ToString()); 
    } 
    

Espero que esto ayude.

Cuestiones relacionadas