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: Quand j'exécute ce code, je reçois une exception: Lorsque je déboque les lignes code> Collection code> et la collection correspondante Je n'ai aucune idée de ce que je fais mal ici. Quelqu'un qui peut m'aider ici ici? THNX P> EDIT: P> Voici l'exception complète: p> indexoutOfrangeException survenait code>: index-1 n'a pas de valeur. p>
Collection CODE> Je vois que les deux collections sont remplies. L'indice existe également de la collection de lignes et de cellules. P>
8 Réponses :
Votre bloc "Catch" pour indexOutofRangeException est vide et n'affichera aucune erreur du tout. P>
Votre question n'est pas exacte, soit l'exception est jetée ailleurs ailleurs. P>
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. p> DeviseManager CODE>
CLASS ''S> CURRY
/
IMPORTAIRE CODE>, qui est finalement déclenché par l'appel dans le Setter
CurnCellCell CODE>. P>
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 i> 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 CODE> et
CELLDOUBLECLICK CODE>
@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é code> 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 i> 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?
Avez-vous pensé à utiliser Linq pour cela?
Non je n'ai pas. Mais je n'ai pas les méthodes d'extension dernier () code> et
premier () code>. 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
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?
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. P>
Essayez: donne la sortie suivante forte>: (dernière ligne, défilée et sélectionnée) p> p> p>
@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; code> Je reçois l'exception gênante
@Martijn: En supposant que l'exception i> 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
@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.
Je sais que cela peut être un peu tardif mais qu'il peut être utile à quelqu'un d'autre. p>
Avez-vous essayé ceci: p>
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). P >
Si j'écris comme: alors quand j'ai changé mon code sur Une alternative Si vous utilisez C # 3.0 et plus: Découvrez la celladdress ();
;) p>
sincèrement p> grid.rows.row [grid.rows.count -1] .sélectionné = true; code> p>
lignes [lignes.Count-1] code> La première ligne est "0" et "0-1 = -1" de sorte qu'elle est hors de portée :) P>
rows.row [index] code> ça a fonctionné! :) p>
dataGridView1.Rows[dataGridView1.Rows.Count - 1].Selected = true;
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;
C'est très facile. utilisation:
DataGridView.CurrentCell = DataGridView [ColuminIndex, Rowindex];
DataGridView [x, Y] ...
au lieu de
DataGridView [Y, X] ... P>
Le code semble bien. Avez-vous essayé de le déboguer? Sur quelle ligne de code obtenez-vous l'erreur?
Essayez A Quick Watch B> pour
Grid.Rows [Grid.Rows.count - 1] .Cells [1] Code> et voyez ce qu'il revient.
@Aseem: la ligne est la suivante:
grid.currentcell = grid.aux [grid.rows.count - 1] .cells [1] code>
@Kman: Ensuite, je reçois la indexOutOfrangeException. Quand je fais grid.aux [grid.rows.count - 1] .Counts.count i obtenez 5