2017-03-29 2 views
1

Drag-n-Dropが機能するために必要なものがすべてあるように見えますが、あるコントロールから別のコントロールにドラッグしようとするとコードが呼び出されません。Windowsフォームドラッグアンドドロップ機能

  • 私は、データを作成するために使用するテストクラスを作成しました:

    class TestClass 
    { 
    
        public TestClass() 
        { 
         Name = "Blank"; 
         Id = -1; 
        } 
    
        public String Name { get; set; } 
    
        public int Id { get; set; } 
    
        public object Data { get; set; } 
    
        public override String ToString() 
        { 
         return String.Format("{0}: {1}", Id, Name); 
        } 
    
    } 
    
  • 私はlistView1listView2、2つのリストビューコントロールで空のフォームを作成しました:

ListViewsForm

  • 私はドラッグ&ドロップ方式のすべてのイベントハンドラを作成し、それらにブレークポイントを置く:

    private void Form_DragDrop(object sender, DragEventArgs e) 
    { 
        e.Effect = DragDropEffects.Copy; 
        if (e.Data.GetDataPresent(typeof(TestClass))) 
        { 
         var item = e.Data.GetData(typeof(TestClass)) as TestClass; 
         if (item != null) 
         { 
          // ? 
         } 
        } 
    } 
    
    private void Form_DragEnter(object sender, DragEventArgs e) 
    { 
        e.Effect = DragDropEffects.Copy; 
        if (sender.Equals(listView2)) 
        { 
         e.Effect = DragDropEffects.All; 
         if (e.Data != null) 
         { 
          var format = GetString(e); 
          Console.WriteLine("{0} has a(n) {1} entering it.", listView2.Name, format); 
         } 
        } 
    } 
    
    private void Form_DragLeave(object sender, EventArgs e) 
    { 
        if (sender.Equals(listView2)) 
        { 
    
        } 
    } 
    
    private void Form_DragOver(object sender, DragEventArgs e) 
    { 
        // Code Project Article 9017 says DragOver fires repeatedly, even if the mouse does not move. 
        if ((e.X != _lastX) || (e.Y != _lastY)) 
        { 
         _lastX = e.X; 
         _lastY = e.Y; 
         if (e.Data.GetDataPresent(typeof(TestClass))) 
         { 
    
         } 
         else 
         { 
          e.Effect = DragDropEffects.None; 
         } 
        } 
    } 
    
    private void Form_GiveFeedback(Object sender, GiveFeedbackEventArgs e) 
    { 
        if (sender.Equals(listView2)) 
        { 
         // ? 
        } 
    } 
    
    private void Form_QueryContinueDrag(object sender, QueryContinueDragEventArgs e) 
    { 
        var listView = sender as ListView; 
        if (listView != null) 
        { 
    
        } 
    } 
    
    private String GetString(DragEventArgs e) 
    { 
        var result = String.Empty; 
        if ((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy) 
        { 
         var formats = e.Data.GetFormats(); 
         foreach (var format in formats) 
         { 
          Console.WriteLine("Data is in the format of [{0}].", format); 
          result = format; 
         } 
        } 
        return result; 
    } 
    
  • 私は、コンストラクタのInitializeComponent();後の両方のコントロールを有線:

    public ListViewsForm() 
    { 
        InitializeComponent(); 
        // Setup ListView 1: 
        listView1.AllowDrop = true; 
        listView1.DragDrop += Form_DragDrop; 
        listView1.DragEnter += Form_DragEnter; 
        listView1.DragLeave += Form_DragLeave; 
        listView1.DragOver += Form_DragOver; 
        listView1.GiveFeedback += Form_GiveFeedback; 
        listView1.QueryContinueDrag += Form_QueryContinueDrag; 
        listView1.Dock = DockStyle.Fill; 
        listView1.View = View.List; 
        // Setup ListView 2: 
        listView2.AllowDrop = true; 
        listView2.DragDrop += Form_DragDrop; 
        listView2.DragEnter += Form_DragEnter; 
        listView2.DragLeave += Form_DragLeave; 
        listView2.DragOver += Form_DragOver; 
        listView2.GiveFeedback += Form_GiveFeedback; 
        listView2.QueryContinueDrag += Form_QueryContinueDrag; 
        listView2.Dock = DockStyle.Fill; 
        // Create some data: 
        var group1 = new ListViewGroup("Known Colors"); 
        foreach (KnownColor known in Enum.GetValues(typeof(KnownColor))) 
        { 
         var item = new TestClass() 
         { 
          Name = known.ToString(), 
          Id = (int)known, 
          Data = known, 
         }; 
         var color = Color.FromKnownColor(known); 
         var lvi = new ListViewItem(item.ToString(), group1) { 
          BackColor = Color.FromArgb(color.ToArgb()^0xffffff), 
          ForeColor = color, 
          Tag = item, 
         }; 
         listView1.Items.Add(lvi); 
        } 
    } 
    

私はプロジェクトを実行するたびに、すべて正常にロードされますが、LEFT側からRIGHT側に項目をドラッグしようとすると何も起こりません。私のブレークポイントはどれもヒットしません。何も起こりません。

私は何を残しましたか?

答えて

1

あなたはドラッグ操作を開始する便利なイベントとメソッド不足している:

listView1.ItemDrag += listView1_ItemDrag; 

void listView1_ItemDrag(object sender, ItemDragEventArgs e) { 
    DoDragDrop(e.Item, DragDropEffects.Copy); 
} 
+0

たどのようにシンプルに!ありがとう。 – jp2code

関連する問題