11
votes

Comment sélectionner une ligne ou une cellule dans WPF DataGrid Programmatiquement?

dans WinForm DataGridView, il sélectionne automatiquement la première ligne lorsqu'elle est initialisée. Il m'a conduit fou quand j'ai essayé de tourner cette fonctionnalité. Déménagement sur WPF DataGrid, il semble que Microsoft ait décidé de désactiver cette fonctionnalité, ce qui est une bonne chose que je pense. Cependant, j'ai du mal à activer cette fonctionnalité maintenant. Pour certains DataGrid, je veux que la première ligne soit sélectionnée automatiquement après le remplissage de la grille via une liaison de données. Il y a quelques suggestions sur Internet, mais je ne pouvais pas faire ce travail. J'espère avoir une bonne chance ici.


0 commentaires

4 Réponses :


10
votes

Ensemble IssynchronizedWithCurrentItem = "vrai" .

EDIT:

Pour adresser votre commentaire, je suppose que votre sélection de votre DataGrid est défini sur "Cell", est-ce? D'accord, je ne suis pas sûr que ce soit la meilleure solution, mais une chose que vous pouvez effectuer est de gérer l'événement chargé de la DataGrid et de définir manuellement la cellule sélectionnée dans le code de code. Donc, vous aurez quelque chose comme ceci: xxx

événement-manutention: xxx

Notez que cela ne fonctionnera que si Le DataGrid.Selectionnit est défini sur "Cell". Sinon, je crois que cela lancera une exception.

Edit2:

xaml: xxx

Code-derrière: xxx


8 commentaires

Merci beaucoup pour la pointe. Je viens de l'essayer. Le réglage sur TRUE fera la première ligne du DataGrid "en surbrillance", mais non sélectionné. J'ai besoin d'être tiré de l'événement sélectionné. Alors, comment puis-je faire viré cet événement?


@karmicpuppet: Ce code fonctionne dans l'événement DG_Loaded. Cependant, il fonctionne dans l'événement DatacontextChanged. Essentiellement, la même grille est réutilisée. Chaque fois qu'un contexte de données de données est défini, je souhaite que la première ligne à sélectionner est automatiquement sélectionnée, ce qui devrait déclencher la sélection de l'événement SelectedCellschanged, car je compte sur cela.


@karmicpuppet à nouveau: Je pense que cela est lié à mon autre question: où est WPF DataGrid DatagramfindingCompledingcomePletePlete? Quelqu'un m'a pointé sur DatacontextChanged Event. Comme je l'ai observé, l'événement DataContextChanged est effectivement tiré après avoir défini un nouveau contexte de données. Cependant, je ne peux pas faire fonctionner l'effet visuel dans ce gestionnaire d'événements. Très étrange.


Je ne pense pas qu'il y ait un événement DatabindingPomplet dans WPF. Je ne suis pas sûr. Que diriez-vous d'essayer l'événement "DataGrid.itemContaNeunserver.itemContaNeunserver.ItemSchanged"?


@KARMICPUPPET: Il suffit de l'essayer avec datagrid.itemcontainergerenerator.Itemschanged événement et le comportement semble être identique à DataContextChanged.


Miliu, je pense que je suis à court de suggestions. Désolé pour ça. Mais voir si je devais faire quelque chose comme ça, j'utiliserais généralement le modèle MVVM pour mon application. J'aurai mes articles pour le DataGrid et l'état de sélection stocké dans une viewmodel. L'interface utilisateur se liera ensuite aux propriétés dans la vue. Cela peut être la voie à suivre, mais peut avoir besoin de beaucoup de travail. Quoi qu'il en soit, désolé mes suggestions ci-dessus n'ont pas fonctionné.


@karmicpuppet: Je ne comprends pas comment MVVM pourrait m'aider dans ce cas. Je veux seulement avoir la première ligne sélectionnée automatiquement lorsque DataContext est modifié. Je déteste vraiment écrire des tonnes de code juste pour cette tâche appropriée très simple.


