Yo en tu lugar lo que haria es trabajar con la serialización y deserialización de objetos. Es una función bastante robusta y sólida desde el framework 2.0 y no se diga en los posteriores. En el propio msdn verás ejemplos muy prácticos de como serializar y deserializar objetos. Si no tienes restricciones, el caso más sencillo es utilizando XML (en cuestión de unos cuantos minutos podrías tener toda la funcionalidad que deseas)
Estoy de acuerdo con Sargeras en que la serializacion (convertir un objeto en una serie de bytes para almacenarlo o trasmitirlo por algún medio [red, disco, etc]) podía ser buena opción, sin embargo creo que lo que buscas es tu tener la lógica de como se guardan las cosas... así que te recomendaría crear una clase que se llame Entrada mas o menos así
Código:
public class Entrada
{
public Entrada()
{
Nombre = string.Empty;
Apellidos = string.Empty;
// inicializar las demás variables
}
public string Nombre {get; set;}
pubilc string Apellidos {get; set;}
public int Telefono {get;set}
// otras variables
public string Exportar()
{
string exportado = string.Empty;
exportado += Nombre + "|" + Apellidos + "|" + Telefono "|";
// asi sumas todas las variables
}
public void Importar(string registro)
{
string[] elementos = registro.Split("|".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
Nombre = elementos[0];
Apellidos = elementos[1];
Telefono = elementos[2];
// las demás variables
}
public override string ToString()
{
return Nombre + " " + Apellidos;
}
}
Crea un List<Entrada> o BindingList<Entrada> y ahí almacena tus objetos en el de la siguiente manera:
Código:
// Creas la lista
List<Entrada> lista = new List<Entrada>();
// Una instancia de Entrada
Entrada entrada1 = new Entrada();
// Llenas las propiedades
entrada1.Nombre = "Juanito";
entrada1.Apellidos = "Perez";
entrada1.Telefono = 56581111;
lista.Add(entrada1);
Entrada entrada2 = new Entrada();
// igual llenas las propiedades
lista.Add(entrada2);
De esta manera ya tienes dos entradas en la lista y las puedes usar como DataSource en algunos controles de windows como le ListBox.
Código:
lstEntradas.DataSource = lista;
Cuando tengas que guardar a disco lo puedes hacer así:
Código:
// Juntamos todas las entradas en un solo string
string contenidoDelArchivo = string.Empty;
foreach(Entrada ent in lista)
{
contenidoDelArchivo += ent.Exportar() + Environment.NewLine;
}
//Guardamos en disco
using(StreamWriter sw = new StreamWriter("C:\\agenda.dat", false))
{
sw.Write(contenidoDelArchivo);
}
Si te fijas, lo que estamos haciendo es delimitar cada registro de tu agenda con un salto de línea (Environment.NewLine)
Ahora para importar o abrir el archivo:
Código:
string contenidoDelArchivo;
using(StreamReader sr = new StreamReader("C:\\agenda.dat"))
{
contenidoDelArchivo = sr.ReadToEnd();
}
// Creamos una nueva lista
List<Entrada> lista = new List<Entrada>();
// Cargamos los registros
string[] registros = contenidoDelArchivo.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
//Convertimos cada registro en un objeto
foreach(string reg in registros)
{
Entrada e = new Entrada();
e.Importar(reg);
lista.Add(e);
}
Y listo, ya tienes nuevamente tu archivo convertido en objetos.
Si quieres editar alguna entrada de tu agenda, copies los valores de las propiedades a algún control, y que cuando las modifiques le asignes el nuevo valor a dicha entrada, cuando guardes se almacenará el nuevo valor.
Algo muy sencillo que puedes hacer para editar los valores sin desarrollar nada, es que uses el control PropertyGrid y le mandes como parámetro a SelectedObject() la entrada de la lista que quieres ver, ej:
Código:
propertyGrid.SelectedObject(lista[1]);
// puedes llevar un indice controlado por botones para aumentar (avanzar) o disminuir(regresar) el registro actual
Código:
//clic al boton "anterior"
private void anteriorButton_Click(object sender, EventArgs e)
{
//aqui puedes validar si indice-- no es menor que los elementos de tu lista
indice--;
propertyGrid.SelectedObject(lista[indice]);
}
//clic al boton "siguiente"
private void siguienteButton_Click(object sender, EventArgs e)
{
//aqui puedes validar si indice++ no excede los elementos de tu lista
indice++;
propertyGrid.SelectedObject(lista[indice]);
}
Automágicamente el property grid pintará tus propiedades y te permitirá editarlas en tiempo real.
Saludos.
NOTAS
- Omití el uso de mejores prácticas, uso del StringBuilder, manejo de exepciones y otras validaciones porque no tienes mucha experiencia y dificilmente creerían que tu lo hiciste si entregaras dicho código.
- El código lo escribí al vuelo así que puede suceder que no compile, en dado caso trata de validar que las funciones que use estén en Mayúsculas y minúsculas como debieran ser.
- Necesitas agregar los siguientes namespaces al inicio de tu clase:
- using System.Collections.Generic;
- using System.IO;
Espero que todavía te sirva, saludos.