2010-07-07 14 views
6

Tengo un formulario complejo que permite al usuario configurar mi aplicación.cómo guardar/restaurar un formulario y controles entre ejecuciones del programa?

¿Cuál es la mejor manera de guardar el estado del formulario & volver a cargar cuando se ejecuta el programa siguiente?

quiero decir el texto que ha entrado en cuadros de lista, el elemento seleccionado del combo/list/radio, si una casilla está mejillas, etc

+3

Supongo que está utilizando WinForms, pero no debería tener que adivinar. Además, no duplique las etiquetas en su título. –

+2

+1 porque estás tratando de ayudarme. Sí WinForms. Lo siento, tuvo que adivinar, ahora he estado usando VB por más de 5 horas, el tiempo total transcurrido, algunas cosas aún son nuevas para mí ;-). – Mawg

+1

@mawg, ¿puede explicarlo? Leí su pregunta como * "tengo un formulario que contiene varias configuraciones que quiero rellenar con el valor correcto cada vez que se abre el formulario" *. ¿O está preguntando * "cómo puedo guardar el estado actual de cualquier formulario en particular para la próxima vez" *? ¿Estás buscando guardar la configuración de la aplicación, o solo algunas cosas del tipo de sesión? Los otros respondedores parecen haber leído su pregunta de manera diferente a lo que hice. – slugster

Respuesta

3

Mucha gente aquí que me dice cuando para ahorrar, pero no muchos me dice cómo ...

Al final me fui con WritePrivateProfileString()

0
Private Sub frm_Closing (sender as Object, e as CancelEventArgs) Handles MyBase.Closing 

    ' save all the values you want' 

End Sub 

Private Sub frm_Load(sender as Object, e as EventArgs) Handles MyBase.Load 

    If SaveSettingsExist Then 
     ' restore all the values you want' 
    End If 

End Sub 
+0

