2011-07-13 53 views
0

我有一個CollectionViewSource(cvs),它具有強類型的DataTable作爲源。 Cvs.View被設置爲DataGrid的ItemsSource。我想根據DataGrid中的更改更新,插入和刪除數據庫中的數據。我已成功完成更新,我有一個想法刪除,但插入我有一些問題。我試圖通過處理cvs.View的CurrentChanging事件來做到這一點,但行狀態總是Detached,它應該被添加。這是我的代碼:檢查在CollectionViewSource中是否有新行

private void View_CurrentChanging(object sender, CurrentChangingEventArgs e) 
{ 
    if (cvs.View.CurrentItem != null) 
    { 
     var dataRow = ((cvs.View.CurrentItem as DataRowView).Row) as MyDataSet.MyTableRow; 
     if (dataRow.HasChanges()) 
     { 
      //do update - works 
     } 
     dataRow.EndEdit(); // without this line RowState is Unchanged when it should be Added 
     if (dataRow.RowState == DataRowState.Added) 
     { 
      //do insert - never goes here, RowState is Detached when it should be Added 
     } 
    } 
} 

這是正確的方法嗎?我錯過了什麼嗎?提前致謝。

編輯:DataGrid的結合:

dataGrid1.ItemsSource = cvs.View; 
+0

請離開CollectionViewSource東西出來的你的代碼,只是儘量設置itemssource指向你的DataTable。 – blindmeis

回答

1

我用我的WPF應用程序下面這樣的:當你做一個插入,更新或刪除您的DataTable

this.MyView = (BindingListCollectionView)CollectionViewSource.GetDefaultView(this.MyDataTable); 

據其自動反映在你的View/Datagrid中。

編輯:MyView的是你綁定到數據網格在你的用戶界面查看

private BindingListCollectionView _view; 

public BindingListCollectionView MyView 
{ 
    get { return this._view; } 
    protected set 
    { 
     this._view = value; 
     this.NotifyPropertyChanged(() => this.MyView); 
    } 
} 

XAML

<DataGrid ItemsSource="{Binding Path=MyView, Mode=OneWay, ValidatesOnDataErrors=true, ValidatesOnExceptions=true}" /> 
+0

我不明白這是什麼。我在這裏查看。 – Vale

+0

看到我的編輯。你不需要聽取你觀點中不斷變化的事件。 – blindmeis

+0

我理解它的大部分,但我得到一個異常行this.NotifyPropertyChanged(()=> this.MyView); - MainWindow不包含NotifyProperyChanged的定義 – Vale

0

這是一個老的文章,但我有另一種解決方案,我認爲:

RowState="{Binding CurrentItem.Row.RowState}" 

RowState是我的控件中的一個依賴項屬性,類型爲DataRowState。

正確初始化新行也是必要的!對於我的作品(我認爲也爲他人):

DataRowView rv = dv.AddNew(); 
rv.EndEdit(); 

希望這可以幫助別人!

0

我遇到了同樣奇怪的行爲。如果數據行被分離並且從BindingSource.Item(即datarowview)獲得該行,則將EndEdit調用到該行不會將該行添加到該表中。所以作爲一個解決方法。

與其說DataRow.EndEdit先檢查數據行的RowState的,如果脫離然後手動將其添加到表即: -

If Row.RowState=DataRowState.Detached Then 
    Row.Table.Rows.Add(Row) 
Else 
    Row.EndEdit 
End If