/// <summary> /// 項目をドロップしたときの処理 /// </summary> /// <param name="e"></param> protected override void OnDragDrop(DragEventArgs e) { base.OnDragDrop(e); // ドラッグアンドドロップによる項目入れ替えが許可されていなければ何もしない if (!AllowItemReorder) { return; } // 自分自身の項目でなければドロップを許可しない ExtendedListBox listBox = e.Data.GetData(typeof(ExtendedListBox)) as ExtendedListBox; if (listBox != this) { return; } // 挿入位置に項目がなければドロップを許可しない Point p = PointToClient(new Point(e.X, e.Y)); int index = IndexFromPoint(p); if (index < 0) { _dragPoint = Point.Empty; DragIndices.Clear(); return; } // 挿入位置の項目がドラッグ対象ならばドロップを許可しない if (DragIndices.Contains(index)) { return; } // イベントハンドラを呼び出す ItemReorderedEventArgs re = new ItemReorderedEventArgs(DragIndices, index); ItemReordered?.Invoke(this, re); if (re.Cancel) { // ドラッグ状態を解除する _dragPoint = Point.Empty; DragIndices.Clear(); return; } // リストボックスの項目を移動する foreach (int dragIndex in DragIndices) { Items.Insert(index, Items[dragIndex]); if (index < dragIndex) { Items.RemoveAt(dragIndex + 1); index++; } else { Items.RemoveAt(dragIndex); } } // ドラッグ状態を解除する _dragPoint = Point.Empty; DragIndices.Clear(); }
/// <summary> /// 項目をドロップしたときの処理 /// </summary> /// <param name="e"></param> protected override void OnDragDrop(DragEventArgs e) { base.OnDragDrop(e); // ドラッグアンドドロップによる項目入れ替えが許可されていなければ何もしない if (!AllowItemReorder) { return; } // 自分自身の項目でなければドロップを許可しない ExtendedListView listView = e.Data.GetData(typeof(ExtendedListView)) as ExtendedListView; if (listView != this) { return; } // 挿入位置を計算する int index = InsertionMark.Index; if (index < 0) { return; } if (InsertionMark.AppearsAfterItem) { index++; } // イベントハンドラを呼び出す ItemReorderedEventArgs re = new ItemReorderedEventArgs(DragIndices, index); ItemReordered?.Invoke(this, re); if (re.Cancel) { // ドラッグ状態を解除する DragIndices.Clear(); return; } // リストビューの項目を移動する ListViewItem firstItem = null; foreach (int dragIndex in DragIndices) { ListViewItem item = (ListViewItem)Items[dragIndex].Clone(); if (firstItem == null) { firstItem = item; } Items.Insert(index, item); if (index < dragIndex) { Items.RemoveAt(dragIndex + 1); index++; } else { Items.RemoveAt(dragIndex); } } // 移動先の項目を選択する if (firstItem != null) { firstItem.Selected = true; firstItem.Focused = true; EnsureVisible(firstItem.Index); } // ドラッグ状態を解除する DragIndices.Clear(); }