본문 바로가기
개발언어/C#

[C#] listview 마우스 끌어올때 (Drag & Drop) 놓을위치 표시

by 창용이랑 2022. 8. 23.
728x90

ListView.InsertionMark 속성

  • 참조
 

정의

네임스페이스:System.Windows.Forms어셈블리:System.Windows.Forms.dll

ListView 컨트롤 안에서 항목을 끌 때 예상되는 놓을 위치를 나타내는 데 사용되는 개체를 가져옵니다.

[System.ComponentModel.Browsable(false)]
public System.Windows.Forms.ListViewInsertionMark InsertionMark { get; }

속성 값

ListViewInsertionMark

삽입 표시를 나타내는 ListViewInsertionMark 개체입니다.

특성

예제

다음 코드 예제에서는 삽입 표시 기능을 사용 ListView 하는 방법을 보여 줍니다. 이 예제에서는 표준 끌기 이벤트를 사용하여 끌어서 놓기 항목 다시 정렬을 구현합니다. 삽입 표시의 위치에 대 한 처리기에서 업데이트 되는 Control.DragOver 이벤트입니다. 이 처리기에서 가장 가까운 항목의 중간점 마우스 포인터의 위치를 비교 하 고 결과 삽입 표시가 항목의 오른쪽 또는 왼쪽에 표시 되는지 여부를 확인 하려면 사용 됩니다.

 

using System;
using System.Drawing;
using System.Windows.Forms;

public class ListViewInsertionMarkExample : Form
{
    private ListView myListView; 

    public ListViewInsertionMarkExample()
    {
        // Initialize myListView.
        myListView = new ListView();
        myListView.Dock = DockStyle.Fill;
        myListView.View = View.LargeIcon;
        myListView.MultiSelect = false;
        myListView.ListViewItemSorter = new ListViewIndexComparer();

        // Initialize the insertion mark.
        myListView.InsertionMark.Color = Color.Green;

        // Add items to myListView.
        myListView.Items.Add("zero");
        myListView.Items.Add("one");
        myListView.Items.Add("two");
        myListView.Items.Add("three");
        myListView.Items.Add("four");
        myListView.Items.Add("five");
        
        // Initialize the drag-and-drop operation when running
        // under Windows XP or a later operating system.
        if (OSFeature.Feature.IsPresent(OSFeature.Themes))
        {
            myListView.AllowDrop = true;
            myListView.ItemDrag += new ItemDragEventHandler(myListView_ItemDrag);
            myListView.DragEnter += new DragEventHandler(myListView_DragEnter);
            myListView.DragOver += new DragEventHandler(myListView_DragOver);
            myListView.DragLeave += new EventHandler(myListView_DragLeave);
            myListView.DragDrop += new DragEventHandler(myListView_DragDrop);
        }

        // Initialize the form.
        this.Text = "ListView Insertion Mark Example";
        this.Controls.Add(myListView);
    }

    [STAThread]
    static void Main() 
    {
        Application.EnableVisualStyles();
        Application.Run(new ListViewInsertionMarkExample());
    }

    // Starts the drag-and-drop operation when an item is dragged.
    private void myListView_ItemDrag(object sender, ItemDragEventArgs e)
    {
        myListView.DoDragDrop(e.Item, DragDropEffects.Move);
    }

    // Sets the target drop effect.
    private void myListView_DragEnter(object sender, DragEventArgs e)
    {
        e.Effect = e.AllowedEffect;
    }

    // Moves the insertion mark as the item is dragged.
    private void myListView_DragOver(object sender, DragEventArgs e)
    {
        // Retrieve the client coordinates of the mouse pointer.
        Point targetPoint = 
            myListView.PointToClient(new Point(e.X, e.Y));

        // Retrieve the index of the item closest to the mouse pointer.
        int targetIndex = myListView.InsertionMark.NearestIndex(targetPoint);

        // Confirm that the mouse pointer is not over the dragged item.
        if (targetIndex > -1) 
        {
            // Determine whether the mouse pointer is to the left or
            // the right of the midpoint of the closest item and set
            // the InsertionMark.AppearsAfterItem property accordingly.
            Rectangle itemBounds = myListView.GetItemRect(targetIndex);
            if ( targetPoint.X > itemBounds.Left + (itemBounds.Width / 2) )
            {
                myListView.InsertionMark.AppearsAfterItem = true;
            }
            else
            {
                myListView.InsertionMark.AppearsAfterItem = false;
            }
        }

        // Set the location of the insertion mark. If the mouse is
        // over the dragged item, the targetIndex value is -1 and
        // the insertion mark disappears.
        myListView.InsertionMark.Index = targetIndex;
    }

    // Removes the insertion mark when the mouse leaves the control.
    private void myListView_DragLeave(object sender, EventArgs e)
    {
        myListView.InsertionMark.Index = -1;
    }

    // Moves the item to the location of the insertion mark.
    private void myListView_DragDrop(object sender, DragEventArgs e)
    {
        // Retrieve the index of the insertion mark;
        int targetIndex = myListView.InsertionMark.Index;

        // If the insertion mark is not visible, exit the method.
        if (targetIndex == -1) 
        {
            return;
        }

        // If the insertion mark is to the right of the item with
        // the corresponding index, increment the target index.
        if (myListView.InsertionMark.AppearsAfterItem) 
        {
            targetIndex++;
        }

        // Retrieve the dragged item.
        ListViewItem draggedItem = 
            (ListViewItem)e.Data.GetData(typeof(ListViewItem));

        // Insert a copy of the dragged item at the target index.
        // A copy must be inserted before the original item is removed
        // to preserve item index values. 
        myListView.Items.Insert(
            targetIndex, (ListViewItem)draggedItem.Clone());

        // Remove the original copy of the dragged item.
        myListView.Items.Remove(draggedItem);
    }

    // Sorts ListViewItem objects by index.
    private class ListViewIndexComparer : System.Collections.IComparer
    {
        public int Compare(object x, object y)
        {
            return ((ListViewItem)x).Index - ((ListViewItem)y).Index;
        }
    }
}

설명

ListView 삽입 표시 기능을 사용하면 항목을 새 위치로 끌 때 끌어서 놓기 작업에서 예상되는 놓기 위치를 시각적으로 나타낼 수 있습니다. 이 기능은 경우에만 작동 합니다 AutoArrange 속성이로 설정 되어 true 및 시기를 ListView 컨트롤 항목을 자동으로 정렬 되지 않습니다. 자동 정렬 방지 하기 위해 합니다 Sorting 속성으로 설정 되어 있어야 SortOrder.None  View 속성 설정 해야 합니다 View.LargeIcon, View.SmallIcon, 또는 View.Tile합니다. 또한 그룹화 기능이 그룹 멤버 자격별로 항목을 정렬하므로 그룹화 기능과 함께 ListView 삽입 표시 기능이 표시되지 않을 수 있습니다.

ListViewInsertionMark 클래스에 대 한 처리기에서 일반적으로 사용 됩니다 합니다 Control.DragOver 또는 Control.MouseMove 이벤트 항목을 끄는 대로 삽입 표시의 위치를 업데이트 합니다. 에 대 한 처리기에서 사용 되는 합니다 Control.DragDrop 또는 Control.MouseUp 끌어 온된 항목을 올바른 위치에 삽입 하는 이벤트입니다. 자세한 내용은 참조 ListViewInsertionMark  방법: Windows Forms ListView 컨트롤에 삽입 표시를 표시 합니다.

 참고

삽입 표시 기능은 Windows XP 및 Windows Server 2003에만 사용할 수 있는 애플리케이션 호출을 Application.EnableVisualStyles 메서드. 이전 버전의 운영 체제에서는 삽입 표시와 관련된 코드가 아무 효과도 없으며 삽입 표시가 나타나지 않습니다. 따라서 삽입 표시 기능에 의존하는 코드가 제대로 작동하지 않을 수 있습니다. 이 기능을 사용할 수 있는지 여부를 결정하는 코드를 포함하고 사용할 수 없는 경우 대체 기능을 제공할 수 있습니다. 예를 들어 삽입 표시를 지원하지 않는 운영 체제에서 실행할 때 끌어서 놓기 항목 위치를 구현하는 모든 코드를 무시할 수 있습니다.

삽입 표시 기능은 운영 체제 테마 기능을 제공 하는 라이브러리에서 제공 됩니다. 이 라이브러리의 가용성을 확인 하려면 호출을 FeatureSupport.IsPresent(Object) 메서드 오버 로드 하 고 전달 합니다 OSFeature.Themes 값입니다.

적용 대상

제품버전.NET FrameworkWindows Desktop
2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8
3.0, 3.1, 5, 6, 7 Preview 7

추가 정보

출처 : 

https://docs.microsoft.com/ko-kr/dotnet/api/system.windows.forms.listview.insertionmark?view=windowsdesktop-6.0