7
votes

WPF DataGrid ne quitte pas le mode d'édition

J'ai un DataGrid affichant plusieurs lignes et colonnes de données, chacune est liée à son propre propriété . Le DataGrid n'est pas sur un tabcontrol mais chaque fois que la fenêtre qu'elle vit est fermée et que la réouverture, je reçois le message d'erreur: 'deferrefresh' n'est pas autorisé pendant un AddNew ou transaction d'édition. Seulement si Il y avait des problèmes de validation avec un ou plusieurs des cellules datagrid S.

Par exemple: < / Strong> La propriété liée à la cellule de datagrid est un double et l'utilisateur entre "Hello", bien sûr alors WPF La bordure rouge automatique est affichée autour de la cellule . Maintenant, si l'utilisateur ferme la fenêtre et que vous le rouvrez, l'erreur se produirait.

Je sais pourquoi l'erreur est lancée, car la cellule ne laisse pas "mode d'édition".

Comment puis-je résoudre cette erreur?

Autres notes:

  • J'ai regardé Cette question mais qui se rapporte à un DataGrid sur un tabcontrol (quelle mine n'est pas).
  • J'ai essayé de limiter l'entrée de l'utilisateur de sorte que si la cellule nécessite un double ou déclenche uniquement un double , mais le problème Il n'y a pas de bonnes façons de limiter le nombre de points décimaux (".") que l'utilisateur peut insérer. Je contrôlais la saisie de l'utilisateur via previewTextInput et permettant uniquement 0-9 et ".".

    Détail d'exception (si cela aide) xxx

    Je serai heureux de fournir plus d'informations si nécessaire si nécessaire .


5 commentaires

Utilisez-vous une nouvelle fenêtre de fenêtre / datagrid à chaque fois.?


J'ai résolu un problème similaire en appelant buttonblah.focus () à l'intérieur de l'événement de fermeture de la fenêtre, cela oblige l'événement LostFocus à tirer sur la cellule. Pas jolie je sais ... Une autre solution consiste à permettre à la fenêtre d'être fermée à l'aide des boutons "Enregistrer" et "Annuler".


@Jordancarroll Essayez de gérer la fenêtre_clusion de l'événement et d'effacer la source de données DataGrid. Mais comme son nouvel exemple de grille à chaque fois, cette question ne devrait pas se passer du tout.


Eh bien, le problème est apparemment un bug bien connu. Le problème est que la cellule ne quitte pas le mode d'édition (s'il n'y a pas de texte non valide) car le texte ne correspond pas au type type de la propriété. Cela a du sens, mais c'est un bug. Le problème n'est pas qu'il ne perd pas la concentration non plus. Il a apparemment été fixé en 4.5, mais cela ne me fait pas de bien. Jusqu'à présent, je ne pense pas qu'il y ait de grandes solutions ou de solutions de contournement.


J'ai le même problème avec .NET 4.7.1, et cela a empiré que c'était au début. Maintenant, il n'en annule ni n'engage pas le mode édition, non seulement s'il a des erreurs de validation. Je vois que l'événement de LostFocus est tiré pour la cellule, mais il semble être trop tard, seul le contournement mentionné par @jack travaille.


3 Réponses :


5
votes

Ceci est un bug qui a été corrigé avec .NET Framework 4.5+. Malheureusement, pour ceux d'entre nous bloqués avec les versions précédentes, l'erreur est toujours un problème. La meilleure solution que j'ai trouvée est de simplement lier le DataGrid à Propriétés avec type chaîne . De cette façon, le contrôle total sur l'entrée de l'utilisateur est disponible. Avec le contrôle total, l'utilisateur ne doit pas être en mesure de déclencher des erreurs et le DataGrid ne placera pas le programme.


5 commentaires

J'ai ce problème exact avec .NET 4.5.1.


@ l33t jamais réparer ça? Moi aussi, je cours .net 4.5 et je vois toujours cela.


@Jordan, pouvez-vous créer un lien vers le document montrant quand exactement cela a été corrigé / adressé? Était-ce en 4.5 ou 4.5.1, 4.5.2, etc.? Je ne pouvais rien trouver sur les recherches que c'était même abordée et encore moins fréquentées.


@Marquelv, pas encore correction :(


Je suis confronté au même problème même avec .NET 4.6.



12
votes

Vous pouvez essayer de forcer datagrid dans l'annulation de l'édition lorsque vous en avez besoin:

myDatagrid.CommitEdit(); 
myDatagrid.CancelEdit();


2 commentaires

Où mettez-vous ce code? J'ai essayé de le mettre sur l'événement soulevé par le bouton utilisé pour fermer la fenêtre mais cela ne résout pas le problème pour moi


@FrancesCods Hey, j'avais un problème similaire et que l'erreur a été déclenchée par un datagrid.itemsSource = données; ligne. J'ai littéralement la place juste avant la ligne qui causait l'erreur et cela a fonctionné pour moi - pour moi, c'était causé par un double clic erroné sur une cellule dans le Datagramrid (le double clic faisait le programme croire que l'utilisateur essayait d'éditer le contenu d'une cellule mais ce n'était pas l'intention des utilisateurs)



1
votes

J'avais ce numéro .NET 4.5.1 et c'était la seule chose qui a fonctionné pour moi. XXX


0 commentaires