0

私はしばらくの間変更されたものをいつでも検出DataGridViewRowDataGridViewできるようなメカニズムを探していましたが、DataGridViewこれを行う簡単な方法がない場合は。そして、私はこの実装を行いました

public partial class MyDatagrid : DataGridView
{
    public event EventHandler<RowChangingArgs> RowUpdating; 
    public MyDatagrid()
    {
        InitializeComponent();
        this.CellBeginEdit += OnCellBeginEdit;
    }

    private DataGridViewRow oldRow;
    private int currentRow;
    private void OnCellBeginEdit(object sender, DataGridViewCellCancelEventArgs args)
    {
        if(oldRow == null || currentRow != args.RowIndex)
        {
            if(currentRow != args.RowIndex && oldRow != null)
            {
                var newRow = this.Rows[args.RowIndex];
                foreach (var cell in oldRow.Cells)
                {
                    foreach (var cell1 in newRow.Cells.Cast<object>().Where(cell1 => !cell.Equals(cell1)))
                    {
                        if(RowUpdating!= null)
                           RowUpdating.Invoke(this, new RowChangingArgs { OldRow = oldRow, NewRow = newRow});
                        oldRow.Dispose();
                        goto called;
                    }
                }
            }
            called:
            oldRow = this.Rows[args.RowIndex].Clone() as DataGridViewRow;
            currentRow = args.RowIndex;
        }
    }

    public class RowChangingArgs : EventArgs
    {
        public DataGridViewRow OldRow { get; set; }
        public DataGridViewRow NewRow { get; set; }
    }
}

例:
ユーザーが行1と列1を編集し、同じ行からn列を編集し続けます。ユーザーが他の行の編集を開始します。行1の古いコンテンツと行1の新しいコンテンツでイベントを発生させます。

これはこれを行うための良い方法ですか、それとも私は何かを逃しましたか?

4

3 に答える 3

1

これを試していただけませんか:

    public string origData { get; set; }


    private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
    {
        if (e.ColumnIndex == 1)
            origData = dataGridView1[e.ColumnIndex, e.RowIndex].EditedFormattedValue.ToString().Trim(); //Get the original data
    }

    private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
    {
        if (dataGridView1.IsCurrentCellDirty)
        {
            if (e.ColumnIndex == 1)
            {
                if (origData != dataGridView1[e.ColumnIndex, e.RowIndex].EditedFormattedValue.ToString().Trim()) //If not equal to original data will trigger
                {
                    //Do stuff
                }
            }
        }
    }
于 2013-02-18T18:04:48.377 に答える
1

別のオプション...データが「DataTable」または「DataView」からのものである場合(バックエンドからのクエリ結果など)、グリッドのバインドされたデータソースはDataViewのものである可能性があります。

この場合、いつでも、テーブルコントロール管理のイベントハンドラーから、columnChangingイベントまたはcolumnChangedイベント...のどちらかを探している(変更前/変更後の値)を介して直接取得できます。

その場合、テーブルレベルで、データがクエリされ、グリッドポピュレーションに入力された後、次のことができます...

YourDataTable.ColumnChanging += MyColumnChanging;

次に、メソッドがあります...

private void MyColumnChanging(object sender, DataColumnChangeEventArgs e)
{
   // just to enforce column name representation, forcing to lower
   string colName = e.Column.ColumnName.ToLower();

   // e.Row has the row that had the change for you to work with, validate, etc...

   switch (colName)
   {
      case "yourcolumnfieldx":
         doSomething;
         break;

      case "anotherfield":
         doSomethingElse;
         break;
   }
}
于 2013-02-18T18:34:12.867 に答える
0

さてあなたは他よりも速いこれを使うことができます。DataGridViewのCellEndEditイベントを使用する

        private void datagridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            updateCounter();
        }
于 2019-07-10T18:35:08.437 に答える