DevExpress XtraGrid FocusedRowChanged cas de problème lors du changement de source de données
Ce problème a m'énerve depuis plusieurs années, et peut-être que quelqu'un ici connait une solution simple, depuis que je viens de croiser à nouveau.
QUESTION: Est-il possible d'obtenir le XtraGrid à "oublier" l'actuel axé index de ligne avant une nouvelle (différents) de la source de données est affecté à la grille?
Arrière-plan
Nous utilisons le XtraGrid comme une sorte de contrôleur pour ce qui est affiché dans un autre groupe d'une multipane Winform.
Maintenant, imaginez un scénario hypothétique où la source de données de la XtraGrid ne cesse de changer selon les sélections de menu. Élément de Menu 1 remplit la grille avec une liste d'aujourd'hui entrées dans la cafétéria: Id, Nom. Élément de Menu 2 remplit la grille avec une liste de Clients, l'utilisateur doit téléphonique de ce jour: ID, Nom. Chose importante est que ce sont de délimiter les différentes sources de données, et la grille de la source de données est affecté et réaffectés.
FAIT ESSENTIEL POUR CETTE QUESTION:
Nous voulons de la grille FocusedRowChanged événement le seul endroit où nous piège de la sélection de l'utilisateur dans le contrôleur de la grille. Nous sommes un "pas de code spaghetti" de la boutique. FocusedRowChanged est mieux qu'un événement de clic car il gère la navigation au clavier. La ligne avec l'accent contient l'ID de l'enregistrement de détail nous avons besoin de récupérer à partir de la base de données pour l'affichage dans le Panneau n ° 2. Cela fonctionne--la plupart du temps.
Voici comment cela ne fonctionne pas: disons que sur un jour donné, la liste des clients, l'utilisateur doit contacter ne contient qu'une seule ligne. Donc, la première (et la seule) ligne de la grille est la ligne. Maintenant supposons que l'utilisateur va jusqu'à le menu et sélectionne l'élément de menu pour afficher le jour de la cafétéria des plats principaux. Lorsque l'utilisateur clique sur le premier élément dans la liste des Plats, le FocusedRowChanged événement ne se déclenche PAS parce que la grille a conservé une mémoire de la ligne d'index à partir de la précédente source de données. La ligne indice n'a pas changé. Et donc la sélection de l'utilisateur ne déclenche rien.
J'ai essayé de DevExpress d'offrir une seconde de plus de la ligne orientée-objet de mode (comme distincts à partir de la ligne de l'index de l'approche axée sur lequel chaque ligne de la grille aurait un GUID et le FocusedRowChanged événement mettrait le feu à chaque fois que le GUID de l'concentre actuellement ligne diffère de le GUID de l'concentrait ligne, peu importe si la ligne d'index qui est arrivé à être le même. Cela permettrait à des changements dynamiques de la source de données et activer le comportement souhaité. Mais ils ont soulevé des objections.
Donc je vais poser ma question, Est-il possible d'obtenir le XtraGrid à "oublier" l'actuel axé index de ligne avant une nouvelle source de données est affectée à la grille?
OriginalL'auteur Tim | 2011-05-05
Vous devez vous connecter pour publier un commentaire.
Je pense que la meilleure solution à ce problème est de créer un nouveau GridView objet et de remplacer son DoChangeFocusedRowInternal méthode. Vous trouverez ci-dessous le défaut de mise en œuvre de cette méthode. Tout ce que vous devez faire est de modifier la ligne marquée tout comme vos besoins. Aussi, jetez un oeil à la Comment créer un GridView descendant de la classe et de l'enregistrer pour une utilisation de création article, il contient des informations utiles.
Mise à JOUR
Mon code:
Et quand j'essaie de drop MyGrid (héritant comme par KB) à partir de la boîte à outils vers le formulaire, VS2010 se bloque. Je souhaite DevExpress pourrait il suffit d'invoquer que peu d'optimisation (FocusedRowHandle==newRowHandle) retour;) par défaut, sauf si elle est désactivée à l'aide de certaines propriétés de conception, le développeur peut définir lors de sources de données vont être modifiées, ainsi que par la question d'origine.
Je ne connais pas le code donc je ne peux pas commenter. de toute façon, j'ai mis à jour ma réponse à toutes les classes. J'espère qu'il vous aidera.
Les changements ne permettre le contrôle dérivé pour être déposés sur le formulaire. Mais le code dans RowEqual méthode ne fonctionne pas (et NE peut pas logiquement de travail) parce que focusedRowHandle est 0 et newRowHandle est également 0, et donc la GetDataRow() la méthode doit retourner la MÊME ligne. Rappelez-vous, la source de données d'origine a été remplacé par un nouveau, et à ce point dans le code, vous pouvez uniquement faire référence à la ligne de la source de données ACTUELLE. Il doit y avoir quelque chose comme un RowGUID en plus de la (int) RowHandle.
mon code est juste un exemple sur la façon dont cette fonctionnalité peut être mis en œuvre. Vous savez que la tâche de meilleure qualité et donc si ce code fonctionne, il ne devrait pas être un problème pour le modifier en fonction de vos besoins...
OriginalL'auteur DevExpress Team
Tim, j'ai eu exactement le même problème lorsque la grille n'avait qu'une seule ligne de données et changé sources de données. Je l'ai résolu en définissant le contrôle gridview.FocusedRowHandle = -1 après le réglage de la source de données.
OriginalL'auteur rob
Dans une situation similaire, je suis abonnée à la
FocusedRowObjectChanged
événement (à l'aide de DevExpress 16.1).
OriginalL'auteur Thomas853
Vous pouvez vous inscrire sur l'événement DataSourceChanged qui se déclenche lors de modifications de source de Données (vous l'aurez deviné!) alors que vous pouvez obtenir de l'aide GetFocusedObject() de l'objet, et d'afficher les éléments pertinents pour la grille d'autres...
OriginalL'auteur DevExpresser