첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.

728x90
반응형
728x170

TestProject.zip
다운로드

▶ MainForm.cs

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

namespace TestProject
{
    /// <summary>
    /// 메인 폼
    /// </summary>
    public partial class MainForm : Form
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - MainForm()

        /// <summary>
        /// 생성자
        /// </summary>
        public MainForm()
        {
            InitializeComponent();

            Load                         += Form_Load;
            this.animalListBox.MouseDown += listBox_MouseDown;
            this.animalListBox.DragEnter += listBox_DragEnter;
            this.animalListBox.DragOver  += listBox_DragOver;
            this.animalListBox.DragDrop  += listBox_DragDrop;
            this.foodListBox.MouseDown   += listBox_MouseDown;
            this.foodListBox.DragEnter   += listBox_DragEnter;
            this.foodListBox.DragOver    += listBox_DragOver;
            this.foodListBox.DragDrop    += listBox_DragDrop;
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region 폼 로드시 처리하기 - Form_Load(sender, e)

        /// <summary>
        /// 폼 로드시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void Form_Load(object sender, EventArgs e)
        {
            this.animalListBox.AllowDrop = true;
        }

        #endregion
        #region 리스트 박스 마우스 DOWN 처리하기 - listBox_MouseDown(sender, e)

        /// <summary>
        /// 리스트 박스 마우스 DOWN 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void listBox_MouseDown(object sender, MouseEventArgs e)
        {
            ListBox listBox = sender as ListBox;

            if(e.Button != MouseButtons.Right)
            {
                return;
            }

            int index = listBox.IndexFromPoint(e.Location);

            listBox.SelectedIndex = index;

            if(index < 0)
            {
                return;
            }

            DragItem dragItem = new DragItem(listBox, index, listBox.Items[index]);

            listBox.DoDragDrop(dragItem, DragDropEffects.Move);
        }

        #endregion
        #region 리스스 박스 드래그 진입시 처리하기 - listBox_DragEnter(sender, e)

        /// <summary>
        /// 리스스 박스 드래그 진입시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void listBox_DragEnter(object sender, DragEventArgs e)
        {
            ListBox listBox = sender as ListBox;

            if(!e.Data.GetDataPresent(typeof(DragItem)))
            {
                e.Effect = DragDropEffects.None;
            }
            else if((e.AllowedEffect & DragDropEffects.Move) == 0)
            {
                e.Effect = DragDropEffects.None;
            }
            else
            {
                DragItem dragItem = (DragItem)e.Data.GetData(typeof(DragItem));

                if(dragItem.ListBox != listBox)
                {
                    e.Effect = DragDropEffects.None;
                }
                else
                {
                    e.Effect = DragDropEffects.Move;
                }
            }
        }

        #endregion
        #region 리스트 박스 드래그 오버시 처리하기 - listBox_DragOver(sender, e)

        /// <summary>
        /// 리스트 박스 드래그 오버시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void listBox_DragOver(object sender, DragEventArgs e)
        {
            if(e.Effect != DragDropEffects.Move)
            {
                return;
            }

            ListBox listBox = sender as ListBox;

            listBox.SelectedIndex = listBox.GetIndexFromScreenPoint(new Point(e.X, e.Y));
        }

        #endregion
        #region 리스트 박스 드래그 DROP 처리하기 - listBox_DragDrop(sender, e)

        /// <summary>
        /// 리스트 박스 드래그 DROP 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void listBox_DragDrop(object sender, DragEventArgs e)
        {
            ListBox listBox = sender as ListBox;

            DragItem dragItem = (DragItem)e.Data.GetData(typeof(DragItem));

            int newIndex = listBox.GetIndexFromScreenPoint(new Point(e.X, e.Y));

            if(newIndex == -1)
            {
                newIndex = listBox.Items.Count - 1;
            }

            listBox.Items.RemoveAt(dragItem.Index);

            listBox.Items.Insert(newIndex, dragItem.Item);

            listBox.SelectedIndex = newIndex;
        }

        #endregion
    }
}
728x90
반응형
그리드형(광고전용)
Posted by icodebroker

댓글을 달아 주세요