visual open net mdiparent mdichildren formularios form ejemplos child abrir c# .net winforms parent-child

c# - open - ¿Cómo paso un valor de un niño al formulario principal?



open form in mdi parent vb net (11)

Bueno, acabo de encontrar el mismo problema aquí - tal vez un poco diferente. Sin embargo, creo que así es como lo resolví:

  1. en mi formulario principal, declare el formulario hijo sin instancia, por ejemplo, RefDateSelect myDateFrm; Así que esto está disponible para mis otros métodos dentro de esta clase / formulario

  2. A continuación, un método muestra el elemento secundario por instancia nueva:

    myDateFrm = new RefDateSelect(); myDateFrm.MdiParent = this; myDateFrm.Show(); myDateFrm.Focus();

  3. mi tercer método (que quiere los resultados del niño) puede venir en cualquier momento y simplemente obtener resultados:

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

    Nota: los métodos secundarios JustGetDateStart() son públicos dentro de CHILD como:

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

Espero que esto ayude.

¿Cómo paso un valor de un niño al formulario principal? Tengo una cadena que me gustaría devolver al padre.

Lancé al niño usando:

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


Cree una propiedad (o método) en FormOptions , digamos GetMyResult :

using (FormOptions formOptions = new FormOptions()) { formOptions.ShowDialog(); string result = formOptions.GetMyResult; // do what ever with result... }


Creo que la forma más fácil es usar la propiedad Tag en su clase FormOptions establezca el tag = valor que necesita pasar y después del método ShowDialog léalo como

myvalue x=(myvalue)formoptions.Tag;


Cuando utiliza el ShowDialog() o Show() , y luego cierra el formulario, el objeto de formulario no se destruye por completo ( ¡cerrando! = Destrucción ). Permanecerá vivo, solo que se encuentra en un estado "cerrado" y aún puede hacerle cosas.


Muchas maneras de despellejar al gato aquí y la sugerencia de @Mitch es una buena manera. 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.


Para Picrofo EDY

Depende, si usa ShowDialog() como una forma de mostrar su formulario y cerrarlo, use el botón de cerrar en lugar de esto. 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ás 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.


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 obtener más información, consulte este enlace: http://msdn.microsoft.com/en-us/library/system.windows.forms.form.dialogresult(v=vs.110).aspx


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


También puedes 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 }

Entonces puedes obtenerlo con:

FormOptions formOptions = new FormOptions(); formOptions.ShowDialog(); string myString = formOptions.MyString;


Usar propiedad pública de forma infantil

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

Usa eventos

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

Usar 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; }

Use el 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; }


Si solo está utilizando formOptions para elegir un solo valor y luego cerrar, la sugerencia de Mitch es una buena forma de hacerlo . Mi ejemplo aquí se usaría si necesitaras que el niño se comunicara con el padre mientras permanecía abierto.

En su formulario principal, agregue un método público al que llamará el formulario secundario, como

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

A continuación, cuando necesite iniciar la ventana secundaria desde el elemento principal, use 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, use este código para pasar un valor al padre:

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

El código en este ejemplo sería mejor utilizado para algo así como una ventana de caja de herramientas que está destinada a flotar sobre el formulario 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 relacionado con el 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.