0

ソースとしてDataTableを強く型付けしたCollectionViewSource(cvs)があります。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に挿入、更新、または削除を行う限り、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}" />
于 2011-07-13T06:35:19.603 に答える
0

これは古い投稿ですが、別の解決策があると思います。

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

RowStateは、DataRowStateタイプのコントロールの依存関係プロパティです。

新しい行を正しく初期化することも必要です!私にとっては作品です(そして私は他の人にとってもそう思います):

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

これが誰かに役立つことを願っています!

于 2013-01-04T10:24:58.353 に答える
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 に答える