2009-11-30 6 views
3

두 개의 목록 상자와 지금까지 본 모든 예제에서 끌어서 놓기를 구현하려고하면 실제로 좋은 냄새가 나지 않습니다.두 개의 목록 상자 사이에서 드래그 앤 드롭

다른 사람이 나를 올바르게 구현하도록 안내하거나 표시 할 수 있습니까?

+3

"정말 좋은 냄새가 나지 않습니다." 밝히다. – MiffTheFox

+1

코드 냄새에 대해 들어 본 적이 없습니까? ;) – Jrud

+1

나는이 파티에 3 년이나 늦었지만 Wikipedia에서 코드 냄새에 대해 말하고있는 점에 감사한다. http://en.wikipedia.org/wiki/Code_smell – Surfbutler

답변

3

this을 보았습니까?

+0

같은 웹 사이트의 다른 예 : https://www.codeproject.com/Articles/36412/Drag-and-Drop-ListBox – sorifiend

1

.net에서 끌어서 놓기 컨트롤을 수행하는 적절한 방법은 두 번째 컨트롤의 DragDrop 이벤트 처리기에서 코드를 실행하는 것입니다.

이상한 냄새가 날 수도 있지만 이는 .NET에서 작동하는 방식입니다. http://www.codeproject.com/KB/dotnet/csdragndrop01.aspx

그것은 꽤 합리적인 자습서를 보인다

1

구글은이했다. 냄새가 좋지 않다면, 튜토리얼 자체가 가난하지 않고 드래그 앤 드롭으로 API를 사용하는 것이 더 어렵다고 생각합니다.

7

다음은 샘플 양식입니다. 새 WF 프로젝트를 시작하고 폼에 두 개의 목록 상자를 놓습니다. 코드를 다음과 같이 설정하십시오.

public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
     listBox1.Items.AddRange(new object[] { "one", "two", "three" }); 
     listBox1.MouseDown += new MouseEventHandler(listBox1_MouseDown); 
     listBox1.MouseMove += new MouseEventHandler(listBox1_MouseMove); 
     listBox2.AllowDrop = true; 
     listBox2.DragEnter += new DragEventHandler(listBox2_DragEnter); 
     listBox2.DragDrop += new DragEventHandler(listBox2_DragDrop); 
    } 

    private Point mDownPos; 
    void listBox1_MouseDown(object sender, MouseEventArgs e) { 
     mDownPos = e.Location; 
    } 
    void listBox1_MouseMove(object sender, MouseEventArgs e) { 
     if (e.Button != MouseButtons.Left) return; 
     int index = listBox1.IndexFromPoint(e.Location); 
     if (index < 0) return; 
     if (Math.Abs(e.X - mDownPos.X) >= SystemInformation.DragSize.Width || 
      Math.Abs(e.Y - mDownPos.Y) >= SystemInformation.DragSize.Height) 
     DoDragDrop(new DragObject(listBox1, listBox1.Items[index]), DragDropEffects.Move); 
    } 

    void listBox2_DragEnter(object sender, DragEventArgs e) { 
     DragObject obj = e.Data.GetData(typeof(DragObject)) as DragObject; 
     if (obj != null && obj.source != listBox2) e.Effect = e.AllowedEffect; 
    } 
    void listBox2_DragDrop(object sender, DragEventArgs e) { 
     DragObject obj = e.Data.GetData(typeof(DragObject)) as DragObject; 
     listBox2.Items.Add(obj.item); 
     obj.source.Items.Remove(obj.item); 
    } 

    private class DragObject { 
     public ListBox source; 
     public object item; 
     public DragObject(ListBox box, object data) { source = box; item = data; } 
    } 
    }