2016-10-17 11 views
2

私は2つのパネルを持っていて、1つはロードで1つのコントロールを設定します。ユーザーがコントロールを他のパネルにドラッグすると、コントロールが元のパネルから新しいパネルに移動するため、コントロールのコピーを作成して別のパネルに配置するのが好きです。同じコントロールを複数回パネルにドラッグできるようにする必要があります。これを達成するにはどうすればいいですか?コピーするドラッグエフェクトを変更しようとしましたが、これはそのトリックを行うようには見えません。コピーの代わりにドラッグアンドドロップ移動コントロール

void panel_DragEnter(object sender, DragEventArgs e) 
    { 
     e.Effect = DragDropEffects.Copy; 
    } 



void panel_DragDrop(object sender, DragEventArgs e) 
    { 

     Button data = (Button)e.Data.GetData(typeof(Button)); 
     FlowLayoutPanel _destination = (FlowLayoutPanel)sender; 
     FlowLayoutPanel _source = (FlowLayoutPanel)data.Parent; 

     if (_source != _destination) 
     { 
      // Add control to panel 
      data.Size = new Size(_destination.Width, 85); 
      _destination.Controls.Add(data); 

      // Reorder 
      Point p = _destination.PointToClient(new Point(e.X, e.Y)); 
      var item = _destination.GetChildAtPoint(p); 
      int index = _destination.Controls.GetChildIndex(item, false); 
      _destination.Controls.SetChildIndex(data, index); 

      // Invalidate to paint! 
      _destination.Invalidate(); 
      _source.Invalidate(); 
     } 
     else 
     { 
      // Just add the control to the new panel. 
      // No need to remove from the other panel, this changes the Control.Parent property. 
      Point p = _destination.PointToClient(new Point(e.X, e.Y)); 
      var item = _destination.GetChildAtPoint(p); 
      int index = _destination.Controls.GetChildIndex(item, false); 
      _destination.Controls.SetChildIndex(data, index); 
      _destination.Invalidate(); 
     } 

    } 
+0

Winformsには、コントロールのコピーを作成するメカニズムはありません。 Controlクラスは完全に多くのプロパティを持ち、入れ子にするとさらに悪化します。代わりにコントロールを再作成する必要があります。ドラッグしたい元のパネルを作成するメソッドがあることを確認してください。ドラッグが完了したら、単にそのメソッドを再度実行します。 ParentとLocationの2つの引数が必要です。 –

+0

これを見る:http://stackoverflow.com/questions/11407068/how-to-drag-and-drop-a-button-from-one-panel-to-another-panelよろしくお願いします。 jens – schwebbe

答えて

1

コントロールをコピーする場合は、実際にコピーするコントロールのコピーを取る必要があります。これを行う最も良い場所は、おそらくモードをコピーからコピーに変更する場所です。コピーを元の場所に残して、元の場所に移動したりコピーを移動したりすることができます。

だから、あなたが持っている場所:

Button data = (Button)e.Data.GetData(typeof(Button)); 

を、あなたは、ボタンのクローンを作成したり、新しいButtonを作成し、プロパティを手動で設定するか必要があります。クローニングがより良い解決策になるでしょう。

関連する問題