Avatar billede ine28 Nybegynder
12. januar 2006 - 19:03 Der er 14 kommentarer

ChechBox'e skal gemmes...hvordan??

Hej.

Jeg sidder med et program, hvor jeg har 15 checkbox'e i en form. Jeg skal tjekke på, om de er 'afkrydset' eller ej, og resultatet skal gemmes og sendes videre til en anden form...
Jeg har ikke rigtig nogen idé om, hvordan det skal gøres, så er der nogen der ligger inde med et eksempel???

Fortsat god dag! :O)

Mvh. Trine.
Avatar billede spif2001 Nybegynder
12. januar 2006 - 19:39 #1
Kan du ikke bare smide dem i en liste a la ArrayList og sende listen?
Avatar billede ine28 Nybegynder
12. januar 2006 - 19:59 #2
Joh, det kan jeg nok godt... ledte nu efter et konkret eksempel, for jeg er ikke så stærk i C# - endnu! ;O)
Avatar billede bitsch Nybegynder
12. januar 2006 - 20:53 #3
Lav en klasse der har 15 properties af typen bool.
Navngiv de enkelte properties i henhold til navnet på den enkelte checkbox. Lav en instans af denne klasse når du kalder den anden form, og assign de enkelte properties med checkboxenes Checked state.
Pass instansen til din anden form vha. parameter på constructoren, eller ved hjælp af en property på denne (afhænger af hvad du vil).

At bruge et array er ingen pæn løsning da din "anden" form da skal vide noget om rækkefølgen af felterne. Men skal du blot cheke om alt er afkrydset kan du naturligvis godt anvende en sådan array løsning, men så er der også andre meget simplere metoder.
Avatar billede bitsch Nybegynder
12. januar 2006 - 21:00 #4
Hvis det er sådan at din anden form skal opdateres hver gang én checkboks ændrer status, så bør du i stedet eksponere deres CheckedChanged event og så lytte på dette i form2
Avatar billede bitsch Nybegynder
12. januar 2006 - 21:23 #5
Her lige et hurtigt lille eksempel med to forms:


namespace WindowsApplication1
{
    using System;
    using System.Windows.Forms;

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            CheckBoxStates checkBoxStates = new CheckBoxStates(this.checkBox1.Checked, this.checkBox2.Checked, this.checkBox3.Checked);

            Form2 form2 = new Form2(checkBoxStates);
            form2.ShowDialog();
        }
    }

    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        public Form2(CheckBoxStates checkBoxStates)
            : this()
        {
            if (checkBoxStates == null)
            {
                throw new ArgumentNullException("checkBoxStates");
            }

            this.checkBox1.Checked = checkBoxStates.CheckBoxState1;
            this.checkBox2.Checked = checkBoxStates.CheckBoxState2;
            this.checkBox3.Checked = checkBoxStates.CheckBoxState3;
        }

    }

    public class CheckBoxStates
    {
        private bool checkBoxState1;
        private bool checkBoxState2;
        private bool checkBoxState3;

        // Giv meningsfulde navne og ikke som her! (eksempel)
        public bool CheckBoxState1  { get { return this.checkBoxState1; } set { this.checkBoxState1 = value; } }
        public bool CheckBoxState2 { get { return this.checkBoxState2; } set { this.checkBoxState2 = value; } }
        public bool CheckBoxState3 { get { return this.checkBoxState3; } set { this.checkBoxState3 = value; } }

        public CheckBoxStates()
        {
            // eventuel initialicerian af hvad du måtte ønske
        }

        public CheckBoxStates(
            bool checkBoxState1,
            bool checkBoxState2,
            bool checkBoxState3/* osv. */)
            : this()
        {
            this.checkBoxState1 = checkBoxState1;
            this.checkBoxState2 = checkBoxState2;
            this.checkBoxState3 = checkBoxState3;
        }
    }
}
Avatar billede bitsch Nybegynder
12. januar 2006 - 21:25 #6
CheckBoxStates kan naturligvis også være en struct
Avatar billede spif2001 Nybegynder
13. januar 2006 - 09:59 #7
"At bruge et array er ingen pæn løsning da din "anden" form da skal vide noget om rækkefølgen af felterne. Men skal du blot cheke om alt er afkrydset kan du naturligvis godt anvende en sådan array løsning, men så er der også andre meget simplere metoder."

