2010-10-14 88 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 
      } 
     } 
    }