2010-10-14 16 views
21

Wiem, że datagrid WPF ma wydarzenie "RowEditEnding", ale muszę uruchomić to zdarzenie po tym, jak Row uruchomił się, aby sprawdzić, czy nowo dodany wiersz jest zduplikowany i scalić zduplikowany wiersz. Mój datagrid ma właściwość "CanUserAddRow" ustawioną na True.WPF Datagrid Row Edycja "ZAKOŃCZONO" zdarzenie

Używam EntityObservableCollection, która rozszerza ObservableCollection, aby zsynchronizować mój podmiot z kolekcją. Tak więc, rozważałem zdarzenie OnCollectionChanged, ale zdarzenie "InsertItem" jest podnoszone, gdy użytkownik kliknie na nowy wiersz pozycji przedmiotu, co oznacza, że ​​obiekt jest nadal pusty i nie mogę sprawdzić jego duplikacji.

Czy istnieje możliwość podniesienia zdarzenia RowEditEnded?

Dzięki ...

+0

Nie może mieć jakieś zdarzenie sprawdzające. możesz to sprawdzić przez jakiś czas. – Sankarann

+0

Naprawdę starałeś się wyglądać wystarczająco na CollectionChanged? Czeki wewnątrz mogą informować o tym, kiedy element rzeczywiście jest wstawiany lub aktualizowany, aby można było sprawdzić za każdym razem i czy wypełnione pola THEN wykonują logikę zmiany: http://stackoverflow.com/questions/4587448/collectionchanged-sample. Poprawiłem @Mah zanim zdałem sobie sprawę z ograniczeń tego podejścia (przełączanie uchwytów, następnie wymuszanie zatwierdzania i odświeżania i ect), i myślę więcej na temat kolekcji wymiennej (ale nie mogę teraz usunąć upvote). –

Odpowiedz

0

Spróbuj ustawić funkcję CommitEdit() do DataGrid. Użyłem go tutaj:

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

Zastanawiam się, dlaczego znajdujesz sposób na podniesienie zdarzenia RowEditEnded; jeśli jesteś Wykonaj zdarzenie RowEditEnding datagridu; za każdym razem, gdy edytujesz wiersz i zmienisz fokus z tego wiersza, wiersz zostanie zatwierdzony, a RowEditEnding zostanie podniesiony;

po tym, gdy RowEdit RowEditEnding zostanie zatwierdzony, zostanie podniesiony i będzie działać tak samo jak RowEditEnded;

Czy rozumiem, że coś jest nie tak z twojego tekstu?

2

znalazłem odpowiedzi na swoje pytanie usingVS2010

stan if (e.EditAction == DataGridEditAction.Commit) w RowEditEnding spełni ur wymóg

proszę zobaczyć poniższy kod.

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

To jest Xaml za.

<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

To powinno być wybrane jako zaakceptowana odpowiedź. Dzięki, Maher Ben Issa! –

+0

działa to idealnie dla mnie, ale czy jest to najlepsza odpowiedź? czy to jest zoptymalizowany kod? – Mamad

+0

i inne pytanie, co o CellEndEdit mam ten sam problem z CellEndEdit. – Mamad

0

VB.NET rozwiązanie do rozwiązania @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

Biorąc od @ odpowiedź MaherBenIssa za użyłem tego uniknąć dodawania i usuwania Delegat:

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