Det er jo bare et spørgsmål om at sætte Tag værdien i checkbox'ene til en værdi der kan checkes på.

checkBox1.Tag = "FørsteValg";

checkBox2.Tag = "AndetValg";

osv.

og derefter lave en foreach løkke med ArrayListen med en switchcase på Tag værdierne.

Det er da vældig pænt og man undgår en klasse der ikke er andet end bools.
Avatar billede bitsch Nybegynder
13. januar 2006 - 13:14 #8
Det kan man naturligvis godt, men jeg vil dog ikke selv anvende en sådan løsning.
f.eks. antag at én af checkboxene ændrer navn i fremtiden, så vil form 2 fejle da den er nødt til at have hardcode værdier for navnene ved mindre at disse navne er eksponeret på en eller anden vis.
Men valget af den rette løsning afhænger af hvor detaljeret man vil have sine oplysninger. Antag f.eks, at man kun vil vide hvilken box som ikke er checket af, så er din løsning klart det nemmeste.
Avatar billede ine28 Nybegynder
13. januar 2006 - 14:02 #9
Indtil videre takker jeg for jeres input. Jeg vender tilbage, når jeg har afprøvet det! :O)
Avatar billede ine28 Nybegynder
16. januar 2006 - 18:12 #10
Jeg har kigget lidt på det du har skrevet, spif2001. Jeg tror godt jeg kan bruge det, men nu er jeg jo kommet til den konklusion, at jeg skal sende noget andet end bare om checkboxene er afkrydsede.... (ja, jeg er ubeslutsom...undskyld ;O)
Sagen er den at jeg skal sende navnet/navnene på en (flere) film, samt deres tilhørende pris. Så, jeg skal i min første form finde ud af, hvad der er blevet afkrydset, og så skal jeg sende resultatet til min anden form.

Jeg er af den opfattelse at det må være noget i den retning, du har beskrevet, hvor jeg bare skal sende noget andet!??? Kunne jeg evt. lokke dig til at sende mig endnu et eksempel, hvis det afviger meget fra det, du allerede har lavet!??

På forhånd mange tak! :O)
Avatar billede ine28 Nybegynder
17. januar 2006 - 08:55 #11
Undskyld. Jeg mente selvfølgelig dig, bitsch..... Ovennævnte kommentar fra mig, retter mig selvfølgelig til dig!! ;o) (Jeg har bare læst forkert på navnene...)
Avatar billede bitsch Nybegynder
17. januar 2006 - 13:18 #12
Du laver blot en ny property på din "resultat klasse" af den type du har behov for.
Akkurat som de booleans som er oprettet pt.

eg. (her vist med string som Name, men det kunne være hvad som helst)

private string name;

public string Name
{
    get
    {
        return this.name;
    }
    set
    {
        this.name = value;
    }
}

du kan tilsvarende udvide din constructor med en Name parameter for at gøre det lettere at oprette nye "resultater".
Avatar billede bitsch Nybegynder
17. januar 2006 - 13:24 #13
Flere navne på flere film... kan løses på forskellige måder.
Jeg ville nok leve en klasse til at indeholde informationen om én film, og så derefter lave en collection af disse som kan sendes over til din anden form.
I din anden form kan du så iterere listen af dine "film resultater".
Avatar billede bitsch Nybegynder
17. januar 2006 - 14:40 #14
Her er et lille hurtigt eksempel:

