DatagridView, Sélectionnez la dernière ligne
J'ai des soucis avec le réglage de la dernière ligne de mon datagridview sélectionné. J'sélectionnez la dernière ligne de cette manière:
if (grid.Rows.Count > 0)
{
try
{
grid.Rows[grid.Rows.Count - 1].Selected = true;
grid.CurrentCell = grid.Rows[grid.Rows.Count - 1].Cells[1]
}
catch (IndexOutOfRangeException)
{ }
catch (ArgumentOutOfRangeException)
{ }
}
Lorsque j'exécute ce code j'obtiens une exception: IndexOutOfRangeException occurred
: Index-1 n'a pas de valeur.
Quand je debug le Rows
de la collecte et de la Cells
collection, je vois les deux collections sont remplis. L'index existe également des Lignes et des Cellules de la collection.
Je n'ai aucune idée de ce que je fais de mal ici. Quelqu'un qui peut m'aider ici? Thnx
EDIT:
Ici est l'exception:
System.IndexOutOfRangeException: Index -1 does not have a value.
at System.Windows.Forms.CurrencyManager.get_Item(Int32 index)
at System.Windows.Forms.CurrencyManager.get_Current()
at System.Windows.Forms.DataGridView.DataGridViewDataConnection.OnRowEnter(DataGridViewCellEventArgs e)
at System.Windows.Forms.DataGridView.OnRowEnter(DataGridViewCell& dataGridViewCell, Int32 columnIndex, Int32 rowIndex, Boolean canCreateNewRow, Boolean validationFailureOccurred)
at System.Windows.Forms.DataGridView.SetCurrentCellAddressCore(Int32 columnIndex, Int32 rowIndex, Boolean setAnchorCellAddress, Boolean validateCurrentCell, Boolean throughMouseClick)
at System.Windows.Forms.DataGridView.set_CurrentCell(DataGridViewCell value)
Code semble très bien. Avez-vous essayé de débogage? Sur quelle ligne de code obtenez-vous l'erreur?
Essayez un Rapide Montre pour
la ligne est:
Puis-je obtenir la IndexOutOfRangeException. Quand je fais de la grille.Les lignes[grille.Les lignes.Count - 1].Les cellules.Le comte je reçois 5
Essayez un Rapide Montre pour
grid.Rows[grid.Rows.Count - 1].Cells[1]
et voir de quoi il en retourne.la ligne est:
grid.CurrentCell = grid.Rows[grid.Rows.Count - 1].Cells[1]
Puis-je obtenir la IndexOutOfRangeException. Quand je fais de la grille.Les lignes[grille.Les lignes.Count - 1].Les cellules.Le comte je reçois 5
OriginalL'auteur Martijn | 2010-09-28
Vous devez vous connecter pour publier un commentaire.
Essayer:
Donne la sortie suivante: (Dernière rangée, défile et sélectionnée)
J'ai testé le code avant de le poster. Qu'est-ce exactement ne fonctionne pas?
Sur la ligne
dataGridView1.Rows[nRowIndex].Cells[nColumnIndex].Selected = true;
- je obtenir les fenêtres ExceptionEn supposant que le exception est le même que dans votre question. Êtes-vous d'insérer une ligne manuellement? avant de liaison?
Avant j'sélectionnez la dernière ligne je utiliser cette méthode: private void AddAppointmentsToGrid(IList<Rendez-vous> rendez-vous) { Collection<Rendez-vous> applications = dgViewAfspraak.Source de données comme la Collection<Rendez-vous>; dgViewAfspraak.DataSource = null; foreach (Nomination d'application dans les rendez-vous) { apps.Ajouter(app); } dgViewAfspraak.DataSource = apps; } (vous Ne savez pas comment faire pour afficher du code dans les commentaires)
OriginalL'auteur KMån
Je sais que cela peut être un peu tard mais ça peut servir à quelqu'un d'autre.
Avez-vous essayé ceci :
grid.Rows.Row[grid.Rows.Count -1].Selected = 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 il est venu à moi la nuit quand j'étais dans mon lit (je suis un newbie de la programmation).
Si j'écris comme :
Rows[Rows.count-1]
la première ligne est "0" et "0-1 = -1" si son de la gamme 🙂Puis quand j'ai changé mon code de
Rows.Row[index]
il a travaillé! 🙂Une alternative si vous utilisez de c# 3.0 et supérieur: découvrez CellAddress();
😉
Sincèrement
OriginalL'auteur sihirbazzz
Avez-vous pensé à l'utilisation de Linq pour cela?
Last()
etFirst()
. J'ai l'aide de Système.Linqdésolé, j'ai édité pour corriger linq maintenant
Merci. Essayé votre solution mais j'obtiens la même Exception sur cette ligne:
grid.CurrentCell = grid.Rows.OfType<DataGridViewRow>().Last().Cells.OfType<DataGridViewCell>().Last();
il n'a pas de sens pour obtenir IndexOutOfRangeException sur le code qui n'utilise pas l'index de propriété. Sûr que c'est la même exception?
OriginalL'auteur danijels
Votre "attraper" bloc de IndexOutOfRangeException est vide et n'affiche aucune erreur.
Soit votre question n'est pas exact, ou l'exception est renvoyée à un autre endroit.
EDIT: Avoir regardé à travers votre pile d'appel que vous avez ajouté, je peux voir que l'erreur est, en effet, pas être jeté ici, mais plutôt dans le
CurrencyManager
de la classeCurrent
/Item
propriétés, qui est en fin de compte être déclenchée par l'appel à laCurrentCell
setter.Ligne de fond: le problème n'est pas dans ce code, à l'exception d'être jeté par quelque autre morceau de code déclenchée par votre réglage de la cellule courante.
Je voudrais utiliser le mot "Immédiat" de la fenêtre pour confirmer la valeur de la grille.Les lignes.Comte, puis essayez d'accéder à la grille.Les lignes[0] ou quel que soit le nombre à l'aide d'un littéral entier, juste pour s'assurer. Je soupçonne que le code n'est pas ici une copie exacte du code qui est à l'origine de l'exception, et quelque part entre les deux et ce que vous
Dans la fenêtre exécution, j'ai les lignes et les cellules dans les collections
Avez modifié ma réponse.
EDIT: Cela n'A PAS résolu MON PROBLÈME! J'ai toujours la même Exception. J'ai encore aucune idée de ce qui va mal. Je n'ai que ces gestionnaires d'événements:
CellContentDoubleClick
etCellDoubleClick
OriginalL'auteur Shaul Behr
OriginalL'auteur Sayisal Ofis
Finalement, la dernière ligne est vide, car c'est le vide de ligne avec lequel l'utilisateur peut ajouter une nouvelle ligne. Cette ligne ne peut pas être sélectionné.
Avez-vous essayé de la grille.Les lignes.Comte - 2? Comme alternative, vous pouvez définir AllowUserToAddRows à false.
J'ai déjà cette propriété est définie sur false..
-1 - ce qui est appelé clutching at straws, pas de débogage.
OriginalL'auteur Jan-Patrick Ahnen