[C#]probleem met foreach loop(ArgumentOutOfRangeException)

Pagina: 1
Acties:

  • degroot
  • Registratie: December 2003
  • Niet online
Ik ben bezig met een zeer simpel stukje C#

In mijn mainForm_Load() , roep ik 2 functies aan.
Deze functies staan in de klasse loadPods.cs
Dat stukje code ziet er als volgt uit(een stukje code zegt meer dan 1000 worden bij mij)
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        private void mainForm_Load(object sender, EventArgs e)
        {
            int countName = 0;
            getName = podList.loadName();
            
            
            foreach (string xmlName in getName)
            {
                dataGridView1.Rows.Add();
                dataGridView1.Rows[countName].Cells[0].Value = xmlName;
                countName++;
            }


            int countDesc = 0;
            getDesc = podList.loadDesc();

            foreach (string xmlDesc in getDesc)
            {
                dataGridView1.Rows[countDesc].Cells[1].Value = xmlDesc;
                countDesc++;
            }
        }


Deze 2 functies halent uit een XML file , de <NAME> en <DESCRIPTION>
Het is natuurlijk duidelijk dat in de XML file er evenveel <NAME> als <DESCRIPTION> elementen zijn.

Ga ik deze code debuggen , dan krijg ik een (ArgumentOutOfRangeException)
code:
1
The index was outside the interval. It must be a nonnegative and inferior value to the size of the collection. Name of the parameter: index


Terwijl de waarde van countName & countDesc , allebei op 20 staan(wat weer refereert naar het aantal gelijkwaardige elementen , de <NAME> en <DESCRIPTION>).

Dit is toch gewoon normale code?
Of word er iets over het hoofd gezien?
Ik snap even niet meer wat Visual Studio nu bedoelt , omdat beide waardes gelijk zijn.
En omdat functie getDesc gewoon exact hetzelfde doet als functie getName , alleen dan op een ander element in de XML file....

Hopelijk kunnen jullie mij iets opweg helpen


EDIT:
Ik vergeet het rare van heel het verhaal te vertelllen.

Namelijk , als ik nog in de debug mode zit , en ik verander dit stukje code
C#:
1
dataGridView1.Rows[countDesc].Cells[1].Value = xmlDesc;

In bijvoorbeeld
C#:
1
dataGridView1.Rows[8].Cells[1].Value = xmlDesc;

Of iets met zon waarde , ipv de variable , en ik duk op F5 om verder te debuggen , dan laat hij wel alles op correcte wijzen in de DataGridView zien

[ Voor 11% gewijzigd door degroot op 05-03-2007 16:15 . Reden: raar verhaal toegevoegd ]

www.degroot-it.nl


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
OutOfRangeException == je treedt buiten de grenzen van een array of collection.
Op de een of andere manier zul je dus op een gegeven moment een rij in je datagridview willen aanspreken die niet bestaat. (Bv rij 21 als je maar 20 rijen hebt).

https://fgheysels.github.io/


  • rewind.
  • Registratie: Oktober 2001
  • Laatst online: 20-11 00:36
begint je dataGridView1.Rows[countDesc].etc wel bij 0? Dat definieer je nml. bij :
int countDesc = 0;

  • degroot
  • Registratie: December 2003
  • Niet online
whoami schreef op maandag 05 maart 2007 @ 16:20:
OutOfRangeException == je treedt buiten de grenzen van een array of collection.
Op de een of andere manier zul je dus op een gegeven moment een rij in je datagridview willen aanspreken die niet bestaat. (Bv rij 21 als je maar 20 rijen hebt).
Daar lijkt het inderdaad wel op.

Maar helaas heeft de waarde countDesc geen 21 , maar 20 tijdens het debuggen.
Ik heb een printscreen toegevoegd , zodat je kunt die dat de waarde inderdaad 20 is , en geen 21.
(Let niet op de taal van de error , mijn Vista is spaans , omdat ik nu in spanje zit)

Afbeeldingslocatie: http://img513.imageshack.us/img513/3811/dibujofc9.th.jpg

Daarom snap ik even niet wat VS bedoelt met die error , omdat de countDesc waarde toch 20 is. :|
Stoney187 schreef op maandag 05 maart 2007 @ 16:24:
begint je dataGridView1.Rows[countDesc].etc wel bij 0? Dat definieer je nml. bij :
int countDesc = 0;
Ja , dit is de enigste variable met die naam in mijn code.
En word ook nergens anders geincrement.
Zoals ie daar staat , begint hij dus ook bij 0

[ Voor 41% gewijzigd door degroot op 05-03-2007 16:30 ]

www.degroot-it.nl


Verwijderd

Als het bij 0 begint en er zijn 20 records, moet hij bij 19 ophouden...

Countname is aan het einde 20, wat betekent dat de laatst toegevoegde index 19 is :) Bekijk je code maar eens goed. Hierdoor gaat het mis, getDesc zal wel teveel regels bevatten.

[ Voor 56% gewijzigd door Verwijderd op 05-03-2007 16:33 ]


  • degroot
  • Registratie: December 2003
  • Niet online
Verwijderd schreef op maandag 05 maart 2007 @ 16:31:
Als het bij 0 begint en er zijn 20 records, moet hij bij 19 ophouden...

Countname is aan het einde 20, wat betekent dat de laatst toegevoegde index 19 is :) Bekijk je code maar eens goed. Hierdoor gaat het mis, getDesc zal wel teveel regels bevatten.
Klopt als een bus.

Want
C#:
1
 foreach (string xmlDesc in getDesc)

Geeft namelijke elke entry in de XML file dubbel terug
dus de waarde is 40 , ipv 20.

Ik ga nu dus even uitzoeken waarin dat probleem zit.
Iig al bedankt voor jullie steun

www.degroot-it.nl


Verwijderd

Als je die dubbele waarden kwijt bent, kijk dan ook 's naar de routine zelf.
Is een gewone for-lus in dit geval niet veel handiger en overzichtelijker dan een foreach?
C#:
1
2
3
4
5
6
7
8
9
10
11
12
private void mainForm_Load(object sender, EventArgs e) 
{ 
    getName = podList.loadName(); 
    getDesc = podList.loadDesc(); 

    for (i = 0; i < getName.Length; i++)
    { 
        dataGridView1.Rows.Add(); 
        dataGridView1.Rows[i].Cells[0].Value = getName[i]; 
        dataGridView1.Rows[i].Cells[1].Value = getDesc[i]; 
    } 
}
Pagina: 1