web-dev-qa-db-ja.com

WPFデータグリッド行編集「ENDED」イベント

WPFデータグリッドに「RowEditEnding」イベントがあることは知っていますが、行がコミットされた後にイベントを発生させて、新しく追加された行が重複しているかどうかを確認し、重複した行をマージする必要があります。私のデータグリッドでは、「CanUserAddRow」プロパティがTrueに設定されています。

ObservableCollectionを拡張するEntityObservableCollectionを使用して、エンティティをコレクションと同期しています。そこで、OnCollectionChangedイベントを検討しましたが、ユーザーが新しいアイテムのプレースホルダー行をクリックすると「InsertItem」イベントが発生します。つまり、オブジェクトはまだ空であり、重複を確認できません。

とにかく、RowEditEndedイベントを発生させることができますか?

ありがとう...

30
Alex
    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
    }
26
Maher Ben Issa

VS2010を使用してあなたの質問に対する答えを見つけました

RowEditEndingの(e.EditAction == DataGridEditAction.Commit)がur要件を満たす場合の条件

以下のコードをご覧ください。

private void dataGrid1_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
{
    if (e.EditAction == DataGridEditAction.Commit)
    {
        MessageBox.Show("asd");
    }
}

これはXamlBehindです。

<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>
2
M Usman Shahid

@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
            }
        }
    }
1
Ozzy

たぶん、あなたはイベント「CurrentCellChanged」を使うことができます。これは、セルの編集を開始したときにも発生しますが、メソッドで実行したいすべてのことを常に実行できるとは限らない方法を見つけることができるかもしれません。

データグリッドの変更が実際に元の値に変更されているかどうかを確認したいときに、同じ問題が発生しました。このイベントは私のニーズに合っています。

私があなたに何か新しいことを言うことができることを願っています。

0
byMuchi

データグリッドのプロパティメンバーのバインディングにUpdateSourceTrigger=PropertyChangedを使用できます。これにより、CellEditEndingが起動されたときに、更新が監視可能なコレクションにすでに反映されていることが保証されます。この投稿を参照してください https://stackoverflow.com/a/27239243/9285072

0

データグリッドのCommitEdit()関数を設定してみてください。私はここでそれを使用しました:

private void DataGrid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
{
    this.MyDataGrid.CommitEdit(DataGridEditingUnit.Row, false);
}
0
allthingscs

@MaherBenIssaのソリューションに対するVB.NETソリューション

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
DrMarbuse

RowEditEndedイベントを発生させる方法を見つけているのはなぜだろうか。もしあなたがRowEditEndingイベントを実装するデータグリッドの;行を編集してその行からフォーカスを変更すると、その行がコミットされ、RowEditEndingが発生します。

したがって、Rowがコミットした後、RowEditEndingが発生し、RowEditEndedと同じように機能します。

私はあなたのテキストから何か間違ったことを理解しましたか?

0