2010-10-14 12 views
21

So che il datagrid WPF ha l'evento "RowEditEnding", ma ho bisogno di attivare l'evento dopo che la riga è stata inviata per controllare se la riga appena aggiunta è duplicata e unire la riga duplicata. Il mio datagrid ha la proprietà "CanUserAddRow" impostata su True.WPF Datagrid Row Modifica evento "ENDED"

Sto utilizzando EntityObservableCollection che estende ObservableCollection per sincronizzare la mia entità con la raccolta. Quindi, ho considerato l'evento OnCollectionChanged, ma l'evento "InsertItem" è stato sollevato una volta che l'utente ha fatto clic sulla nuova riga del segnaposto, il che significa che l'oggetto è ancora vuoto e non posso controllare la presenza di duplicati.

Esiste comunque la possibilità di generare l'evento RowEditEnded?

Grazie ...

+0

Ci potrebbe avere qualche evento di convalida. puoi controllarlo per un po '. – Sankarann

+0

Hai davvero provato a guardare abbastanza CollectionChanged? I controlli interni potrebbero farti sapere quando l'elemento effettivamente inserito o aggiornato, in modo da poter controllare ogni volta e se i campi compilati ALLORA eseguire la logica di modifica: http://stackoverflow.com/questions/4587448/collectionchanged-sample. Ho upvoted @Mah prima che mi rendessi conto delle limitazioni di tale approccio (alternando maniglie e poi forzando commit e refresh e ect), e pensato di più su collectionchanged (ma non posso rimuovere upvote ora) –

risposta

0

provare a impostare la funzione CommitEdit() per il DataGrid. L'ho usato qui:

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

Mi chiedo perché stai trovando il modo di aumentare l'evento RowEditEnded; se si Implementare l'evento RowEditEnding di datagrid; ogni volta che hai modificato una riga e modificato lo stato attivo da quella riga, la riga verrà impegnata e RowEditEnding verrà generato;

quindi, dopo il commit della Riga, RowEditEnding verrà generato e funzionerà esattamente come RowEditEnded;

Ho capito qualcosa di sbagliato dal tuo testo?

2

ho trovato una risposta alla tua domanda usingVS2010

condizione if (e.EditAction == DataGridEditAction.Commit) nella RowEditEnding soddisferà ur requisito

prega di consultare il codice qui sotto.

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

Questa è la Xaml dietro.

<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

Questo dovrebbe essere selezionato come risposta accettata. Grazie Maher Ben Issa! –

+0

funziona perfettamente per me ma è la migliore risposta? è questo un codice ottimizzato? – Mamad

+0

e un'altra domanda su CellEndEdit ho lo stesso problema con CellEndEdit. – Mamad

0

soluzione VB.NET alla soluzione di @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

Prendendo da @ risposta di MaherBenIssa, ho usato questo per evitare di aggiungere e rimuovere delegato:

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 
      } 
     } 
    }