В ответ на комментарий MAW74656 к вопросу о том, что я собрал метод, который я использовал бы, если бы собирался подключить несколько сеток для выполнения перетаскивания.
По сути, я стараюсьсоздать лямбду, чтобы сгруппировать все эти функциональные возможности внутри одного метода - это можно сделать как собственный метод, если необходимо разрешить несколько вызывающих абонентов.
Вот оно:
Func<DataGridView, IEnumerable<Action>> configureDragDrop = grid =>
{
var dataTable = grid.DataSource as DataTable;
/* Event handler definitions here - see below */
grid.MouseDown += mds;
grid.DragEnter += des;
grid.DragDrop += dds;
return new Action[]
{
() => grid.MouseDown -= mds,
() => grid.DragEnter -= des,
() => grid.DragDrop -= dds,
};
};
Этот код позволяет мне написать это:
// form-level field
private List<Action> removeHandlers = new List<Action>();
// in the method where `configureDragDrop` is defined
removeHandlers.AddRange(configureDragDrop(gridPODetails));
removeHandlers.AddRange(configureDragDrop(dataGridView1));
removeHandlers.AddRange(configureDragDrop(dataGridView2));
removeHandlers.AddRange(configureDragDrop(dataGridView3));
removeHandlers.AddRange(configureDragDrop(dataGridView4));
removeHandlers.AddRange(configureDragDrop(dataGridView5));
removeHandlers.AddRange(configureDragDrop(dataGridView6));
removeHandlers.AddRange(configureDragDrop(dataGridView7));
// etc
Когда я закрываю свою форму, я могу удалить все обработчики в одну строку:
Array.ForEach(removeHandlers.ToArray(), rh => rh.Invoke());
Внешний вид обработчиков событийочень похоже на исходный код - только сейчас в лямбда-форме.
MouseDown
:
MouseEventHandler mds = (smd, emd) =>
{
var info = grid.HitTest(emd.X, emd.Y);
if (info.RowIndex >= 0)
{
var dr = dataTable.Rows[info.RowIndex];
if (dr != null)
{
grid.DoDragDrop(dr, DragDropEffects.Copy);
}
}
};
DragEnter
:
DragEventHandler des = (sde, ede) =>
{
ede.Effect = DragDropEffects.Copy;
};
DragDrop
:
DragEventHandler dds = (sdd, edd) =>
{
var dr = edd.Data.GetData(typeof(DataRow)) as DataRow;
if (dr != null)
{
var dst = dataTable;
var src = dr.Table;
if (dst != src)
{
dst.ImportRow(dr);
dr.Delete();
src.AcceptChanges();
dst.AcceptChanges();
}
}
};
Надеюсь, это поможет.