OK, si vraiment, ce que vous voulez, c'est de sélectionner automatiquement la première ligne lorsque DataContext change, je crois que mon code ci-dessus fonctionne. Voir Edition2 ci-dessus et essayez le code. Ça marche.



2
votes

Vous pouvez essayer cela.

        this.dataGrid.SelectionMode = DataGridSelectionMode.Single;

        // Selects the 4th row.
        this.dataGrid.SelectedIndex = 3;


6 commentaires

Celui-ci est pour la sélection de lignes.


@Avatar: Je viens d'essayer de votre suggestion. Il semble avoir le même effet que IssynchronizedWithCurrentTem. Donc, cela souligne simplement la ligne, mais je n'ai pas la sélection de l'événement. Malheureusement, il n'y a pas d'événement «sélectionné» ou quelque chose comme ça. Par rapport à Winform DataGridView, WPF DataGrid a très peu d'événements.


@Miliu L'événement sélectionné de la société sélectionnée doit être déclenché ne sait pas quel problème est. J'ai un échantillon ici. S'il vous plaît vérifier cela. Cela pourrait vous donner une idée. FileFactory.com/file/b3bhf1d/n/dataGridCheckboxelection.zip


@Avatar: Je ne peux pas obtenir votre fichier téléchargé à partir de fichierFactory. Il m'a demandé de vous inscrire pour vous débarrasser des publicités popupes. Je l'ai fait, mais cela apparaît toujours. Je dois attendre 30 secondes. Je l'ai fait, mais alors quand je clique, tout le cycle recommence, et cela se bloque, c'est-à-dire finalement. Il s'est écrasé trois fois. Je déteste ces pages Web avec des tonnes de popups. Est-ce qu'ils gagnent vraiment de l'argent de cela?


Ne faites pas ces trucs. Je pensais qu'ils sont libres. OK j'ai téléchargé le fichier ici ici sites.google.com/site/html5Tutudials/... < / a> c'est beaucoup plus sûr je suppose


@Avatar: Merci pour l'échantillon, ce qui m'a aidé à comprendre mon problème partiellement. Oui, l'événement sélectionné est tiré. Je ne l'ai tout simplement pas remarqué parce que dans mon gestionnaire d'événements, je vérifie la courante actuelle qui n'est pas définie. Cependant, je vois un autre problème. Si je mets DataGrid.Selectedindex = 0 dans l'événement DatacontextChanged, cela fonctionne la première fois. Mais dans les temps suivants (lorsque le contexte de données est modifié), la sélection de la sélection ne s'affiche pas. J'ai besoin de cet indice visuel pour indiquer quelle ligne est actuellement sélectionnée. Je pense que c'est plus un problème d'événement DatacontextChanged, voir ci-dessus.



1
votes

Je suis heureux de signaler que j'ai trouvé une solution pour ce problème via itemonTentagerenerator.statuschanged. / code> événement.

dataGrid.ItemContainerGenerator.StatusChanged += new EventHandler(ItemContainerGenerator_StatusChanged);

void ItemContainerGenerator_StatusChanged(object sender, EventArgs e)
        {
            if (dataGrid.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)
            {
                dataGrid.SelectedIndex = 0;
            }
        }


1 commentaires

En fait, je viens de réaliser que l'événement ItemContainererneratoratoratoratorSchanged pourrait être tiré trop de fois. Je suis retourné à DataContextChanged Event et j'ai fait fonctionner par Dispatcher.begininvoke.



3
votes

Vous pouvez le faire systématiquement dans l'événement DataGrid.Loaded. Obtenez juste la première ligne et avez-vous la ligne d'incendier l'événement de sélection.

void MyGridLoaded(...) {
DataGridRow r = yourGrid.ItemContainergenerator.ContainerFromIndex(0) as DataGridRow;
  if(r != null) {
     r.IsSelected = false;
     r.IsSelected = true;
  }

} 


0 commentaires