10
votes

DataGridView Sélectionnez Dernière ligne

J'ai des problèmes avec la définition de la dernière ligne de My DataGridView sélectionnée. Je sélectionne la dernière ligne de cette façon: xxx

Quand j'exécute ce code, je reçois une exception: indexoutOfrangeException survenait : index-1 n'a pas de valeur.

Lorsque je déboque les lignes Collection et la collection correspondante Collection Je vois que les deux collections sont remplies. L'indice existe également de la collection de lignes et de cellules.

Je n'ai aucune idée de ce que je fais mal ici. Quelqu'un qui peut m'aider ici ici? THNX

EDIT:

Voici l'exception complète: xxx


4 commentaires

Le code semble bien. Avez-vous essayé de le déboguer? Sur quelle ligne de code obtenez-vous l'erreur?


Essayez A Quick Watch pour Grid.Rows [Grid.Rows.count - 1] .Cells [1] et voyez ce qu'il revient.


@Aseem: la ligne est la suivante: grid.currentcell = grid.aux [grid.rows.count - 1] .cells [1]


@Kman: Ensuite, je reçois la indexOutOfrangeException. Quand je fais grid.aux [grid.rows.count - 1] .Counts.count i obtenez 5


8 Réponses :


1
votes

Votre bloc "Catch" pour indexOutofRangeException est vide et n'affichera aucune erreur du tout.

Votre question n'est pas exacte, soit l'exception est jetée ailleurs ailleurs.

EDIT: Après avoir examiné votre pile d'appels que vous avez ajouté, je peux voir que l'erreur est, en effet, pas étant jetée ici, mais plutôt dans le DeviseManager CLASS ''S> CURRY / IMPORTAIRE , qui est finalement déclenché par l'appel dans le Setter CurnCellCell .

En bout de ligne: le problème n'est pas dans ce code; L'exception est lancée par une autre pièce de code déclenchée par votre réglage de la cellule actuelle.


8 commentaires

Il fait une exception en mode de débogage. Le code s'arrête en marche et que VS met en surbrillance. Mais ce n'est pas le sujet. Le point est, pourquoi l'exception est-elle jetée?


J'utiliserais la fenêtre "Immédiate" pour confirmer la valeur de Grid.Rows.count, puis essayez d'accéder à la grille.Rows [0] ou du numéro à l'aide d'un littéral entier, juste pour vous assurer. Je soupçonne que le code ici n'est pas une copie exacte du code qui cause l'exception et quelque part entre cela et ce que vous pense votre code fait de l'erreur.


Dans la fenêtre immédiate, j'ai des rangées et des cellules dans les collections


EDIT: Cela n'a pas corrigé mon problème! J'ai toujours la même exception. Je n'ai toujours aucune idée de ce qui ne va pas. Je n'ai que ces gestionnaires d'événements: CellContentDoubleclick et CELLDOUBLECLICK


@Martijn - Qu'avez-vous trouvé dans la forme de changeManager? L'exception est originaire, dans ces méthodes que j'ai mentionnées dans ma réponse. Quelque part dans la propriété actuelle Vous faites référence à la propriété d'objet Indexier, avec un index de -1, qui n'existe évidemment pas.


Pour répondre à votre question dans la modification: je n'ai pas créé mon propre formulaire dans cet espace de noms. J'utilise un contrôle qui est basé sur le DATAGRID de Windows DataGrid (DotNetBar DataGridViewIX). Comment puis-je vérifier le formulaire de changeManager?


