[C#] Meerdere textboxen creëren

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Heej,

Ik ben bezig met een applicatie, maar ik kom er niet uit hoe ik meerdere textboxen kan creëren.
Ik heb het volgende:
code:
1
2
3
4
// aantal textboxen dat moet worden gecreëerd.
private static int iStopwatchStopCount = 3;

TextBox[] a_textboxes = new TextBox[iStopwatchStopCount];

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
private void CreateTextBoxes()
        {
            // alle textboxen op het form verwijderen op 1 na.
            for (int iI = this.Controls.Count - 1; iI >= 0; iI--)
            {
                if (this.Controls[iI] is TextBox && Controls[iI].Name != "tbRunningTime")
                {
                        this.Controls.RemoveAt(iI);
                }
            }

            // tekstboxen aanmaken en weegeven op het form. <--- dit werkt niet!
            int iCount = 0;
            int iCoordinaatX = 12;
            int iCoordinaatY = 84;
            foreach (TextBox textbox in a_textboxes)
            {
                TextBox tekstbox = new TextBox();
                textbox.Location = new Point(iCoordinaatX, iCoordinaatY);
                textbox.Name = "tbSaveTime" + iCount.ToString();
                textbox.Size = new Size(100, 20);
                textbox.TabIndex = iCount;
                textbox.Visible = true;
                Controls.Add(tekstbox);
                iCount++;
                iCoordinaatY += 40;
            }

Wat de bedoeling is, is dat als de functie CreateTextBoxes word opgeroepen er tekstboxen op het form worden aangemaakt. Het aantal textboxen dat moet worden aangemaakt staat in de integer iStopwatchStopCount.

Groetjes,

Bob

Acties:
  • 0 Henk 'm!

  • remco_k
  • Registratie: April 2002
  • Laatst online: 19:56

remco_k

een cassettebandje was genoeg

Ik ken C# niet zo goed, maar moet je niet de Parent en/of Owner zetten op "this"?

Verder doe je rare dingen. Je declareerd een array, a_textboxes en daar meteen new TextBox[iStopwatchStopCount]; ??

Later loop je met een loopje door die array heen, en maak je alsnog dat aantal textboxen aan.

Je doet:
C++:
1
2
3
4
TextBox tekstbox = new TextBox(); // Let op: "tekstbox" met ks --- en je had de textboxen toch al gemaakt?
textbox.Location = ... // Let op: "textbox" met een x ? 
// ...
Controls.Add(tekstbox); // en weer met ks...

Naamgeving is niet goed.
"tekstbox" heb je enkel aangemaakt met "new TekstBox();" en geen enkele property gezet.

Er is meer te verbeteren, maar eerst maar even aan de praat krijgen.

[ Voor 32% gewijzigd door remco_k op 15-07-2009 14:29 . Reden: Code tags en comment toegevoegd ]

Alles kan stuk.


Acties:
  • 0 Henk 'm!

  • boe2
  • Registratie: November 2002
  • Niet online

boe2

'-')/

Je werpt een hoop ongeinitialiseerde tekstboxen in een array maar doet er vervolgens niets mee. Wat je in de foreach lus probeert te doen is me ook niet volledig duidelijk. Volgens mij wil je dit (schoolvoorbeeld) doen:

C#:
1
2
3
4
5
6
for(Int32 i = 0; i < a_textboxes.Length; i++)
{
    a_textboxes[i] = new TextBox();
    a_textboxes[i].Location = new Point(iCoordinaatX, iCoordinaatY);
    //enzovoort
}


remco_k: "this" slaat hoogstwaarschijnlijk op de form class waarin hij werkt.

[ Voor 19% gewijzigd door boe2 op 15-07-2009 14:34 ]

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind.' - Pratchett.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb het al opgelost, ik heb het gedaan zoals Boeboe zij.

Groetjes en bedankt,

Bob

Acties:
  • 0 Henk 'm!

  • Phyxion
  • Registratie: April 2004
  • Niet online

Phyxion

_/-\o_

Boeboe schreef op woensdag 15 juli 2009 @ 14:27:
Je werpt een hoop ongeinitialiseerde tekstboxen in een array maar doet er vervolgens niets mee. Wat je in de foreach lus probeert te doen is me ook niet volledig duidelijk. Volgens mij wil je dit (schoolvoorbeeld) doen:

C#:
1
2
3
4
5
6
for(Int32 i = 0; i < a_textboxes.Length; i++)
{
    a_textboxes[i] = new TextBox();
    a_textboxes[i].Location = new Point(iCoordinaatX, iCoordinaatY);
    //enzovoort
}


remco_k: "this" slaat hoogstwaarschijnlijk op de form class waarin hij werkt.
foreach was ook prima mogelijk geweest omdat ze toch allemaal al bestaan.

'You like a gay cowboy and you look like a gay terrorist.' - James May


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Phyxion schreef op donderdag 16 juli 2009 @ 08:38:
[...]

foreach was ook prima mogelijk geweest omdat ze toch allemaal al bestaan.
Nee, ze bestaan nog niet, er bestaat alleen een lege array. Er is nog geen enkele Textbox gecreerd.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Phyxion
  • Registratie: April 2004
  • Niet online

Phyxion

_/-\o_

Woy schreef op donderdag 16 juli 2009 @ 09:30:
[...]

Nee, ze bestaan nog niet, er bestaat alleen een lege array. Er is nog geen enkele Textbox gecreerd.
Jawel ->
C#:
1
2
3
4
5
6
7
8
9
        private const int iStopwatchStopCount = 3;
        TextBox[] a_textboxes = new TextBox[iStopwatchStopCount];

        public Form1()
        {
            InitializeComponent();
            foreach (TextBox textBox in a_textboxes)
                Console.WriteLine("Wij hebben een textbox voor Woy");
        }


Output:
code:
1
2
3
Wij hebben een textbox voor Woy
Wij hebben een textbox voor Woy
Wij hebben een textbox voor Woy


Works like a charm :Y)

