Dialogboks
Børre Stenseth
Moduler>Arkitektur>Dialogbokser

Dialogbokser

Hva
Litt om ferdige og egne dialogbokser

I den arkitekturen som Visual studio inviteter til er alle vinduer bygd over samme lest, de er varanter av Form. Vi lager som oftest våre programmer med å generere en hovedform, som får default navn Form1. Dersom vi trenger flere vinduer står vi fritt i å definere disse og vise dem fram. Normalt ønsker vi å betrakte andre forms som dialogbokser av en eller annen type. Som regel er hensikten med en slik dialogboks å gjøre en "sideordnet" jobb eller en deljobb som krever en enkel beslutning, spesifikasjon eller gjerne en mer omfattende operasjon, som editering en wizard-sekvens eller annet. I de alle fleste tilfellene er slik sideordnede jobber modale. Det vil si at vi tvinger brukeren til å gjøre ferdig en slik deljob før han/hun kommer videre, på hovedvinduet.

I denne modulen skal vi se litt på de vanlige dialogsituasjonene, noen fellestrekk ved disse, og vi skal lage et program der vi lager vår egen modale dialog.

Standard meldinger

Vi her ofte behov for korte avklaringer med brukere av typen: Vil du virkelig slette..., Sikker på at du vil slutte.., Spare endringene først.., osv. Slik korte standardiserte dialogfragmenter realiserer vi lettest med standardiserte meldingsbokser, "message box". For eksempel:

if (MessageBox.Show(this, "vil du virkelig slette ?","melding", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
...
}

detaljene i dette er beskrevet i dokumenstasjonen. Det vi skal merke oss er imidlertid DialogResult som definerere et sette med standard "resultater" som vi kan plukke fra en dialog, en enumeration. Dette er ikke resultater i form av noe vi har spesifisert, det angir hvordan vi avsluttet dialogen. Verdier er: Abort, Cancel, Ignore , No, OK, Retry, Yes.

Standard dialoger

For å gjøre verden litt letter for oss tilbyr Visual studio noen ferdiglagde dialogbokser med litt mer innhold. Disse er default: ColorDialog, FontDialog, OpenFileDialog, SaveFileDialog, FolderBrowserDialog. Vi vil sikkert finne mange flere som vi kan importere. Typisk bruk:

folderBrowserDialog1.SelectedPath=Application.StartupPath;
if (folderBrowserDialog1.ShowDialog(this) == DialogResult.OK)
{
    textBox1.Text = folderBrowserDialog1.SelectedPath;
}

Merk at vi kan sette egenskaper før vi setter opp dialogboksen og vi kan lese egenskaper etter at boksen har avsluttet.

Egen dialogboks

Vi lager et enkelt program som neppe bringer verden særlig framover, men som fanger opp de viktigste prinsippene vi har nevnt ovenfor. For sammenligningens skyld lager vi et program som både bruker en standard dialog, ColorPicker, og vår hjemmesnekrede dialogboks.

Vi lager en ny solution og får opp en stanardform, Form1. Så lager vi en ny Form, Add Windows Form. Vi kaller denne myDialog. Den skiller seg i utgangspunktet ikke fra andre former. Det første vi gjør er at møblere vår nye form med to knapper og et tekstfelt. Tekstfeltet er der vi skal skrive inn teksten som er hele dialogboksen hensikt og de to knappene skal tjene som "OK" og "CANCEL".

Vi ønsker via de egenskapene vi kan manipulere i Visual Studio å får den til å oppføre seg som en dialogboks. Det vil si at:

  1. den skal automatisk forsvinne når vi klikker på en "avslutningsknapp", i vårt tilfelle OK eller CANCEL.
  2. den skal returnere en indikasjon på hva som avsluttet den, i vårt tilfelle ok eller cancel.
  3. vi skal kunne lese ut vilke settinger som er gjort i boksen, etter at dialogboksen er forsvunnet, i vårt tilfelle den teksten som er skrevet inn.
  4. vi skal kjøre dialogboksen slik at vi kan avslutte med return og escape i stedet for å klikke på henholdsvis ok og cancel.

OK-knappens DialogResult-egenskap får verdien OK, og Cancel knappen får egenskapen Cancel. Vi kan velge mellom: OK, Cancel, Abort, Retry, Yes og NO. Dette ivaretar kravene 1 og 2 ovenfor.

Vi definerer en property, theText, som vi kan sette fra hovedvinduet før vi kjører dialogen og hente etter at vi har avsluttet dialogen. Dette ivaretar det tredje kravet ovenfor.

Dersom vi vil realisere krav 4, så endrer vi Formens egenskaper: AcceptButton og CancelButton ved å kople til våre to respektive buttons. Merk at her må vi være litt forsiktige dersom dialogboksen inneholder tekstfelter for input med flere linjer (Multiline=true). Vi må da passe på å sette AcceptReturns =true i tekstfeltet.

Dialogboksen

screen

Koden er slik:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace dialogtest
{
    public partial class myDialog : Form
    {
        public String theText
        {
            get { return textBox1.Text; }
            set { textBox1.Text = value; }
        }
        
        public myDialog()
        {
            InitializeComponent();
        }
    }
}

Hovedvinduet

screen

Koden er slik:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace dialogtest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void buttonColor_Click(object sender, EventArgs e)
        {
            // the colordialog is already generated
            colorDialog1.Color = label1.ForeColor;
            DialogResult dr=colorDialog1.ShowDialog(this);
            if (dr == DialogResult.OK)
            {
                label1.ForeColor =colorDialog1.Color;
            }
        }
        private void buttonMyDialog_Click(object sender, EventArgs e)
        {
            // we make a new dialog each time we need one
            myDialog f = new myDialog();
            
            f.theText = label1.Text;
            DialogResult dr = f.ShowDialog(this);
            if (dr == DialogResult.OK)
            {
                label1.Text=f.theText;
            }
            f.Dispose();
        }
    }
}
Referanser
Prosjekt:
https://svn.hiof.no/svn/psource/Csharpspikes/dialogbox1
Vedlikehold

B.Stenseth, mars 2007

(Velkommen) Moduler>Arkitektur>Dialogbokser (Websites)