Ah, mon erreur, apparemment là, est une classe de change de change dans System.Windows.Forms (Do Googled avant d'ouvrir ma grande bouche!) msdn.microsoft.com/en-us/library/... Je ne l'ai jamais vu avant ou y a travaillé avec elle - Mais vous êtes clairement, quelque part dans votre DataGrid. C'est à peu près tout ce que je peux vous dire pour le moment; Espérons que je vous ai signalé plus ou moins dans la bonne direction. Bonne chance!


Vous pensez donc que je dois regarder le change de change du formulaire Windows?



3
votes

Avez-vous pensé à utiliser Linq pour cela? XXX


3 commentaires

Non je n'ai pas. Mais je n'ai pas les méthodes d'extension dernier () et premier () . J'ai l'utilisation du système.Linq


Merci. Essayé votre solution, mais j'ai la même exception sur cette ligne: grid.currentcell = grid.rows.oftype (). Dernier (). Cellules.oftype (). Dernier (). ;


Il n'a pas de sens d'obtenir indexOutOfrangeException sur le code qui n'utilise pas du tout une propriété Index. Bien sûr, il est la même exception?



0
votes

Finalement, la dernière ligne est vide car c'est la ligne vide avec laquelle l'utilisateur peut ajouter une nouvelle ligne. Cette ligne ne peut pas être sélectionnée. Avez-vous essayé Grid.Rows.count - 2? Comme alternative, vous pouvez définir AprevUserSertaddrows à FALSE.


0 commentaires

17
votes

Essayez: xxx

donne la sortie suivante : (dernière ligne, défilée et sélectionnée)

 text alt


11 commentaires

@Martijn: J'ai testé le code avant de poster. Qu'est-ce qui ne fonctionne pas exactement?


Sur la ligne datagridview1.rows [nrowindex] .Cells [ncolumnindex] .selected = true; Je reçois l'exception gênante


@Martijn: En supposant que l'exception est la même que dans votre question. Insérez-vous une ligne manuellement? avant la liaison?


@Kman: Avant de sélectionner la dernière ligne, j'exécute cette méthode: Void privé AddAppointStogrid (IList Nominations) {Collection applications = dgviefspraak.dataSource en tant que collection ; dgviewafspraak.dataSource = null; foreach (application de rendez-vous dans les rendez-vous) {apps.add (app); } dgviefafspraak.dataSource = applications; } (Je ne sais pas comment afficher le code dans les commentaires)


@Martijn: Pouvez-vous limiter cette méthode pour ajouter seulement une (ou deux) rangée (s) et test (s)?


@Kman: Jetez un coup d'œil à ma réponse et aux commentaires suivants - cela pourrait vous aider à pointer vos personnes dans la bonne direction?


@Kman: Quand j'insère un disque, j'ai la même exception


@Shaul: Je ne sais pas comment déboguer plus loin sur votre suggestion


J'ai fait des recherches sur le changeManager et j'ai constaté que cela a quelque chose à voir avec la base de données sur la forme. SHAUL m'a dit (Eh bien, en réalité l'exception) que la propriété actuelle est vide. Dans ma méthode (indiquée ci-dessus dans la méthode) définit la source de données à NULL. Maintenant, j'ai changé ce code et je n'utilise plus DataSource = null. Maintenant, le code fonctionne correctement sans exception.


ClearSelection - Sauvez ma vie))


ClearSelection est absolument remarquable! Mais que si nous prenons une sélection multiple activée. Sinon, tout va bien.



4
votes

Je sais que cela peut être un peu tardif mais qu'il peut être utile à quelqu'un d'autre.

Avez-vous essayé ceci:

grid.rows.row [grid.rows.count -1] .sélectionné = true;

Dans mon application Windows, j'ai d'abord utilisé votre code dans mon DataGridView et j'ai eu la même exception .. Et puis c'est venu me voir la nuit quand j'étais dans mon lit (je suis un débutant à la programmation).

Si j'écris comme: lignes [lignes.Count-1] La première ligne est "0" et "0-1 = -1" de sorte qu'elle est hors de portée :)

alors quand j'ai changé mon code sur rows.row [index] ça a fonctionné! :)


Une alternative Si vous utilisez C # 3.0 et plus: Découvrez la celladdress (); ;)

sincèrement


0 commentaires

1
votes
dataGridView1.Rows[dataGridView1.Rows.Count - 1].Selected = true;

0 commentaires

0
votes

Pour éviter l'indexOutOfrangeException, assurez-vous que de sélectionner une ligne visible. Je suggère:

// Find last visible row
DataGridViewRow row = dataGridView1.Rows.Cast<DataGridViewRow>().Where(r => r.Visible).Last(); 
// scroll to last row if necessary
dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.Rows.IndexOf(row);
// select row
row.Selected = true;


0 commentaires

0
votes

C'est très facile. utilisation: DataGridView.CurrentCell = DataGridView [ColuminIndex, Rowindex];
DataGridView [x, Y] ...
au lieu de
DataGridView [Y, X] ...


0 commentaires