Ah, manualmente :-(Espero algo así como la transmisión del formulario a un archivo y viceversa. De esta manera tengo que escribir el código y cambiarlo dos veces si cualquier control se agrega, elimina o cambia – Mawg

1

Usted tiene algunas opciones de dónde guardar los ajustes introducidos - en un archivo de configuración, o en el registro, tal vez una base de datos (tal vez incluso "la nube", pero no iré allí).

Debería hacer que el usuario realice una acción específica (como hacer clic en Aplicar) antes de guardar la configuración; no solo debe guardar la configuración cuando el usuario cierra el formulario, ya que en última instancia no buen UX.

Cómo persiste la configuración depende totalmente de usted; puede guardarlos en un archivo de configuración de estilo de par nombre/valor directo, puede usar XML en el archivo de configuración o guardarlos como claves y valores en un lugar conocido en el registro (o podría guardar pares nombre/valor en una tabla de base de datos).

Cuando vuelva a ejecutar su aplicación, una de las tareas de inicio puede ser verificar la ubicación conocida (ya sea el registro o un archivo de configuración) para la configuración y luego cargarla en una clase de configuración. Asegúrese de tener valores lógicos predeterminados para cada configuración en caso de que nunca se haya establecido o, por algún motivo, no pueda volver a leerla. La clase de configuración se puede pasar a cada formulario para que se aplique en cualquier configuración. relevante, o podría ser una clase estática (clase de instancia única globalmente visible) para que pueda leerse desde cualquier lugar de la aplicación.

Editar: Después de leer su comentario para otra respuesta, aquí hay otra opción, un poco más avanzada. Use la clase de configuración que mencioné anteriormente, pero también use el enlace: puede vincular su objeto de configuración directamente a su formulario, de modo que cualquier valor ingresado se actualizará directamente en el objeto de configuración sin tener que escribir código para hacerlo (siempre que use dos manera vinculante). La "transmisión" se puede lograr serializando el objeto de configuración en un archivo (o una base de datos), le sugiero que consulte el .

0

De hecho, tengo un par de rutinas genéricas que uso así para guardar el tamaño de formulario/posición y la configuración de la columna ListView. Así que tengo algo así como ...

Private Sub frm_Closing (sender as Object, e as CancelEventArgs) Handles MyBase.Closing 

    SaveFormPos(Me) 
    SaveListview(Me, lvuInvoices) 

End Sub 

Private Sub frm_Load(sender as Object, e as EventArgs) Handles MyBase.Load 

    RestoreFormPos(Me) 
    RestoreListview(Me, lvuInvoices) 

End Sub 

El parámetro Me (para la rutina Listview) se utiliza para crear una clave para los valores que se guardan en el registro. Tienes todo tipo de opciones frente a ti. Puede poner esta funcionalidad en una clase base para todos sus formularios, crear una clase SaveState o simplemente pegar rutinas en un módulo. Puede guardar estos datos en el registro, una base de datos, archivos de texto. Puede tener una rutina genérica que rastree la colección Controls en busca de cuadros de texto, casillas de verificación, etc.

Sin embargo, una vez que haya creado un conjunto útil de guardar las rutinas, puede emplearlas en cualquier forma posterior que desee, por lo solo necesitas hacer el trabajo duro una vez.

0

También estoy de acuerdo en tener un conjunto de funciones LoadSettings/SaveSettings que se invocan al crear el formulario/al cerrar la aplicación.

Como ubicación de la tienda para la configuración de la aplicación, recomiendo usar el Isolated Storage.

Como una adición, dependiendo de los controles que está utilizando en su formulario, podría tener la opción de guardar su estado en formato de formato XML y luego restaurarlo la próxima vez. Por ejemplo, los controles Infragistics ofrecen esta posibilidad (por ejemplo, UltraDockManager, UltraToolbarManager tienen un par de funciones SaveAsXml/LoadFromXml).

1

Serializar el formulario.

Implemente ISerializable, y en el constructor serializable y el método GetObject() cargue/guarde sus campos.

En OnClosing serialice el formulario.

/// 
    /// try to obtain the las serialized main form with old data 
    MainForm mainForm = DeserializeMainForm("mainForm.data"); 
    /// 
    /// if any old data found, create a new(empty) main form 
    if (mainForm == null) mainForm = new MainForm(); 

    static MainForm DeserializeMainForm(string filePath) 
    { 
     MainForm mf = null; 
     FileStream fileStream = null; 
     try 
     { 
      BinaryFormatter binaryFormatter = new BinaryFormatter(); 
      fileStream = new FileStream(filePath, FileMode.Open); 
      mf = (MainForm)binaryFormatter.Deserialize(fileStream); 
     } 
     catch { } 
     finally 
     { 
      if (fileStream != null) 
      { 
       fileStream.Close(); 
      } 
     } 

     return mf; 
    } 

MainForm:

[Serializable] 
public partial class MainForm : Form, ISerializable 
{ 
     protected MainForm(SerializationInfo info, StreamingContext context) 
     : this() 
    { 
     if (info == null) 
      throw new System.ArgumentNullException("info"); 

     this.tbxServerIp.Text = info.GetString("server ip"); 
     this.tbxServerPort.Text = info.GetString("server port"); 
     this.tbxEventFilter.Text = info.GetString("event filter"); 
     this.tbxWallId.Text = info.GetString("wallId"); 

     foreach (Control control in this.Controls) 
     { 
      if (control is EventSender) 
      { 
       EventSender eventSender = (control as EventSender); 
       eventSender.LoadFromSerializationInfo(info); 
      } 
     } 
    } 

    private void SerializeThis() 
    { 
     BinaryFormatter binaryFormatter = new BinaryFormatter(); 
     FileStream fileStream = new FileStream("mainForm.data", FileMode.Create); 
     try 
     { 
      binaryFormatter.Serialize(fileStream, this); 
     } 
     catch 
     { 
      throw; 
     } 
     finally 
     { 
      fileStream.Close(); 
     } 
    } 

    protected override void OnClosing(CancelEventArgs e) 
    { 
     SerializeThis(); 
     base.OnClosing(e); 
    } 
} 
-1

De alguna manera puede guardar todo en un oculto textbox de forma oculta. Cuando el usuario haga clic en el botón apply, abra el archivo de texto automáticamente y haga que el programa lo lea línea por línea.

Ejemplo:

  • Line 1 podría ser la localización de una imagen
  • Line 2 podría ser el texto para un cuadro de texto
  • Línea 3 podría ser una palabra o el número que el programa utiliza para determinar si una casilla de verificación es verdadera o falsa
+0

Simplemente está cambiando el problema. El OP ahora tendría que resolver cómo escribir y leer desde este texto, y escribir y leer desde un archivo. –

Cuestiones relacionadas