检查CollectionViewSource中的行是否为新的

时间:2011-07-13 06:28:15

标签: c# .net wpf collectionviewsource rowstate

我有一个CollectionViewSource(cvs),它强烈地键入了DataTable作为它的源代码。 Cvs.View被设置为DataGrid的ItemsSource。我想根据DataGrid中的更改来更新,插入和删除数据库中的数据。我已成功完成更新,我有删除的想法,但对于插入我有一些问题。我试图通过处理cvs.View的CurrentChanging事件来做到这一点,但行状态总是分离的,它应该是添加的。这是我的代码:

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;

3 个答案:

答案 0 :(得分:1)

我在我的wpf应用程序中使用以下内容:

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

只要您对DataTable进行插入,更新或删除,它就会自动反映在您的View / Datagrid中。

编辑:MyView是您在UI中绑定到DataGrid的视图

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

答案 1 :(得分:0)

这是一篇较老的帖子,但我认为还有另一种解决方案:

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

RowState是我的Control中的依赖项属性,类型为DataRowState。

正确初始化新行也是必要的!对我而言(我认为对其他人也有):

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

希望这有助于某人!

答案 2 :(得分:0)

我遇到了同样奇怪的行为。如果分离数据行并从BindingSource.Item(即datarowview)获取行,则将EndEdit调用到该行不会将该行添加到表中。所以作为一种解决方法。

不是调用DataRow.EndEdit而是首先检查数据行的RowState,如果已分离,则手动将其添加到表中,即: -

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