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???
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
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.
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
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 }
"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.
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.
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!??
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...)
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".
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;
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;
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!"); }
/// <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 }
}
Synes godt om
Ny brugerNybegynder
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.