2011-05-13 12 views
7

Tengo dos formas de Windows (MyApp, generador), y tengo que llamar Generador de MiAplresultado retorno entre las formas de Windows en C#

Form gen = new Generator(); 
gen.Show(); 
string result = gen.IDontKnowWhatToDoHere(); 

Mi Forma Generator.cs tiene tres cuadro de texto y un botón Aceptar, por lo cuando el usuario escribe texto en los tres cuadros de texto y hace clic en Aceptar, quiero obtener el texto escrito en esos tres cuadros de texto.

¿Tiene alguna idea de cómo puedo lograr esto.

Gracias.

+0

¿El botón Aceptar se cerrará o no? –

+0

Creo que sí lo hará: esto.Close(), pero no puedo invocar el evento onClose? –

+0

¿Necesita diálogo modal? Es decir que el código de llamada esperará hasta que se muestre el formulario cerrado. –

Respuesta

6
class Generator : Form 
{ 
    public string Text1 { get; private set; } 

    void ok_Click (object sender, EventArgs) 
    { 
     this.Text1 = txt1.Text; 
     ... 
     this.Close(); 
    } 
} 

Form gen = new Generator(); 
gen.ShowDialog(); 
string text1 = gen.Text1; 
... 

class TextInfo 
{ 
    public string Text1 { get; set; } 
    ... 
} 

class Generator : Form 
{ 
    public TextInfo Textinfo { get; private set; } 

    public Generator(TextInfo info) 
    { 
     this.TextInfo = info; 
    } 

    void ok_Click (object sender, EventArgs) 
    { 
     this.TextInfo.Text1 = txt1.Text; 
     ... 
     this.Close(); 
    } 
} 

TextInfo info = new TextInfo(); 
Form gen = new Generator(info); 
gen.ShowDialog(); 
string text1 = info.Text1; 
+0

Hice esto pero text1 = "" porque el formulario de MyApp no ​​está esperando el formulario del generador para enviar datos, por lo que text1 está vacío. –

+0

¿Cómo puedo hacer que MyApp espere el formulario Generador para cerrar antes de continuar con la ejecución? –

+2

Debe usar Form.ShowDialog en lugar de From.Show –

1
Form gen = new Generator(); 
gen.ShowDialog(); 
string result = gen.IDontKnowWhatToDoHere(); 

Pero creo que es más efectivos sido crear delegado.

0

si el generador es una forma por lo que se hereda de forma, cambiar la línea a:

Generator gen = new Generator(); 
gen.Show(); 
string result = gen.SomePublicVariableOrProperty; 
+0

string result = gen.SomePublicVariableOrProperty; esto debe invocarse en el evento de CIERTO del generador – Gabriel

+0

. Necesita mostrar el diálogo y no mostrar. O use el evento OnClose (lo que dice Gabrield) – RvdK

0

Creo que se puede tratar de pasar por la instancia Actuales como parámetro al constructor de la forma Generator.

Una vez que haya rellenado el Textbox al hacer clic en el evento Asignarlo a la Propiedad en Formulario principal con la ayuda de la instancia que se pasó en el constructor.

Form gen = new Generator(this); 
gen.Show(); 

public Generator(Form F1) 
{ 
    InitializeComponent(); 
    form1 = F1 as ParentForm; // now you have parent reference 
} 

de Pulsar el botón de la forma Generator

form1.Sompropertyasignar los valores

Esperanza esto ayuda

8

general utilizo este patrón:

TResult result = Generator.AskResult(); 

class Generator : Form 
{ 
    // set this result appropriately 
    private TResult Result { get; set; } 
    public static TResult AskResult() 
    { 
     var form = new Generator(); 
     form.ShowDialog(); 
     return form.Result; // or fetch a control's value directly 
    } 
} 

Esta ma kes funciona en una sola declaración, similar a un MessageBox, y no requiere hacer público ningún control. También puede incluir datos adicionales como parámetros del método estático y pasarlos al constructor del formulario o establecer las propiedades de forma apropiada.

Otros beneficios incluyen la posibilidad de, si es necesario, reutilizar instancias del formulario.

2

Si necesita datos de un formulario no modal, debe usar eventos u otro patrón de notificación.

class OkPressedEventArgs : EventArgs 
{ 
    public OkPressedEventArgs(string text1, string text2, string text3) 
    { 
     Text1 = text1; 
     Text2 = text2; 
     Text3 = text3; 
    } 

    public string Text1 {get;private set;} 
    public string Text2 {get;private set;} 
    public string Text3 {get;private set;} 
} 

class SourceForm : Form 
{ 
    public event EventHandler<OkPressedEventArgs> OkPressed; 
    private void OnOkPressed() 
    { 
     if(OkPressed != null) 
     { 
      OkPressed(this, new OkPressedEventArgs(textBox1.Text, textBox2.Text, textBox2.Text); 
     } 
    } 

    private void okButton_Click(object source, EventArgs e) 
    { 
     OnOkPressed(); 
    } 
} 

class TargetClass 
{ 
    void ShowFormMethod() 
    { 
     var form = new SourceForm(); 
     form.OkPressed += OkPressedHandler; 
     form.Show(); 
    } 

    private void OkPressedHandler(object source, OkPressedEventArgs e) 
    { 
     // process form data here! 
    } 
} 
+0

Esta debería ser la respuesta, ya que aclara explícitamente qué hacer con los formularios no modales, que es para lo que usa Form.Show(), como lo hizo el OP. – Ant

Cuestiones relacionadas