20. oktober 2007 - 10:18Der er
35 kommentarer og 1 løsning
Genbrug af kode til textboxe i windows forms
Hej eksperter. Jeg har skrevet følgende kode:
private string udregn1() { string stbRabat = "";
// Tjekker om tbBeskr.Text er null eller 0, og om tbStkPris.Text eller tbAntal.Text er null eller 0. // hvis ja, skriver den en notify da boxen ikke må være tom. if (string.IsNullOrEmpty(tbBeskr1.Text) && !string.IsNullOrEmpty(tbAntal1.Text) || !string.IsNullOrEmpty(tbStkPris1.Text)) { NotifyWindow nw = new NotifyWindow("OBS!", "Der er ikke skrevet nogen varebeskrivelse i linje 1."); nw.Notify(); tbBeskr1.Focus();// Placere markøren i textboxen. } else { } // //Tjekker om tbAntal1.Text || tbStkPris1.Text || tbRabat1.Text er null eller 0, hvis ja, skrives der 0 i feltet. // decimal dtbAntal = decimal.Parse(((string.IsNullOrEmpty(tbAntal1.Text)) ? "0" : tbAntal1.Text)); decimal dtbPrisStk = decimal.Parse(((string.IsNullOrEmpty(tbStkPris1.Text)) ? "0" : tbStkPris1.Text)); decimal dtbRabat = decimal.Parse(((string.IsNullOrEmpty(tbRabat1.Text)) ? "0" : tbRabat1.Text));
//Tjekker tbRabat i hvilken form rabatten er skrevet. 0,5 || 10|| 13,4 //Og rykker derefter om på karakterene så de står rigtigt. if (tbRabat1.Text.StartsWith("0,")) { stbRabat = tbRabat1.Text.Replace(",", ",00"); //Format: Eks. 0,5 } else if(tbRabat1.Text.Contains(",") && !tbRabat1.Text.StartsWith("0,")) { string stbRabat1 = tbRabat1.Text.Replace(",", ""); stbRabat = stbRabat1.Replace(stbRabat1,"0,"+stbRabat1); //Format: Eks. 14,7 } else { stbRabat = "0," + tbRabat1.Text;//Format: Eks. 10 }
Den kode vil jeg gerne genbruge på andre tekstboxe end lige de(n) som denne kode er programmeret til. Er det da muligt at lave en form for løkke som løber det igennem, og det hvor der står f.eks tbStkPris1.Text, så laver det om til tbStkpris2.Text. Osv. med alle de andre tekstboxe. Har nemlig en helt del textboxe og det bliver virkelig meget copy/paste af kode hvis jeg skal skrive denne kode om og om igen i hvert fald 25 gange. Håber det er muligt at kunne lave det! Jeg kan i hvert fald ikke gennemskue hvordan det kan laves.
Jeg har selv tænkt på om man skulle lave noget ala det her:
private decimal recursiveMethod(Control controls) { decimal amount = 0; foreach (Control control in controls.Controls) { amount += recursiveMethod(control);
TextBox textbox = control as TextBox; if (textbox == null || !textbox.Name.StartsWith("tbPris")) continue; try { amount += decimal.Parse(textbox.Text.Trim()); } catch { } } return amount; }
Og så bare med en løkke i stedet for at alle boxene bliver lagt sammen skal den køre koden øverst i denne beskrivelse. Sådan så når knappen bliver trykket kører den den øverste kode for alle textboxe som er indblandet. Håber i forstår. Ellers skriver jeg gerne en bedre forklaring.
Du har fire tekstbokse som høre logisk sammen: tbBeskr1, tbAntal1, tbStkPris1 og dtbRabat. Dertil har du noget kode som høre sammen med disse fire: udregn1().
Alt dette vil du gerne kunne gentage sådan at du kan have flere varelinjer i din form.
Mit råd er at du samler dem som sin egen Windows Control. Hvis du laver det på den måde, vil de fire knapper og deres kode automatisk hænge sammen, uanset hvor mange gange du indsætter dem.
Det gør du ved at oprette et nyt projekt - et Windows Control Library. Du kunne jo f.eks. kalde dette for VareLinjeControl. I dette indsætter du dine textbokse og din kode. Derefter inkluder du dette i dit nuværende projekt, og så kan du begynde at indsætte VareLinjeControl'er en af gangen.
Du kaaaaaaan også lave det på den måde du læger op til i spørgsmplet, men det ovenstående giver en mere ren kode i enden.
Jeg kan ikke umiddelbart give en god side, men det er nu ikke så svært.
1) Du opretter bare en WC. Den ser næsten ud som om at det vare en ny form du var b´ved at designe. 2) Så trækker du 4 tekstbokse ind på den og omdøber dem til tbBeskr, tbAntal, tbStkPris og dtbRabat (uden 1-tallerne - de bliver overflødige). 3) Så smider du din kode udregn() ind, og modificere den sådan at det kan kompile.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms;
namespace WindowsApplication1 { public partial class UserControl1 : UserControl { public UserControl1() { InitializeComponent(); }
// Tjekker om tbBeskr.Text er null eller 0, og om tbStkPris.Text eller tbAntal.Text er null eller 0. // hvis ja, skriver den en notify da boxen ikke må være tom. if (string.IsNullOrEmpty(tbBeskr1.Text) && !string.IsNullOrEmpty(tbAntal1.Text) || !string.IsNullOrEmpty(tbStkPris1.Text)) { NotifyWindow nw = new NotifyWindow("OBS!", "Der er ikke skrevet nogen varebeskrivelse i linje 1."); nw.Notify(); tbBeskr1.Focus();// Placere markøren i textboxen. } else { } // //Tjekker om tbAntal1.Text || tbStkPris1.Text || tbRabat1.Text er null eller 0, hvis ja, skrives der 0 i feltet. // decimal dtbAntal = decimal.Parse(((string.IsNullOrEmpty(tbAntal1.Text)) ? "0" : tbAntal1.Text)); decimal dtbPrisStk = decimal.Parse(((string.IsNullOrEmpty(tbStkPris1.Text)) ? "0" : tbStkPris1.Text)); decimal dtbRabat = decimal.Parse(((string.IsNullOrEmpty(tbRabat1.Text)) ? "0" : tbRabat1.Text));
//Tjekker tbRabat i hvilken form rabatten er skrevet. 0,5 || 10|| 13,4 //Og rykker derefter om på karakterene så de står rigtigt. if (tbRabat1.Text.StartsWith("0,")) { stbRabat = tbRabat1.Text.Replace(",", ",00"); //Format: Eks. 0,5 } else if (tbRabat1.Text.Contains(",") && !tbRabat1.Text.StartsWith("0,")) { string stbRabat1 = tbRabat1.Text.Replace(",", ""); stbRabat = stbRabat1.Replace(stbRabat1, "0," + stbRabat1); //Format: Eks. 14,7 } else { stbRabat = "0," + tbRabat1.Text;//Format: Eks. 10 }
I stedet for at din form regner det hele ud inkl. antal og rabat, bør hver VareLinjeControl udregne sin pris, og så bør formen bare lægge priserne for alle VareLinjeControl'erne sammen.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms;
namespace WindowsApplication1 { public partial class VareLinjeControl : UserControl { public VareLinjeControl() { InitializeComponent(); }
// Tjekker om tbBeskr.Text er null eller 0, og om tbStkPris.Text eller tbAntal.Text er null eller 0. // hvis ja, skriver den en notify da boxen ikke må være tom. if (string.IsNullOrEmpty(tbBeskr1.Text) && !string.IsNullOrEmpty(tbAntal1.Text) || !string.IsNullOrEmpty(tbStkPris1.Text)) { NotifyWindow nw = new NotifyWindow("OBS!", "Der er ikke skrevet nogen varebeskrivelse i linje 1."); nw.Notify(); tbBeskr1.Focus();// Placere markøren i textboxen. } else { } // //Tjekker om tbAntal1.Text || tbStkPris1.Text || tbRabat1.Text er null eller 0, hvis ja, skrives der 0 i feltet. // decimal dtbAntal = decimal.Parse(((string.IsNullOrEmpty(tbAntal1.Text)) ? "0" : tbAntal1.Text)); decimal dtbPrisStk = decimal.Parse(((string.IsNullOrEmpty(tbStkPris1.Text)) ? "0" : tbStkPris1.Text)); decimal dtbRabat = decimal.Parse(((string.IsNullOrEmpty(tbRabat1.Text)) ? "0" : tbRabat1.Text));
//Tjekker tbRabat i hvilken form rabatten er skrevet. 0,5 || 10|| 13,4 //Og rykker derefter om på karakterene så de står rigtigt. if (tbRabat1.Text.StartsWith("0,")) { stbRabat = tbRabat1.Text.Replace(",", ",00"); //Format: Eks. 0,5 } else if (tbRabat1.Text.Contains(",") && !tbRabat1.Text.StartsWith("0,")) { string stbRabat1 = tbRabat1.Text.Replace(",", ""); stbRabat = stbRabat1.Replace(stbRabat1, "0," + stbRabat1); //Format: Eks. 14,7 } else { stbRabat = "0," + tbRabat1.Text;//Format: Eks. 10 }
Der står tbBeskr1 og tbAntal1 og tbStkPris1 og tbRabat1. Dette bør rettes til tbBeskr og tbAntal og tbStkPris og tbRabat. I din VareLinjeKOntrol slaæ der jo kun være et sæt af knapper og derfor er det ikke nødvendigt at nummerere dem.
Din udregn1() bør på samme måde bare hedde udregn().
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms;
namespace WindowsApplication1 { public partial class VareLinjeControl : UserControl { public VareLinjeControl() { InitializeComponent(); }
private string udregn() { string stbRabat = "";
// Tjekker om tbBeskr.Text er null eller 0, og om tbStkPris.Text eller tbAntal.Text er null eller 0. // hvis ja, skriver den en notify da boxen ikke må være tom. if (string.IsNullOrEmpty(tbBeskr.Text) && !string.IsNullOrEmpty(tbAntal.Text) || !string.IsNullOrEmpty(tbStkPris.Text)) { NotifyWindow nw = new NotifyWindow("OBS!", "Der er ikke skrevet nogen varebeskrivelse i linje 1."); nw.Notify(); tbBeskr.Focus();// Placere markøren i textboxen. } else { } // //Tjekker om tbAntal1.Text || tbStkPris1.Text || tbRabat1.Text er null eller 0, hvis ja, skrives der 0 i feltet. // decimal dtbAntal = decimal.Parse(((string.IsNullOrEmpty(tbAntal.Text)) ? "0" : tbAntal.Text)); decimal dtbPrisStk = decimal.Parse(((string.IsNullOrEmpty(tbStkPris.Text)) ? "0" : tbStkPris.Text)); decimal dtbRabat = decimal.Parse(((string.IsNullOrEmpty(tbRabat.Text)) ? "0" : tbRabat.Text));
//Tjekker tbRabat i hvilken form rabatten er skrevet. 0,5 || 10|| 13,4 //Og rykker derefter om på karakterene så de står rigtigt. if (tbRabat.Text.StartsWith("0,")) { stbRabat = tbRabat.Text.Replace(",", ",00"); //Format: Eks. 0,5 } else if (tbRabat.Text.Contains(",") && !tbRabat.Text.StartsWith("0,")) { string stbRabat1 = tbRabat.Text.Replace(",", ""); stbRabat = stbRabat1.Replace(stbRabat1, "0," + stbRabat1); //Format: Eks. 14,7 } else { stbRabat = "0," + tbRabat.Text;//Format: Eks. 10 }
Jeg kan se at der er lidt som har overlevet i kommentarerne, men pyt med det. ;^)
Inden at vi går vidre skal du lige have sikret dig at du har placeret knapperne rigtig på "formen" og at du har trukket i højde og bredde på controllen sådan at den ikke selv fylder for meget.
Pinligt, jeg havde lige glemt hvordan man gør. Så skulle først i bøgerne...
Gå ind på dit oprindelige projekt. Du har formentlig Toolbox'en åben i venstre side. Du tilføjer nu din nye kontrol sådan her:
Højreklik på din Toolbox Vælg menupunktet Choose items... Vælg tab'en .NET Framework Components Tryk på knappen Browse... Find frem til din DLL for VareLinjeControl, og dobbeltklik
Den skulle gerne dukke op under General, og du trækker den ind på din form lige som du plejer.
Kan jeg ikke kalde fra en knap i formen´, en metode i VareLinjeControl?
Jeg har prøvet:
VareLinjeControl vl = new VareLinjeControl(); vl.udregnPris();
Men så sker der bare ikke noget.
Og udregnPris i VareLinjeControl ser således ud:
public void udregnPris() { tbPris.Text = udregn(); }
Og Udregn i VareLinjeControl ser således ud:
private string udregn() { string stbRabat = "";
// Tjekker om tbBeskr.Text er null eller 0, og om tbStkPris.Text eller tbAntal.Text er null eller 0. // hvis ja, skriver den en notify da boxen ikke må være tom. if (string.IsNullOrEmpty(tbBeskr.Text) && !string.IsNullOrEmpty(tbAntal.Text) || !string.IsNullOrEmpty(tbStkPris.Text)) { NotifyWindow nw = new NotifyWindow("OBS!", "Der er ikke skrevet nogen varebeskrivelse i linje 1."); nw.Notify(); tbBeskr.Focus();// Placere markøren i textboxen. } else { } // //Tjekker om tbAntal.Text || tbStkPris.Text || tbRabat.Text er null eller 0, hvis ja, skrives der 0 i feltet. // decimal dtbAntal = decimal.Parse(((string.IsNullOrEmpty(tbAntal.Text)) ? "0" : tbAntal.Text)); decimal dtbPrisStk = decimal.Parse(((string.IsNullOrEmpty(tbStkPris.Text)) ? "0" : tbStkPris.Text)); decimal dtbRabat = decimal.Parse(((string.IsNullOrEmpty(tbRabat.Text)) ? "0" : tbRabat.Text));
//Tjekker tbRabat i hvilken form rabatten er skrevet. 0,5 || 10|| 13,4 //Og rykker derefter om på karakterene så de står rigtigt. if (tbRabat.Text.StartsWith("0,")) { stbRabat = tbRabat.Text.Replace(",", ",00"); //Format: Eks. 0,5 } else if (tbRabat.Text.Contains(",") && !tbRabat.Text.StartsWith("0,")) { string stbRabat1 = tbRabat.Text.Replace(",", ""); stbRabat = stbRabat1.Replace(stbRabat1, "0," + stbRabat1); //Format: Eks. 14,7 } else { stbRabat = "0," + tbRabat.Text;//Format: Eks. 10 }
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.