2017-10-13 3 views
0

J'essaie d'ajouter des valeurs textbox et numericUpandDown à un tableau, mais cela ne semble pas fonctionner.Ajout de valeurs de zone de texte à un tableau ne fonctionne pas C#

Carro []carros = new Carro[1]; 
private Carro carro; 

public Form1() 
{ 
    .. 
} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    .. 
} 

private void AdicionarCarro() 
{ 
    this.carro = new Carro(textboxCor.Text, textboxMarca.Text, textboxModelo.Text, 
     (int.Parse(numUpDownCilindrada.Text)), (int.Parse(numUpDownVelocidade.Text))); 
} 

private Carro[] AdicionarArray(Carro carro, Carro[] array) 
{ 
    AdicionarCarro(); 

    int novoTamanho = array.Length + 1; 

    Carro[] carros = new Carro[novoTamanho]; 

    for (int i = 0; i < array.Length; i++) 
    { 
     carros[i] = array[i]; 
    } 

    carros[novoTamanho] = carro; 


    return carros; 
} 

private void buttonGravar_Click(object sender, EventArgs e) 
{ 
    AdicionarArray(carro, carros); 
} 

Lorsque je tape les valeurs et cliquez sur le « buttonGravar », il me donne cette Erreur:

Error

Je serais bien heureux d'obtenir des conseils/aide à ce sujet .

+1

Le tableau est défini pour contenir qu'une seule valeur, 'Carro [] carros = new Carro [1],' c'est pourquoi vous obtenez cette erreur –

+1

duplication possible de [Qu'est-ce qu'une exception "index hors de portée", et comment puis-je le résoudre?] (https://stackoverflow.com/questions/24812679/what-is-an-index- out-of-range-exception-and-how-do-i-fix-it) – SeM

+0

Vous oubliez d'utiliser la valeur de retour de AdicionarArray(). C'est juste une façon fondamentalement incorrecte de le faire, et pas seulement parce que vous avez oublié de mettre à jour la variable carros, changez plutôt sa déclaration à 'List '. –

Répondre

3

mieux:

private List<Carro> Carros; 

public Form1() 
{ 
    Carros = new List<Carro>(); 
    .. 
} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    .. 
} 

private void AdicionarCarro() 
{ 
    var carro = new Carro(textboxCor.Text, textboxMarca.Text, textboxModelo.Text, 
     (int.Parse(numUpDownCilindrada.Text)), (int.Parse(numUpDownVelocidade.Text))); 
    Carros.Add(carro); 
} 

private void buttonGravar_Click(object sender, EventArgs e) 
{ 
    AdicionarCarro(); 
} 

Pour vous aider à comprendre votre code:

carros[novoTamanho] = carro; 

devrait être

carros[novoTamanho - 2] = carro; 

Raison:

index Array commence à 0. novoTamanh représente une nouvelle longueur (commençant à 1, pas 0 contrairement à l'index), qui est en dehors du tableau.

+1

-2? Parce que 'int novoTamanho = array.Length + 1;'. –

+4

Toute cette indexation acrobatique supplie quelqu'un de souligner à quel point ce code est vraiment horrible, et comment il a besoin d'une refonte complète, au lieu de plus de bandaids. – DonBoitnott

+0

Oh oui! Merci, c'était tellement bête de ma part de ne pas m'en rendre compte! – ckvywk

6

L'utilisation System.Collection.Generic.List<T> serait beaucoup plus simple, car il ne dispose pas d'une taille fixe:

List<Carro> carros = new List<Carro>(); 
carros.AddRange(array); 
carros.Add(carro); 
return carros; 
+0

Je suis encore étudiant, et nous n'avons toujours pas été sur cette partie (si je me souviens bien), merci pour la solution alternative bien! – ckvywk

+0

Je l'ai utilisé, mais il ne semble pas fonctionner, Il est dit "Impossible de convertir implicitement le type 'System.Collections.Generic.List ' en 'CriarCarroForm.Carro []'" – ckvywk

0

Il est un indice hors d'exception de gamme parce que votre gamme Carro est de taille tmanho:

Carro[] carros = new Carro[novoTamanho]; 

et les carros peuvent contenir exactement les éléments "novoTamanho" indexés de "0" à "novoTamanho -1"

Vous pouvez simplement résoudre ce problème en définissant:

int novoTamanho = array.Length + 2; 

Ou si vous ne voulez pas gérer les index, utiliser des listes:

List<Carro> listCarro = new List<Carro>; 
listCarro.AddRAnge(array); 
listCarro.Add(carro); 
return listCarro.ToArray();