2010-10-14 3 views
21

Je sais que la grille de données WPF a l'événement "RowEditEnding", mais je dois déclencher l'événement après que la ligne ait été vérifiée pour vérifier si la ligne nouvellement ajoutée est dupliquée et fusionner la ligne dupliquée. Mon flux de données a la propriété "CanUserAddRow" définie sur True. J'utilise EntityObservableCollection qui étend ObservableCollection pour synchroniser mon entité avec la collection. Donc, j'ai considéré l'événement OnCollectionChanged, mais l'événement "InsertItem" est surélevé une fois que l'utilisateur clique sur la nouvelle ligne d'espace réservé, ce qui signifie que l'objet est toujours vide et que je ne peux pas vérifier le doublon.Édition de lignes de données de type WPF "ENDED"

Y at-il de toute façon que je peux élever l'événement RowEditEnded?

Merci ...

+0

Il pourrait avoir un événement de validation. Tu peux vérifier ça pendant un moment. – Sankarann

+0

Avez-vous vraiment essayé de regarder assez CollectionChanged? Les vérifications à l'intérieur pourraient vous indiquer quand un élément est réellement inséré ou mis à jour, ainsi vous pouvez vérifier chaque fois et si les champs remplis ALORS exécuter la logique de changement: http://stackoverflow.com/questions/4587448/collectionchanged-sample. J'ai mis en avant @Mah avant que je réalise les limites de cette approche (basculer poignées alors forçant commettre et rafraîchir et ect), et pensé plus sur collectionchanged (mais ne peux pas enlever upvote maintenant) –

Répondre

0

Essayez le réglage de la fonction CommitEdit() pour votre DataGrid. Je l'ai utilisé ici:

private void DataGrid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e) 
{ 
    this.MyDataGrid.CommitEdit(DataGridEditingUnit.Row, false); 
} 
0

Je me demande pourquoi vous trouvez le moyen d'augmenter l'événement RowEditEnded; si vous Implémentez l'événement RowEditEnding de DataGrid; chaque fois que vous modifiez une ligne et changez le focus de cette ligne, la ligne sera validée et RowEditEnding sera levée; Donc, après que Row ait validé RowEditEnding sera levé et fonctionnera comme RowEditEnded;

Est-ce que j'ai mal compris votre texte?

2

Je trouve une réponse à votre question usingVS2010

condition si (e.EditAction == DataGridEditAction.Commit) dans le RowEditEnding remplira ur exigence

S'il vous plaît voir le code ci-dessous.

private void dataGrid1_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e) 
{ 
    if (e.EditAction == DataGridEditAction.Commit) 
    { 
     MessageBox.Show("asd"); 
    } 
} 

Ceci est le Xaml Behind.

<DataGrid AutoGenerateColumns="False" CanUserAddRows="True" Height="241" 
    RowEditEnding="dataGrid1_RowEditEnding" HorizontalAlignment="Left" 
    Name="dataGrid1" VerticalAlignment="Top" Width="573" > 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="name" Binding="{Binding id}" 
      Width="300"> 
     </DataGridTextColumn> 
    </DataGrid.Columns> 
</DataGrid> 
21
private void dgrid_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e) 
    { 
     if (this.dgrid.SelectedItem != null) 
     { 
      (sender as DataGrid).RowEditEnding -=dgrid_RowEditEnding; 
      (sender as DataGrid).CommitEdit(); 
      (sender as DataGrid).Items.Refresh(); 
      (sender as DataGrid).RowEditEnding += dgrid_RowEditEnding; 
     } 
     else Return; 

     //then check if the newly added row is duplicated 
    } 
+2

Cela devrait être sélectionné comme la réponse acceptée. Merci Maher Ben Issa! –

+0

cela fonctionne parfaitement pour moi mais est cette meilleure réponse? Est-ce un code optimisé? – Mamad

+0

et une autre question à propos de CellEndEdit j'ai le même problème avec CellEndEdit. – Mamad

0

solution VB.NET à la solution de @MaherBenIssa

Private Sub dgLayer_RowEditEnding(sender As Object, e As DataGridRowEditEndingEventArgs) 

    Dim d As DataGrid 
    d = DirectCast(sender, DataGrid) 

    RemoveHandler d.RowEditEnding, AddressOf dgLayer_RowEditEnding 

    dgLayer.CommitEdit() 
    sender.Items.Refresh() 

    AddHandler d.RowEditEnding, AddressOf dgLayer_RowEditEnding 

End Sub 
0

Prise de @ réponse de MaherBenIssa, j'ai utilisé cela pour éviter ajouter et supprimer des délégués:

private bool locker = true; 

    private void dgArticles_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e) 
    { 
     if (locker) 
     { 
      try{ 
       locker = false; 
       (sender as DataGrid).CommitEdit(DataGridEditingUnit.Row, false); 
       ((sender as FrameworkElement).DataContext as ViewModel)?.Edit(e.Row.DataContext); 
      } 
      finally{ 
       locker = true; //enable editing again 
      } 
     } 
    } 
Questions connexes