2010-10-14 15 views
21

Sé que la cuadrícula de datos WPF tiene evento "RowEditEnding", pero necesito activar el evento después de que la fila se haya conectado para verificar si la fila recién agregada está duplicada y fusionar la fila duplicada. Mi cuadrícula de datos tiene la propiedad "CanUserAddRow" establecida en True.WPF Datagrid Fila Edición evento "ENDED"

Estoy utilizando EntityObservableCollection que extiende ObservableCollection para sincronizar mi entidad con la colección. Por lo tanto, consideré el evento OnCollectionChanged, pero el evento "InsertItem" se plantea una vez que el usuario hace clic en la nueva fila del marcador de posición del elemento, lo que significa que el objeto todavía está vacío y no puedo verificar si hay duplicados.

¿Hay alguna forma de que pueda generar el evento RowEditEnded?

Gracias ...

+0

Hay podría tener algún evento de validación Puedes verificar eso por un tiempo. – Sankarann

+0

¿Realmente intentabas mirar lo suficiente en CollectionChanged? Los controles en el interior podrían permitirle saber cuándo el elemento se insertó o actualizó realmente, para que pueda verificar cada vez y si los campos rellenos LUEGO ejecutan la lógica de cambio: http://stackoverflow.com/questions/4587448/collectionchanged-sample. Volví a subir @Mah antes de darme cuenta de las limitaciones de ese enfoque (alternar manejadores y luego forzar commit y refresh y ect), y pensé más en collectionchanged (pero no puedo eliminar upvote ahora) –

Respuesta

0

intente configurar la función CommitEdit() para su cuadrícula de datos. Lo usé aquí:

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

Me pregunto por qué está encontrando la manera de plantear el evento RowEditEnded; si Implementa el evento RowEditEnding de la cuadrícula de datos; cada vez que edite una fila y cambie el foco de esa fila, la fila se confirmará y se generará RowEditEnding;

así que después de que la fila haya confirmado RowEditEnding se levantará y funcionará como RowEditEnded;

¿He entendido algo mal de su texto?

2

encontré una respuesta a su pregunta usingVS2010

condición si (== e.EditAction DataGridEditAction.Commit) en el RowEditEnding cumplirá el requisito del ur

Por favor, vea el código de abajo.

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

Este es el 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

Esto debería seleccionarse como la respuesta aceptada. Gracias Maher Ben Issa! –

+0

me funciona a la perfección pero ¿es esta la mejor respuesta? ¿Es este un código optimizado? – Mamad

+0

y otra pregunta ¿qué pasa con CellEndEdit tengo el mismo problema con CellEndEdit. – Mamad

0

solución de VB.NET a la solución 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

Tomando de @ respuesta de MaherBenIssa, que utiliza esto para evitar añadir y eliminar delegado:

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