Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  9 1354
Hei,

Jeg har en Windows Form med 10 tekstbokser og 10 knapper. Ved trykk på knappen så økes tallet i tekstboksen med +1.

Kode

private void button2_Click(object sender, EventArgs e)
        {
            string strInput = textBox1.Text;
            int incrValue = Convert.ToInt32(strInput);
            incrValue += 1;
            textBox1.Text = incrValue.ToString();
}
Frem til nå har jeg denne koden under hver av knappene (copy paste og endre textboxnavnet).

For læringens skyld vil jeg gjerne finne ut av hvordan jeg kan gjøre om dette til en funksjon som jeg kaller fra hver knapp, altså en forenkling.

Noe sånt som:

Kode

private void button2_Click(object sender, EventArgs e)
        {
            increaseValue(texBox1.Text);
}
Kan noen være så snille og peke meg i riktig retning?
Sist endret av bronsky; 21. mars 2011 kl. 16:13.
Rablet ned en kjapp kodesnutt her:

Kode

        private void IncreaseValue(TextBox t)
        {
            int Value = int.Parse(t.Text);
            Value++;
            t.Text = Value.ToString();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            IncreaseValue(textBox1);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            IncreaseValue(textBox2);
        }

        private void button3_Click(object sender, EventArgs e)
        {
            IncreaseValue(textBox3);
        }
Nydelig! Akkurat det jeg lette etter. Tusen takk.
m0b
m0b's Avatar
DonorAdministrator
Nå har du riktignok fått svar på dette, men jeg har et aldri så lite forslag.

Hvis du ser på f.eks Form1.Designer.cs tilknyttet en form. Så ser du hvordan editoren genererer opp GUI. Hvis du har assignet en event til en knapp, så vil du se det der inne.

Du har altså assosiert en metode buttonX_Click med dine kontroller og deretter henviser du de til metoden som skal utføre arbeidet. Her har du et forslag til en annen løsning. Jeg itererer ControlCollection til Form1, sjekker hvorvidt controllen er en knapp, og hvis den er det så hooker jeg opp Click-eventen med en anonym metode.

Dette gjør at du kan dra inn så mange knapper du vil, uten at du trenger noe mer kode av den grunn. Den kobler opp alle knapper mot metoden. Det er i alle fall et forslag på en alternativ løsning.



En annen måte jeg kommer på er å lage en Extension klasse til ControlCollection, som gjør at du kan kjøre en Linq-spørring mot this.Controls for å hente ut de controlene som er knapper. Kan sikkert skrive et eksempel på det hvis det er interessant, men jeg får ikke tid til det akkurat nå.
Sist endret av m0b; 25. mars 2011 kl. 18:23.
Sitat av |d13m0b Vis innlegg


Vis hele sitatet...
Hvordan har du fått hele visual studio til å bli mørk? Jeg får kun til å endre tema'et på selve kodevinduet.
m0b
m0b's Avatar
DonorAdministrator
Det gjorde jeg med en extension til Visual Studio kalt "Visual Studio Color Theme Editor". Valgte å bruke bilder nå istedet for formatteringen på forumet, da den ikke helt har roen på C#.

Her er forøvrig en revidert versjon med en extension av System.Windows.Forms.Control.ControlCollection, det fjerner castinga jeg gjorde tidligere.

Sist endret av m0b; 26. mars 2011 kl. 20:36.
Winformen har dessverre en ekstra knapp som submitter det de resterende har bidratt til (inkrementering av tall) å lage. Enkelt forklart så logger den tall under forskjellige kategorier og skriver en record til db-en ved trykk på submit-knappen.

Men dette var noe jeg ikke har vært borti før, så jeg skal teste det ut for læringens skyld.
m0b
m0b's Avatar
DonorAdministrator
Hvis jeg forstår det rett, så er hver knapp tilknyttet en egen kategori? Kunne jeg få sett et skjermbilde av hvordan formen ser ut? Du har sikkert en helt fint fungerende løsning, men jeg skulle gjerne sett hvordan det ser ut.
Sitat av |d13m0b Vis innlegg
Hvis jeg forstår det rett, så er hver knapp tilknyttet en egen kategori? Kunne jeg få sett et skjermbilde av hvordan formen ser ut? Du har sikkert en helt fint fungerende løsning, men jeg skulle gjerne sett hvordan det ser ut.
Vis hele sitatet...
Skjermbildet måtte anonymiseres litt av diverse hensyn, så jeg har tullet litt med farger osv. Det viser uansett oppsettet.

I utgangspunktet er det en detail-view av et datasett, hvor hver tekstboks representerer f.eks. en farge. Når formen loades, opprettes en ny record og alle feltene får verdien 0.
Sett at noen hadde jobben med å telle biler med forskjellige farger som kjørte forbi, så vil plussknappen være den manuelle tellemekanismen. Ved å submitte skrives så resultatene pluss dato til databasen (MySQL), og alle feltene nullstilles. Det har jeg løst ved at den oppretter en ny record etter at den er ferdig med å skrive den forrige.



I den andre enden kan man da gjøre en del morsomme ting med tallene som bygger seg opp etter hvert.

Edit:
Tips til forbedringer, som jeg er sikker på er mange, tas imot med stor ydmykhet.
Sist endret av bronsky; 29. mars 2011 kl. 21:09.
m0b
m0b's Avatar
DonorAdministrator
Okei

Dette trenger ikke være en løsning som passer deg, eller som i det hele tatt er fornuftig å bruke i noen som helst tilfeller. Men jeg tenkte å vise et lite eksempel på hvordan du enkelt kan lage deg noen artige custom controller, hvis det er noe du ikke er klar over du kan gjøre. Forms er trolig det aspektet med denne utviklingen jeg er minst kjent med, så det kan godt være at jeg gjør noe helt idiotisk. Det er en "metode" jeg kom på da jeg så problemstillingen din.

I såfall har kanskje tormaroe noen 0x3A28213A, 0x6339392C, 0x7363682E?

Tanken her er at jeg lager to typer custom controller.

NinjaButton
Denne har muligheten til å hente ut en referanse til et "target". Target er i dette tilfellet en kontroll som denne kontrollen skal gjøre noe med (avfyre metode på) og sende inn verdi som paramenter



NinjaTextBox
Denne kontrollen har en metode og to properties som beskriver hva den skal brukes til.


Dette er all kode i Form2.cs


Slik er resultatet


Tanken bak dette er at du nå har muligheten til å dra og slippe ut så mange (ninja) knapper og tekstbokser som du bare makter. Så lenge du forteller kontrollene hvor de skal linkes, og hva de skal sende inn, og hva som telles, så slipper du å skrive noe mer kode.



Som alltid med slik kode, det er PoC og bør således bugfjernes

Edit: Jeg har ikke tatt med nullstilling av tekstboksene, men det er vel ikke essensielt her
Sist endret av m0b; 30. mars 2011 kl. 08:15.