0

我有一个 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;
4

3 回答 3

1

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

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

就您对 DataTable 执行插入、更新或删除操作而言,它会自动反映在您的视图/数据网格中。

编辑: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}" />
于 2011-07-13T06:35:19.603 回答
0

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

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

If Row.RowState=DataRowState.Detached Then
  Row.Table.Rows.Add(Row)
Else
  Row.EndEdit
End If
于 2013-10-09T19:51:16.760 回答
0

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

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

RowState 是我的控件中的一个依赖属性,类型为 DataRowState。

还需要正确初始化新行!对我有用(我也认为对其他人有用):

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

希望这对某人有帮助!

于 2013-01-04T10:24:58.353 回答