'You like a gay cowboy and you look like a gay terrorist.' - James May


Acties:
  • 0 Henk 'm!

  • BM
  • Registratie: September 2001
  • Laatst online: 18:56

BM

Moderator Spielerij
Ja, en al die TextBox objecten waar je doorheen loopt zijn null ;)

Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Idd BM
C#:
1
2
3
4
5
6
7
8
9
        private const int iStopwatchStopCount = 3;
        TextBox[] a_textboxes = new TextBox[iStopwatchStopCount];

        public Form1()
        {
            InitializeComponent();
            foreach (TextBox textBox in a_textboxes)
                textBox.Text = "Mooie NullReferenceException Hier!!!";
        }

Zal een mooie NullReferenceException gooien.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 18:57
Phyxion schreef op donderdag 16 juli 2009 @ 12:04:
[...]

Jawel ->
C#:
1
2
3
4
5
6
7
8
9
        private const int iStopwatchStopCount = 3;
        TextBox[] a_textboxes = new TextBox[iStopwatchStopCount];

        public Form1()
        {
            InitializeComponent();
            foreach (TextBox textBox in a_textboxes)
                Console.WriteLine("Wij hebben een textbox voor Woy");
        }


Output:
code:
1
2
3
Wij hebben een textbox voor Woy
Wij hebben een textbox voor Woy
Wij hebben een textbox voor Woy


Works like a charm :Y)
Tuurlijk werkt dat gelijk een 'charm'.
Je itereert gewoon over ieder item in de array, en je gaat gewoon bij iedere iteratie iets gaan outputten.
Echter, ieder item in die array is 'NULL', want nog niet geinitialiseerd....

Zoals Woy al zegt: je gaat een NullRef exception krijgen als je iets met een textbox zou willen doen.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Phyxion
  • Registratie: April 2004
  • Niet online

Phyxion

_/-\o_

Ach ja, foreach is readonly / immutable.
My bad :)

'You like a gay cowboy and you look like a gay terrorist.' - James May


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Phyxion schreef op donderdag 16 juli 2009 @ 13:37:
Ach ja, foreach is readonly / immutable.
My bad :)
foreach heeft niks met readonly /immutable te maken. Het itereert gewoon over een IEnumerable, en cast eventueel naar het gewenste type.

Het gaat erom dat bij het creeeren van een array de items erin niet gecreerd worden. Alle items in een array worden standaard op default() geinitialiseerd, en bij een referencetype is dat gewoon NULL.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Phyxion
  • Registratie: April 2004
  • Niet online

Phyxion

_/-\o_

Woy schreef op donderdag 16 juli 2009 @ 13:51:
[...]

foreach heeft niks met readonly /immutable te maken. Het itereert gewoon over een IEnumerable, en cast eventueel naar het gewenste type.

Het gaat erom dat bij het creeeren van een array de items erin niet gecreerd worden. Alle items in een array worden standaard op default() geinitialiseerd, en bij een referencetype is dat gewoon NULL.
Ik doelde op het feit dat het niet mogelijk is om te assignen in foreach omdat ze readonly zijn,
C#:
1
2
foreach (TextBox textBox in textBoxes)
   textBox = new TextBox();

Is niet mogelijk omdat textBox readonly is en dus immutable.

'You like a gay cowboy and you look like a gay terrorist.' - James May


Acties:
  • 0 Henk 'm!

  • Canaria
  • Registratie: Oktober 2001
  • Niet online

