kalla metoder från en klass till form1.cs

Permalänk
Medlem

kalla metoder från en klass till form1.cs

jag har en checkbox som öppnar upp en textbox så man kan skriva in antal. Jag har 20st "items" som man kan "checka" i och tänkte att man kanske kan trycka in alla i en egen klass som jag sedan kan anropa till Form1.cs och Form1.Designer.cs när man använder checkbox.
Men hittar inget om hur det skulle gå till?

Jag ska skriva 20st metoder som ser ut så här

private void chkJeansJeggers_CheckedChanged(object sender, EventArgs e) { if (chkJeansJeggers.Checked) { textBox1.Text = ""; textBox1.Enabled = true; textBox1.Focus(); picSales.Image = Properties.Resources.Jeans; } else { textBox1.Text = "0"; textBox1.Enabled = false; picSales.Image = Properties.Resources.zaraicon; }

Byter ut JeansJeggers till socks, hat etc och textbox2, 3, 4 etc.

Permalänk
Medlem

@karu83: Du får nog vara lite tydligare om vad du menar. Anropa en annan klass gör du som vanligt via att instansiera den och hålla i minnet så länge du behöver komma åt metoderna.

Permalänk
Medlem

@zaibuf:

okay, sorry ska försöka vara tydligare.

Jag har denna koden i Form1.cs

using System; using System.Drawing; using System.Windows.Forms; namespace SalesApp { public partial class Form1 : Form { public Form1() { InitializeComponent(); } //=================================Funtions private void ResetTextBox() { Action<Control.ControlCollection> func = null; func = (controls) => { foreach (Control control in controls) if (control is TextBox) (control as TextBox).Text = "0"; else func(control.Controls); }; func(Controls); } //--------------------------EnableTextbox private void EnableTextBox() { Action<Control.ControlCollection> func = null; func = (controls) => { foreach (Control control in controls) if (control is TextBox) (control as TextBox).Enabled = false; else func(control.Controls); }; func(Controls); } //--------------------------EnableChecktbox private void EnableCheckBox() { Action<Control.ControlCollection> func = null; func = (controls) => { foreach (Control control in controls) if (control is TextBox) (control as TextBox).Enabled = false; else func(control.Controls); }; func(Controls); } //========================================= private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) { e.Graphics.DrawString(richTextBox1.Text, new Font("Arial", 11, FontStyle.Regular), Brushes.Black, new Point(0, 0)); } private void button3_Click(object sender, EventArgs e) { printPreviewDialog1.ShowDialog(); } private void button5_Click(object sender, EventArgs e) { DialogResult iExit; iExit = MessageBox.Show("Confirm if you want to exit", "Sales Management System", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (iExit == DialogResult.Yes) { Application.Exit(); } } private void Form1_Load(object sender, EventArgs e) { picSales.Image = Properties.Resources.zaraicon; richTextBox1.Clear(); EnableTextBox(); ResetTextBox(); EnableCheckBox(); } private void picSales_Click(object sender, EventArgs e) { var imageSize = picSales.Image.Size; var fitSize = picSales.ClientSize; picSales.SizeMode = imageSize.Width > fitSize.Width || imageSize.Height > fitSize.Height ? PictureBoxSizeMode.Zoom : PictureBoxSizeMode.CenterImage; } } }

Jag har en checkbox för varje item jag vill lägga in i koden

private void chkJeansJeggers_CheckedChanged(object sender, EventArgs e) { if (chkJeansJeggers.Checked) { textBox1.Text = ""; textBox1.Enabled = true; textBox1.Focus(); picSales.Image = Properties.Resources.Jeans; } else { textBox1.Text = "0"; textBox1.Enabled = false; picSales.Image = Properties.Resources.zaraicon; } private void chkCoatsJackets_CheckedChanged(object sender, EventArgs e) { if (chkCoatsJackets.Checked) { textBox1.Text = ""; textBox1.Enabled = true; textBox1.Focus(); picSales.Image = Properties.Resources.Coat; } else { textBox1.Text = "0"; textBox1.Enabled = false; picSales.Image = Properties.Resources.zaraicon; }

och så vidare för 20st items.
istället för att ha all 20 items i min Form1.cs "main" så undrar jag om det går att lägga dom i en klass som vi kan kalla för "items".
och sedan anropa i Form1.cs när Checkbox1 till 20 används?

Permalänk
Medlem

Hej!

Får se om jag förstår dig rätt:
Jag tänker mig att du vill koppa alla dina checkboxar till samma event-metod?

För att du ska få det att fungera så behöver du ju då kunna avgöra vilken checkbox det var som eventet kommer ifrån. Det får du ut från sender-objektet.

Därefter behöver du bestämma dig för vad du ska göra, och här blir det kanske lite lurigare eftersom du behöver få en logisk koppling mellan checkboxen som var avsändare och vad som ska hända.

Om det är så att varje checkbox också har en inmatningsruta (det är svårt att veta exakt från din beskrivning och din kod, men jag gissar det) så är mitt tips att knåpa ihop en egen kontroll bestående av både checkbox och textbox och sedan från formuläret skapa upp en mängd med sådana kontroller istället.

Edit: Efter en andra genomläsning så verkar det som om du har en och samma textbox oavsett vilken checkbox som du vill använda och endast byter bild (och sätter textboxen till enabled). Då fungerar det förmodligen bättre med den övre delen i lösningsförslaget. Kanske skulle du också kunna ha en egenskap på respektive checkbox för att avgöra vilken bild som ska visas och därmed skulle koden kunna bli mycket enklare.

Permalänk
Medlem
Skrivet av MickeBoy:

Hej!

Får se om jag förstår dig rätt:
Jag tänker mig att du vill koppa alla dina checkboxar till samma event-metod?

För att du ska få det att fungera så behöver du ju då kunna avgöra vilken checkbox det var som eventet kommer ifrån. Det får du ut från sender-objektet.

Därefter behöver du bestämma dig för vad du ska göra, och här blir det kanske lite lurigare eftersom du behöver få en logisk koppling mellan checkboxen som var avsändare och vad som ska hända.

Om det är så att varje checkbox också har en inmatningsruta (det är svårt att veta exakt från din beskrivning och din kod, men jag gissar det) så är mitt tips att knåpa ihop en egen kontroll bestående av både checkbox och textbox och sedan från formuläret skapa upp en mängd med sådana kontroller istället.

Edit: Efter en andra genomläsning så verkar det som om du har en och samma textbox oavsett vilken checkbox som du vill använda och endast byter bild (och sätter textboxen till enabled). Då fungerar det förmodligen bättre med den övre delen i lösningsförslaget. Kanske skulle du också kunna ha en egenskap på respektive checkbox för att avgöra vilken bild som ska visas och därmed skulle koden kunna bli mycket enklare.

@MickeBoy:

Har kommit så här långt.
Först så la jag till InitializeInputs(); i Form1.cs

public partial class Form1 : Form { public Form1() { InitializeComponent(); InitializeInputs(); } void InitializeInputs() { Items.Form1 = this; Items.Form1.Controls[""].Click += Items.chkJeans_CheckedChanged; } //=================================Funtions

sedan gjorde jag en klass som heter items och la till min checkbox.

using System; using System.Windows.Forms; namespace SalesApp { public static class Items { public static Form Form1; public static void chkJeans_CheckedChanged(object sender, EventArgs e) { if (chkJeans.Checked) { textBox1.Text = ""; textBox1.Enabled = true; textBox1.Focus(); picSales.Image = Properties.Resources.Jeans; } else { textBox1.Text = "0"; textBox1.Enabled = false; picSales.Image = Properties.Resources.zaraicon; } } } }

Det error jag får nu är på (chkJeans.Checked) The name 'chkJeans' does not exit in current context. Men min checkbox heter ju det? så nått är fel på vägen....
textBox1 och picSales hittas inte heller....

EDIT: nej, nästa kommer vara en checkbox som heter chkCoat som kommer ändra value i en textBox2 sedan en som heter chkSwimwear som pratar med textBox3 osv. 20st

EDIT 2: Tror aldrig de kommer fungera för alla funktioner för checkbox och textbox ligger Form1.Cs

private void Form1_Load(object sender, EventArgs e) { picSales.Image = Properties.Resources.zaraicon; richTextBox1.Clear(); EnableTextBox(); ResetTextBox(); EnableCheckBox(); }

med flera. störigt....!

Permalänk
Medlem
Skrivet av karu83:

@MickeBoy:

Har kommit så här långt.
Först så la jag till InitializeInputs(); i Form1.cs

public partial class Form1 : Form { public Form1() { InitializeComponent(); InitializeInputs(); } void InitializeInputs() { Items.Form1 = this; Items.Form1.Controls[""].Click += Items.chkJeans_CheckedChanged; } //=================================Funtions

sedan gjorde jag en klass som heter items och la till min checkbox.

using System; using System.Windows.Forms; namespace SalesApp { public static class Items { public static Form Form1; public static void chkJeans_CheckedChanged(object sender, EventArgs e) { if (chkJeans.Checked) { textBox1.Text = ""; textBox1.Enabled = true; textBox1.Focus(); picSales.Image = Properties.Resources.Jeans; } else { textBox1.Text = "0"; textBox1.Enabled = false; picSales.Image = Properties.Resources.zaraicon; } } } }

Det error jag får nu är på (chkJeans.Checked) The name 'chkJeans' does not exit in current context. Men min checkbox heter ju det? så nått är fel på vägen....
textBox1 och picSales hittas inte heller....

EDIT: nej, nästa kommer vara en checkbox som heter chkCoat som kommer ändra value i en textBox2 sedan en som heter chkSwimwear som pratar med textBox3 osv. 20st

Jag skulle gjort såhär:

I Visual Studio: Skapa en ny kontroll genom att
1. Högerklicka på projektet och välj Add... -> User Control (Windows Forms)
2. Skapa din User Control som förmodligen innehåller en CheckBox, en textbox och en bildvisare
3. Implementera all logik som du vill ha i din user control som rör interaktionen mellan checkboxen och textboxen
4. I huvudformläret lägger du sedan till 20 st sådana user controls om det är specifikt 20 du ska ha. Du kan också göra det dynamiskt så att det skapas ett antal baserat på en konfiguration.
5. Nu behöver du lägga till avläsning av data från huvudformuläret från dina user controls.

Permalänk
Medlem

Hej igen!

Jag insåg att det kan vara lurig att förstå hur jag menade, så jag knåpade ihop ett litet exempel som du kan ha att titta på för inspiration när du jobbar vidare.

Jag har skickat en länk till en kompletta koden i ett PM till dig.