2010-11-22 11 views
5

Tengo un problema con respecto a los delegados en una aplicación Windows.Forms.Pasando variable entre winforms

Hay dos formas:

  1. el formulario principal, que tiene un botón llamado "Configuración".

  2. formulario "configuración", esta es la forma "hija".

Cuando hago clic en el botón "Configuración" en el formulario principal, se abre una instancia del formulario de Configuración.

Mi problema es que tengo que pasar una variable al formulario de Configuración, cuando lo abra. Para que la nueva forma muestre el texto variable. No sé cómo recuperar la información en el formulario "Configuración" del niño. Hice esto siguiendo un tutorial en línea y no pude entender en el tutorial cómo leer la información en el formulario de destino.

Aquí es lo que he hecho hasta ahora, el código en la forma principal:

public partial class MainForm : Form 
{ 

    /// <summary> 
    /// delegate to send data between forms 
    /// </summary> 
    public delegate void PageInfoHandler(object sender, PageInfoEventArgs e); 
    /// <summary> 
    /// event of the delegate 
    /// </summary> 
    public event PageInfoHandler PageInfoRetrieved; 

    //other stuff, events blabla 

    private void toolStripBtnSettings_Click(object sender, EventArgs e) 
    { 
     PageInfoEventArgs args = new PageInfoEventArgs(SomeString); 
     this.OnPageInfoRetrieved(args); 

     SettingsForm settingsForm = new SettingsForm(); 
     settingsForm.ShowDialog(); 
    } 

    private void OnPageInfoRetrieved(PageInfoEventArgs args) 
    { 
     if (PageInfoRetrieved != null) 
      PageInfoRetrieved(this, args); 
    } 
} 

Respuesta

12

Pase la información que desee al constructor del formulario de Configuración y proporcione los métodos de acceso para las cosas que necesita para salir de allí.

public class SettingsForm : WinForm 
{ 
    private string m_Data; 
    private int m_nExample = 0; 

    // ctor 
    public SettingsForm(string _data) 
    { 
     m_Data = data; // you can now use this in SettingsForm 
    } // eo ctor 

    public int Example {get{return(m_nExample);} } 
} // eo class SettingsForm 

En el "ejemplo" anterior, puede construir un SettingForm con una cadena y obtener un entero que pueda usar. En su código:

private void toolStripBtnSettings_Click(object sender, EventArgs e) 
{ 
    PageInfoEventArgs args = new PageInfoEventArgs(SomeString); 
    this.OnPageInfoRetrieved(args); 

    SettingsForm settingsForm = new SettingsForm("some data to pass"); 
    settingsForm.ShowDialog(); 

    int result = settingsForm.Example; // retrieve integer that SettingsForm used 
} 
+0

Gracias, funcionó perfectamente. –

2

¿Por qué no añades un constructor para la configuración de los parámetros que toma forman y desaparecen de los datos que necesite allí ?

4

Sugeriría agregar una propiedad a SettingsForm.

Entonces, lo llaman así:

forma
SettingsForm settingsForm = new SettingsForm(); 
settingform.myProperty = myPropertyvalue; 
settingsForm.ShowDialog(); 
5

Los Setttings es una clase. Ahora es tuyo y puedes hacer lo que quieras con él. Así que agrega un parámetro (o el número que quieras) a su constructor. Luego, en su MainForm llame a SettingsForm (lo que sea) y ya está todo listo.

+1

Eso es lo que haría. Luego, si necesita recuperar información del formulario secundario, haga una propiedad con un método get al que su clase principal pueda acceder. IDK de donde obtuviste ese tutorial, pero su manera de salir es – Nobody

+0

Muchas gracias, esto lo resolvió. Solo curiosidad, ¿hubiera sido posible con el uso de delegados también? Entiendo que usar delegados es demasiado para este simple problema, pero me pregunto si también fue posible. –

+1

Sí, podría pasar el valor real, o podría pasar una referencia a MainForm y agregar propiedades a MainForm para SettingsForm para llamar, o podría pasar un delegado para que SettingsForm lo llame, si a veces desea que llame a diferentes métodos para obtener el valor. Sin embargo, el último sería extraño. Parece una excusa para tratar de mostrarle a un delegado en acción. –

2

Usted puede crear un constructor parametrizado para la configuración de forma que acepte el texto, y lo establece en una propiedad en forma

public partial class SettingsForm : Form 
{ 

    public string DisplayText {get;set;} 

    public SettingsForm(string text) 
    { 
     DisplayText = text; 
    } 
} 

a continuación, usted acaba de inicializar el la configuración de esta manera (de su formulario principal)

var settingsForm = new SettingsForm("my init text"); 

su formulario de configuración será inicializado correctamente, y usted tiene el texto deseado en la propiedad MostrarTexto listo para usar

Cuestiones relacionadas