2016-04-16 9 views
0

Ich habe eine Reihe von Textfeldern, in denen sie sich dynamisch ändern, je nachdem, was der Benutzer eingibt. Diese Textfelder enthalten eine Zahl, die eine Punktzahl einer Aufgabe darstellt. Diese Punkte sind mit einem Modulobjekt verknüpft. Also wenn der Benutzer 3 Module hat; 2 Zuordnungen auf dem ersten und zweiten Modul und 3 Zuweisungen auf dem dritten Modul; dann würden insgesamt 7 Textfelder erstellt, damit der Benutzer alle seine Zuweisungszeichen eingeben kann.Out-of-Bounds Ausnahme bei der Verwendung von Arrays

Was ich versuche, ist, einen Keyup-Event-Handler zu erstellen, in dem es die vom Benutzer eingegebene Nummer abruft und dann dynamisch eine Methode aufruft, um den Durchschnitt des Moduls anzuzeigen. Das habe ich bisher. Die folgende Methode wird aufgerufen, wenn der Benutzer in einem Zeichen:

public void calculateLevel4Modules(int counter) { 
     //iterate through modules 
     //iterate through assignts in that module 
     //whilst iterating, check tb and set userscore 
     //after iterating, update overall label with regards to modulecounter 
     //int assignmentCounter = 0; 
     //Console.WriteLine("in If statement.. " + counter); 

     for (int moduleCounter = 0; moduleCounter < requiredLevelList().Count; moduleCounter++) 
     { 
      int totalNumberOfAssignmentsInCurrentModule = requiredLevelList().ElementAt(moduleCounter).Assignments.Count; 
      Console.WriteLine("total number of assignmetns: " + totalNumberOfAssignmentsInCurrentModule); 
      assignmentCounter = assignmentCounter + totalNumberOfAssignmentsInCurrentModule; 
      Console.WriteLine("assignment counter: " + totalNumberOfAssignmentsInCurrentModule); 
      if (counter < assignmentCounter) 
      { 
       Console.WriteLine("in If statement.. " + userMarksTBLvl4[moduleCounter].Text); 
       try 
       { 
        int userMark = int.Parse(userMarksTBLvl4[counter].Text); 
        requiredLevelList().ElementAt(moduleCounter).Assignments.ElementAt(counter).UsersScore = userMark; 
        double modAvg = requiredLevelList().ElementAt(moduleCounter).getModuleScoreOverall(); 
        moduleOverallLvl4[moduleCounter].Text = modAvg.ToString(); 
        break; 
       } 
       catch (FormatException) { break; } 

      } 
      else { } 
     } 

es funktioniert gut, wenn der Benutzer ein Modul enthält, aber wenn der Benutzer zwei oder mehr hat, dann bekomme ich einen Fehler in der folgenden Zeile: requiredLevelList().ElementAt(moduleCounter).Assignments.ElementAt(counter).UsersScore = userMark;

Ich bekomme eine Ausnahme außerhalb der Grenzen. Ich weiß warum; Weil der Zähler im Grunde die Nummer des Textfelds ist, in das ich getippt habe, aber ich benutze den Zähler, greife ich auf etwas zu, das nicht in der Zuweisungsliste enthalten ist. Dies ist ein Beispiel, wenn das Problem auftritt:

Der Benutzer verfügt über 2 Module. In jedem Modul gibt es 2 Zuordnungen, also 4 Textfelder wurden mit ihrem Index von 0 bis 3 erstellt. Wenn der Benutzer seine Punkte der ersten Zuweisung auf dem zweiten Modul eingeben möchte, versucht er im Grunde, in den dritten Index zu schreiben Dieses Element stürzt dann ab, da dieses Modul nur aus 2 Zuordnungen besteht.

Antwort

1

Es gibt einige seltsame Dinge in Ihrem Code, die es schwer zu beantworten machen. Erstens kompiliert der von Ihnen gepostete Code nicht, daher können wir ihn nicht testen.

mehrmals verwenden Sie Code wie:

requiredLevelList().ElementAt(moduleCounter) 

Ich gehe davon aus requiredLevelList eine Methode, die eine Liste der Dinge zurückgibt. Es gibt keinen Grund zu der Annahme, dass requiredLevelList die gleiche Liste oder sogar Listen mit der gleichen Anzahl von Elementen bei jedem Aufruf zurückgibt. Vielleicht ist es in Ihrem speziellen Fall, aber das ist eine gefährliche Sache, auf die man sich verlassen kann. Sie sollten ein Konstrukt verwenden wie:

foreach (var module in requiredLevelList()) 
{ 
    int totalNumberOfAssignmentsInCurrentModule = module.Assignments.Count; 
    ... 

    module.Assignments.ElementAt(counter).UsersScore = userMark; 
    ... 
} 

-Code wie folgt aus:

Console.WriteLine("total number of assignmetns: " + totalNumberOfAssignmentsInCurrentModule); 

versuchen symptomatisch ist, etwas zu debuggen, nachdem es abgestürzt ist. Das ist extrem ineffizient. Erfahren Sie, wie Sie einen Debugger verwenden. Sie werden erst dann ein effektiver Programmierer, wenn Sie wissen, wie Sie das machen.

requiredLevelList().ElementAt(moduleCounter).Assignments.ElementAt(counter).UsersScore = userMark; 

Du bist wahrscheinlich eine out-of-bounds Ausnahme immer hier, weil counter außerhalb der Indizes von Assignments ist. Da Sie nie counter initialisieren oder ändern, habe ich keine Möglichkeit zu wissen, was es ist oder sein sollte. Ein Debugger wird Ihnen dies mitteilen, einen verwenden.

die # der Textbox, die in aber von mir mit Zähler eingegeben wurde, ich habe Zugriff auf etwas nicht in der Aufgabenliste.

OK, wenn Sie etwas tippen "nicht in der Aufgabenliste", dann müssen Sie dafür testen und entscheiden, was zu tun ist.Vielleicht so etwas wie:

if (counter >= 0 && counter < module.Assignments.Count) 
    module.Assignments.ElementAt(counter).UsersScore = userMark; 
else 
    throw new Exception("I really have no idea what you want to do here."); 

Dies auch falsch aussieht:

moduleOverallLvl4[moduleCounter].Text = modAvg.ToString(); 

Sie uns nie sagen, was moduleOverallLvl4 ist, aber hier Sie vorausgesetzt, es ist die gleiche Größe hat wie das, was von requiredLevelList() zurückgeführt wird. Vielleicht sind sie in diesem speziellen Fall, aber das ist eine gefährliche Annahme. Wenn diese Werte verwandt sind, sollte moduleOverallLvl4 in der Klasse enthalten sein implementiert requiredLevelList, und Sie sollten über eine Methode verfügen, die getModuleScoreOverall() dem richtigen Element von moduleOverallLvl4 zuweist.

Verwandte Themen