namespace WindowsApplication
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Text;
    using System.Windows.Forms;

    public class Form1 : Form
    {
        private System.Windows.Forms.CheckBox checkBox1;
        private System.Windows.Forms.CheckBox checkBox2;
        private System.Windows.Forms.CheckBox checkBox3;
        private System.Windows.Forms.Button buttonOk;
        private System.Windows.Forms.CheckBox checkBox4;

        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.checkBox1 = new System.Windows.Forms.CheckBox();
            this.checkBox2 = new System.Windows.Forms.CheckBox();
            this.checkBox3 = new System.Windows.Forms.CheckBox();
            this.buttonOk = new System.Windows.Forms.Button();
            this.checkBox4 = new System.Windows.Forms.CheckBox();
            this.SuspendLayout();
            //
            // checkBox1
            //
            this.checkBox1.AutoSize = true;
            this.checkBox1.Location = new System.Drawing.Point(13, 13);
            this.checkBox1.Name = "checkBox1";
            this.checkBox1.Size = new System.Drawing.Size(54, 17);
            this.checkBox1.TabIndex = 0;
            this.checkBox1.Text = "Film A";
            this.checkBox1.UseVisualStyleBackColor = true;
            //
            // checkBox2
            //
            this.checkBox2.AutoSize = true;
            this.checkBox2.Location = new System.Drawing.Point(13, 37);
            this.checkBox2.Name = "checkBox2";
            this.checkBox2.Size = new System.Drawing.Size(54, 17);
            this.checkBox2.TabIndex = 1;
            this.checkBox2.Text = "Film B";
            this.checkBox2.UseVisualStyleBackColor = true;
            //
            // checkBox3
            //
            this.checkBox3.AutoSize = true;
            this.checkBox3.Location = new System.Drawing.Point(13, 61);
            this.checkBox3.Name = "checkBox3";
            this.checkBox3.Size = new System.Drawing.Size(54, 17);
            this.checkBox3.TabIndex = 2;
            this.checkBox3.Text = "Film C";
            this.checkBox3.UseVisualStyleBackColor = true;
            //
            // buttonOk
            //
            this.buttonOk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
            this.buttonOk.Location = new System.Drawing.Point(205, 231);
            this.buttonOk.Name = "buttonOk";
            this.buttonOk.Size = new System.Drawing.Size(75, 23);
            this.buttonOk.TabIndex = 3;
            this.buttonOk.Text = "Ok";
            this.buttonOk.UseVisualStyleBackColor = true;
            this.buttonOk.Click += new System.EventHandler(this.ButtonOkClick);
            //
            // checkBox4
            //
            this.checkBox4.AutoSize = true;
            this.checkBox4.Location = new System.Drawing.Point(13, 85);
            this.checkBox4.Name = "checkBox4";
            this.checkBox4.Size = new System.Drawing.Size(55, 17);
            this.checkBox4.TabIndex = 4;
            this.checkBox4.Text = "Film D";
            this.checkBox4.UseVisualStyleBackColor = true;
            //
            // Form1
            //
            this.AcceptButton = this.buttonOk;
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(292, 266);
            this.Controls.Add(this.checkBox4);
            this.Controls.Add(this.buttonOk);
            this.Controls.Add(this.checkBox3);
            this.Controls.Add(this.checkBox2);
            this.Controls.Add(this.checkBox1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private void ButtonOkClick(object sender, EventArgs e)
        {
            System.Collections.Generic.List<FilmInfo> filmInfos = this.HentResultater();

            ResultatForm resultatForm = new ResultatForm(filmInfos);

            DialogResult dialogResult = resultatForm.ShowDialog();

            if (dialogResult == DialogResult.OK)
            {
                MessageBox.Show("Hello World"); // Eller hvad du ellers vil foretage dig hvis der trykkes Ok
            }
        }

        private System.Collections.Generic.List<FilmInfo> HentResultater()
        {
            System.Collections.Generic.List<FilmInfo> filmInfos = new List<FilmInfo>();

            // Dette kan laves på mange måder. Her vist ved specifikt at angive hvilken kontrol som skal betragtes (så kan du ignorere hvad du har lyst til),
            // men man kunne lige så godt loope gennem alle kontroller.
            // (eller anvende et helt andet design!)
            filmInfos = AddFilmInfo(filmInfos, this.checkBox1);
            filmInfos = AddFilmInfo(filmInfos, this.checkBox2);
            filmInfos = AddFilmInfo(filmInfos, this.checkBox3);
            filmInfos = AddFilmInfo(filmInfos, this.checkBox4);
           
            return filmInfos;
        }

        private System.Collections.Generic.List<FilmInfo> AddFilmInfo(System.Collections.Generic.List<FilmInfo> filmInfos, CheckBox checkBox)
        {
            if (checkBox != null && checkBox.Checked)
            {
                FilmInfo filmInfo = new FilmInfo(checkBox.Text); // Udvid med hvad du måtte ønske...
                filmInfos.Add(filmInfo);
            }
           
            return filmInfos;
        }
    }

    public class FilmInfo
    {
        private string navn = string.Empty;

        public string Navn
        {
            get
            {
                return this.navn;
            }
            internal set // For eksemplets skyld (Kan både være public eller blot udelades)
            {
                this.navn = value;
            }
        }

        // TODO: Flere properties for din klasse

        /// <summary>
        /// Constructor som tillader at man sætter properties...
        /// </summary>
        /// <param name="navn">Filmens navn.</param>
        public FilmInfo(string navn)
        {
            this.Navn = navn;
       
        }
    }

    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }

    public class ResultatForm : Form
    {
        private TextBox textBoxResultat;
        private Button buttonOk;
        System.Collections.Generic.List<FilmInfo> filmInfos = null;

        public ResultatForm()
        {
            InitializeComponent();
        }

        public ResultatForm(System.Collections.Generic.List<FilmInfo> filmInfos) : this()
        {
            this.filmInfos = filmInfos;
            this.OpdaterText(this.filmInfos);
        }

        private void OpdaterText(System.Collections.Generic.List<FilmInfo> filmInfos)
        {
            if (filmInfos == null)
            {
                throw new ArgumentNullException("filmInfos");
            }

            StringBuilder stringBuilder = new StringBuilder();

            if (filmInfos.Count > 0)
            {
                foreach (FilmInfo filmInfo in filmInfos)
                {
                    stringBuilder.AppendLine(filmInfo.Navn);
                }
            }
            else
            {
                stringBuilder.AppendLine("Der er ikke valgt film!");
            }

            this.textBoxResultat.Text = stringBuilder.ToString();
        }

        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.textBoxResultat = new System.Windows.Forms.TextBox();
            this.buttonOk = new System.Windows.Forms.Button();
            this.SuspendLayout();
            //
            // textBoxResultat
            //
            this.textBoxResultat.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
                        | System.Windows.Forms.AnchorStyles.Left)
                        | System.Windows.Forms.AnchorStyles.Right)));
            this.textBoxResultat.Enabled = false;
            this.textBoxResultat.Location = new System.Drawing.Point(13, 13);
            this.textBoxResultat.Multiline = true;
            this.textBoxResultat.Name = "textBoxResultat";
            this.textBoxResultat.Size = new System.Drawing.Size(267, 196);
            this.textBoxResultat.TabIndex = 0;
            //
            // buttonOk
            //
            this.buttonOk.DialogResult = System.Windows.Forms.DialogResult.OK;
            this.buttonOk.Location = new System.Drawing.Point(205, 231);
            this.buttonOk.Name = "buttonOk";
            this.buttonOk.Size = new System.Drawing.Size(75, 23);
            this.buttonOk.TabIndex = 1;
            this.buttonOk.Text = "Ok";
            this.buttonOk.UseVisualStyleBackColor = true;
            //
            // ResultatForm
            //
            this.AcceptButton = this.buttonOk;
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(292, 266);
            this.Controls.Add(this.buttonOk);
            this.Controls.Add(this.textBoxResultat);
            this.Name = "ResultatForm";
            this.Text = "ResultatForm";
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion
    }

}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester