2010-10-14 86 views
21

我知道WPF datagrid具有“RowEditEnding”事件,但我需要在行已编译后检查是否重复添加新行并合并重复行。我的datagrid具有“CanUserAddRow”属性设置为True。WPF Datagrid行编辑“已结束”事件

我正在使用EntityObservableCollection扩展ObservableCollection来同步我的实体与集合。所以,我考虑了OnCollectionChanged事件,但是一旦用户点击新的项目占位符行,就会引发“InsertItem”事件,这意味着对象仍然是空的,我不能检查重复。

有无论如何我可以提高RowEditEnded事件?

谢谢...

+0

有可能有一些验证事件。你可以检查一下。 – Sankarann 2013-07-26 09:24:37

+0

你真的试图在CollectionChanged看足够吗?检查里面可以让你知道什么时候项目实际插入或更新,所以你可以检查每一次,如果字段填写然后执行更改逻辑:http://stackoverflow.com/questions/4587448/collectionchanged-sample。在我意识到这种方法的局限性(切换句柄,然后强制执行提交和刷新等)之前,我提高了@Mah,并且对collectionchanged进行了更多的思考(但是现在不能删除upvote) – 2015-10-15 05:23:22

回答

0

尝试为您的数据网格设置CommitEdit()函数。我在这里使用它:

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

我想知道为什么你找到方法来提高RowEditEnded事件; 如果你执行datagrid的RowEditEnding事件;每当你编辑一行并改变该行的焦点时,该行将被提交并且RowEditEnding将被提升;

所以在Row已经提交之后RowEditEnding会被引发并像RowEditEnded一样工作;

我从您的文本中了解错误吗?

2

我发现一个回答你的问题usingVS2010

条件,如果(e.EditAction == DataGridEditAction.Commit)在RowEditEnding将满足乌尔要求

请参阅下面的代码。

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

这是Xaml的背后。

<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

这应该被选为接受的答案。感谢Maher Ben Issa! – 2014-12-01 13:10:30

+0

它适用于我,但这是最好的答案?这是一个优化的代码? – Mamad 2017-01-30 12:23:18

+0

和另一个问题CellEndEdit我有与CellEndEdit相同的问题。 – Mamad 2017-01-30 12:41:23

0

VB.NET解决@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

从@ MaherBenIssa的答案考虑的解决方案,我用这个来避免添加和删除委托:

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