Canaria

4313-3581-4704

Waarom gebruik je eigenlijk een array? Je kunt toch ook in de for-loop doen wat je wilt en iStopwatchStopCount als max waarde voor de iteratie gebruiken? Ik zou overigens een Collection<T> gebruiken ipv een array.

Apparticle SharePoint | Apps | Articles


Acties:
  • 0 Henk 'm!

  • Hobbles
  • Registratie: Augustus 2004
  • Laatst online: 10-09 08:00
Phyxion schreef op donderdag 16 juli 2009 @ 13:54:
[...]

Ik doelde op het feit dat het niet mogelijk is om te assignen in foreach omdat ze readonly zijn,
C#:
1
2
foreach (TextBox textBox in textBoxes)
   textBox = new TextBox();

Is niet mogelijk omdat textBox readonly is en dus immutable.
textBoxes is immutable dacht ik? De elementen die je uit een collectie haalt via een enumerator zijn normaliter niet readonly...

Everything is possible if you really want it.


Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

En Woy zegt terecht dat dat niet boeit, omdat je hoe dan ook over nulls itereert. Je claimde dat een array instantieren ook z'n content instantieert en dat is gewoon onzin.

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Phyxion schreef op donderdag 16 juli 2009 @ 13:54:
[...]

Ik doelde op het feit dat het niet mogelijk is om te assignen in foreach omdat ze readonly zijn,
C#:
1
2
foreach (TextBox textBox in textBoxes)
   textBox = new TextBox();

Is niet mogelijk omdat textBox readonly is en dus immutable.
textBox is inderdaad een readonly local variabele ( niet immutable ), maar als dat het niet was geweest dan had je er nog niks aan gehad, want hij verwijst naar het element, niet naar de locatie in de collectie waar het element staat
[/miereneuken]
Hobbles schreef op donderdag 16 juli 2009 @ 14:02:
[...]


textBoxes is immutable dacht ik? De elementen die je uit een collectie haalt via een enumerator zijn normaliter niet readonly...
textBoxes is ook niet immutable, maar als je toch wijzigingen aan de collectie gaat toepassen gaat het wel mis idd ;) het element zelf is inderdaad niet immutable, maar de variabele zelf is wel readonly.

[ Voor 26% gewijzigd door Woy op 16-07-2009 14:07 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

Hobbles schreef op donderdag 16 juli 2009 @ 14:02:
[...]

textBoxes is immutable dacht ik? De elementen die je uit een collectie haalt via een enumerator zijn normaliter niet readonly...
De elementen niet nee, maar de Current property van IEnumerator wel (terecht). Omdat foreach een native shorthand language construct om IEnumerable is gooit C# een speciale foutmelding als je aan de foreach iteration variable probeert te assignen.

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
curry684 schreef op donderdag 16 juli 2009 @ 14:07:
[...]
Omdat foreach een native shorthand language construct om IEnumerable is gooit C# een speciale foutmelding als je aan de foreach iteration variable probeert te assignen.
Ja namenlijk een compiler foutmelding :P

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Phyxion
  • Registratie: April 2004
  • Niet online

Phyxion

_/-\o_

Woy schreef op donderdag 16 juli 2009 @ 14:05:
[...]

textBox is inderdaad een readonly local variabele ( niet immutable ), maar als dat het niet was geweest dan had je er nog niks aan gehad, want hij verwijst naar het element, niet naar de locatie in de collectie waar het element staat
[/miereneuken]

[...]

textBoxes is ook niet immutable, maar als je toch wijzigingen aan de collectie gaat toepassen gaat het wel mis idd ;) het element zelf is inderdaad niet immutable, maar de variabele zelf is wel readonly.
De collection is immutable, ik mag wel een cursus uitleggen nemen :+

'You like a gay cowboy and you look like a gay terrorist.' - James May


Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

Woy schreef op donderdag 16 juli 2009 @ 14:09:
[...]

Ja namenlijk een compiler foutmelding :P
Maar een andere, en daarmee speciaal, dan als je gewoon aan IEnumerable.Current assignt :)
code:
1
2
error CS0200: Property or indexer 'System.Collections.Generic.IEnumerator<System.Windows.Forms.TextBox>.Current' cannot be assigned to -- it is read only
error CS1656: Cannot assign to 'tbx' because it is a 'foreach iteration variable'

[ Voor 6% gewijzigd door curry684 op 16-07-2009 14:12 ]

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Phyxion schreef op donderdag 16 juli 2009 @ 14:11:
[...]
De collection is immutable, ik mag wel een cursus uitleggen nemen :+
Ook dat klopt niet. De collection is niet immutable. De volgende code compileert en runt ook gewoon
C#:
1
2
3
4
5
6
7
8
9
List<string> myList = new List<string>();

