7
votes

Exception d'application Formulaire Windows

I Obtenir une exception d'application

Application.Run(new MainForm());


7 commentaires

Quel est le message d'exception? Votre plus grand indice en ce moment est la référence à DeviseManager . Que fait la grille avec la monnaie? Spécifiquement, y a-t-il quelque chose de mal avec les données de la ligne que vous cliquez sur?


Avec David, quelle est la trace complète de la pile? Il manque les informations importantes


C'est une trace de pile complète. Il n'y a rien d'autre ... je peux olly Ajouter ce message d'erreur est {"Index -1 n'a pas de valeur."} (SystemindexOUTOfarange Exception). Je l'ai ajouté à la question.


Mon pari est sur "IndexOutOfRangeException" car le DeviseManager signale un décalage de la position de la ligne actuelle de -1.


Je ne travaille pas avec la monnaie. DataGridView a seulement 5 colonnes: 1 date, 2 textes et 2 boutons.


@Anton: Je ne veux pas dire que la monnaie signifie de l'argent. La liaison de données utilise un devise de change pour garder une trace de la ligne actuelle , etc.


Dans notre cas, le problème était que l'un de nos programmeurs handicapés les événements dans certaines circonstances avec: Ceci.ReiselistChangeDevents = Faux;


3 Réponses :


21
votes

Je suppose que vous avez lié une liste initialement vide (ou une autre sorte de collection qui ne génère pas d'événements modifiés par la liste) à votre dataGridView , puis ajouté des éléments dans cette liste. .

Les éléments que vous ajoutez seront affichage correctement sur votre grille, mais que vous cliquez sur une ligne entraînera cette exception. En effet, le DeviseManager rapportera sa position de ligne actuelle sous forme de décalage de -1. Il restera de cette façon parce que la liste ne signale pas les modifications apportées à la grille.

Vous ne devez lier que votre liste sur la grille si elle a quelques éléments de commencer à commencer ou à rebondir lorsque vous les ajoutez.

Voir aussi ma réponse à Cette question, qui est essentiellement le même problème.


3 commentaires

Oui, je suis une liste contraignante. Je vais essayer de vérifier si la liste est vide avant de se lier.


Le problème pourrait être résolu si avant la liaison de données à datagridview doit convertir la liste sur à (En convertissant Liste sur DataTable ) et utilisez-le comme DataSource . Pour moi, c'est mieux que de convertir à BindingList (de T) , car après la diffusion de données datagridview.datasource = BindingList (de t) Il affiche 1 ligne vide dans DataGridView < / code>, même BindingList (de T) est vide


Lors de la liaison de la liste (assumez DataLST) à la source de données du DataGridView, liez-le avec grid.datasource = datalst.tolist ();



0
votes

Suivre les conseils d'Andy, je substitué

Liste privée employés {obtenir; ensemble; } = nouvelle liste (); _employesGridview.dataSource = employés;

avec

Liste de liaison privée Employés {Obtenir; ensemble; } = nouvelle base de liaison (); _employesGridview.dataSource = employés;

Et le problème a disparu.


0 commentaires

0
votes

Après beaucoup d'efforts, j'ai résolu ce problème. Lier votre DataGridView lorsque vous avez des données dans la source de données, soit une liste ou une clé de données.


0 commentaires