Databinding
File-IO
Properties
Exceptions
Børre Stenseth
Moduler>Databinding>Enkelt register

Et enkelt register

Hva
Image1
Administrere en enkel telefonbok

Denne modulen beskriver et minimalistisk program for å vise og vedlikeholde et register. Registeret lagres som en enkel tekstfil, med et datasett pr linje og kommaseparerte felter.

Dataene presenteres i en DataGridView, med et datasett pr linje. DataGridView-komponenten er koplet til klassen Person via et BindingSource-objekt.

Redigering av datafelter, insetting av nye og fjerning av eksisterende personer skjer direkte i DataGridView-komponenten, insetting og fjerning ved høyre museklikk.

Jeg viser ikke Form1.Designer.cs. Du kan laste ned prosjektet og inspisere all koden, se referanser.

Person

Datasettene er beskrevet ved klasse Person, med tre properties og en metode:

using System;
using System.Collections.Generic;
using System.Text;
namespace Register
{
    class Person: Object
    {
        protected string navn;
        protected string mobil;
        protected string epost;
        public Person(string n, string m, string e)
        {
            navn = n;
            mobil = m;
            epost = e;
        }
        public Person(string line)
        {
            navn = "-";
            mobil = "-";
            epost = "-";
            string[] list = line.Split(',');
            if (list.Length > 0) navn = list[0];
            if (list.Length > 1) mobil = list[1];
            if (list.Length > 2) epost = list[2];
        }
        public string Navn
        {
            get { return navn; }
            set { navn = value; }
        }
        public string Mobil
        {
            get { return mobil; }
            set { mobil = value; }
        }
        public string EPost
        {
            get { return epost; }
            set { epost = value; }
        }
        public override string ToString()
        {
            return navn + "," + mobil + "," + epost; 
        }
    }
}

Form

Koden i Formen er enkel, slik:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.IO;
namespace Register
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            LoadData();
        }
        private void Form1_FormClosing(object sender, 
                                       FormClosingEventArgs e)
        {
            SaveData();
        }       
        private void insertToolStripMenuItem_Click(object sender, 
                                                   EventArgs e)
        {
            personBindingSource.
                Add(new Person("<skriv her>,<skriv her>,<skriv her>"));
        }
        private void deleteToolStripMenuItem_Click(object sender, 
                                                   EventArgs e)
        {
            personBindingSource.RemoveCurrent();
        }
        protected void LoadData()
        {
            StreamReader sr = null;
            try
            {
                // load existing persons from file
                sr = new StreamReader(Path.Combine(Application.StartupPath, 
                                                  "data/personer.txt"));
                sr.BaseStream.Position = 0;
                while (!sr.EndOfStream)
                    personBindingSource.Add(new Person(sr.ReadLine()));
                // if file was empty
                if (personBindingSource.Count == 0)
                    throw new Exception("Empty file");
                dataGridView1.Refresh();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Error", MessageBoxButtons.OK);
                personBindingSource.Add(
                    new Person("<skriv her>,<skriv her>,<skriv her>,"));
            }
            finally{
                if(sr!=null)
                    sr.Close();
            }
        }
        protected void SaveData()
        {
            StreamWriter sw = null;
            try
            {
                // save existing persons to file
                sw = new StreamWriter(Path.Combine(Application.StartupPath,
                                                   "data/personer.txt"));
                sw.BaseStream.Position = 0;
                foreach (Object obj in personBindingSource.List)
                    sw.WriteLine(obj.ToString());
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Error", MessageBoxButtons.OK);
            }
            finally
            {
                if (sw != null)
                    sw.Close();
            }
        }
    }
}

Vi ser at vi forutsetter en datafile, personer.txt, som skal ligge i samme katalog som applikasjonen. Dersom en slik fil ikke finnes, lages den.

Referanser
  • Prosjektet:
    https://svn.hiof.no/svn/psource/Csharpspikes/register
Vedlikehold

B.Stenseth, januar 2006

(Velkommen) Moduler>Databinding>Enkelt register (Sonetter)