myList.Add("test");

foreach (String s in myList)
{
    myList.Add(s);
    break;
}

Als je de break weghaalt zal je echter een InvalidOperationException krijgen, want de Iterator is invalid geworden door het wijzigen van de collection.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Hobbles
  • Registratie: Augustus 2004
  • Laatst online: 10-09 08:00
Wat Woy zegt dus (is wat ik voorheen bedoelde maar mijn uitleg was duidelijk iets te beknopt)

Everything is possible if you really want it.


Acties:
  • 0 Henk 'm!

  • Phyxion
  • Registratie: April 2004
  • Niet online

Phyxion

_/-\o_

Woy schreef op donderdag 16 juli 2009 @ 14:19:
[...]

Ook dat klopt niet. De collection is niet immutable. De volgende code compileert en runt ook gewoon
C#:
1
2
3
4
5
6
7
8
9
List<string> myList = new List<string>();

myList.Add("test");

foreach (String s in myList)
{
    myList.Add(s);
    break;
}

Als je de break weghaalt zal je echter een InvalidOperationException krijgen, want de Iterator is invalid geworden door het wijzigen van de collection.
textBoxes is volgens mij immutable want dat is geen Collection maar een array.

'You like a gay cowboy and you look like a gay terrorist.' - James May


Acties:
  • 0 Henk 'm!

  • Canaria
  • Registratie: Oktober 2001
  • Niet online

Canaria

4313-3581-4704

C#:
1
2
3
4
5
6
7
8
9
10
11
List<TextBox> textBoxes = new List<TextBox>();

for (int i=0; i<stopwatchStopCount; i++)
{
     // create textBox
     TextBox textBox = new TextBox();

     // do stuff with textBox

     textBoxes.Add(textBox);
}

[ Voor 45% gewijzigd door Canaria op 16-07-2009 14:48 ]

Apparticle SharePoint | Apps | Articles


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
We gaan wel redelijk off-topic maar toch:

Immutable betekend ( van Wiki geplukt )
In object-oriented and functional programming, an immutable object is an object whose state cannot be modified after it is created.
De state van een array kun je wel degelijk veranderen, want je kunt er wel andere elementen in stoppen. Dus een array is niet immutable.

Je hebt wel gelijk dat je de lengte van een Array niet kunt veranderen ( Array.Resize zal gewoon een nieuwe array maken )

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 18:57
Phyxion schreef op donderdag 16 juli 2009 @ 14:24:
[...]

textBoxes is volgens mij immutable want dat is geen Collection maar een array.
Een Array is nochtans een collection. :P
Woy schreef op donderdag 16 juli 2009 @ 14:43:
We gaan wel redelijk off-topic maar toch:

Immutable betekend ( van Wiki geplukt )

[...]

De state van een array kun je wel degelijk veranderen, want je kunt er wel andere elementen in stoppen. Dus een array is niet immutable.
Idd.

De enige reden waarom je met een foreach je array niet kunt wijzigen, is omdat je Iterator dan ongeldig wordt, omdat de achterliggende collectie gewijzigd is.
Echter, dit heeft niets met immutability te maken, zoals eerder al gezegd werd.
Foreach gaat nl. de GetEnumerator method van de IEnumerable waarover 'ge-foreached' wordt gaan aanroepen, en gebruikt dan de IEnumerator die gereturned wordt gaan gebruiken om over ieder element van die collectie te gaan itereren.
Logisch dan dat die IEnumerator niet meer geldig is, als je de collectie nadien aangepast hebt.

[ Voor 65% gewijzigd door whoami op 16-07-2009 16:14 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

whoami schreef op donderdag 16 juli 2009 @ 16:06:
[...]

Logisch dan dat die IEnumerator niet meer geldig is, als je de collectie nadien aangepast hebt.
Hangt van de onderliggende collection-implementatie af natuurlijk, met een linked list is er geen enkel bezwaar om gewoon door te enumereren ;)

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 06:48

Sebazzz

3dp

curry684 schreef op donderdag 16 juli 2009 @ 14:11:
[...]

Maar een andere, en daarmee speciaal, dan als je gewoon aan IEnumerable.Current assignt :)
code:
1
2
error CS0200: Property or indexer 'System.Collections.Generic.IEnumerator<System.Windows.Forms.TextBox>.Current' cannot be assigned to -- it is read only
error CS1656: Cannot assign to 'tbx' because it is a 'foreach iteration variable'
Waarschijnlijk omdat de compiler intern de eerste fout opvangt, en omdat de situatie een foreach is, deze fout omvormt naar de tweede fout.(want het staat dan in context).

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]

Pagina: 1