2013-04-23 58 views
4

我在窗体上有两个面板。
一个面板有一些按钮或图像的控件,第二个面板是空的。我想从面板1中拖动一个控件并将其放到面板2上,但它应该创建一个控件的副本,并且拖动矩形时应该显示与控件相同的大小,并且在面板2中放置时,拖动的形状应显示在那里在鼠标位置
其实我想创建一个像模拟器一样的东西。在面板1中有一些工具,当有人在面板2上拖放一个工具时,它应该出现在鼠标位置。如何从一个面板拖放(复制)到另一个面板

语言不要紧可能C#VB.NET

+2

显示一些代码到目前为止您所做的,请 – 2013-04-23 09:12:57

+0

告诉我们你做了什么,什么不起作用。有很多资源可以在互联网上进行拖放。你在搜索什么? – Patrick 2013-04-23 09:17:32

回答

2

您是否尝试过这样的事情?

private void Form5_Load(object sender, EventArgs e) 
{ 
    this.panel1.AllowDrop = true; 
    foreach (Control c in this.panel1.Controls) 
    { 
     c.MouseDown += new MouseEventHandler(c_MouseDown); 
    } 
    this.panel1.DragOver += new DragEventHandler(panel1_DragOver); 
    this.panel1.DragDrop += new DragEventHandler(panel1_DragDrop); 
} 

void c_MouseDown(object sender, MouseEventArgs e) 
{ 
    Control c = sender as Control; 
    c.DoDragDrop(c, DragDropEffects.Move); 
} 

void panel1_DragDrop(object sender, DragEventArgs e) 
{ 
    Control c = e.Data.GetData(e.Data.GetFormats()[0]) as Control; 
    if (c != null) 
    { 
     c.Location = this.panel1.PointToClient(new Point(e.X, e.Y)); 
     this.panel1.Controls.Add(c); 
    } 
} 

void panel1_DragOver(object sender, DragEventArgs e) 
{ 
    e.Effect = DragDropEffects.Move; 
} 

VB.NET

Private Sub Form5_Load(sender As Object, e As EventArgs) 
    Me.panel1.AllowDrop = True 
    For Each c As Control In Me.panel1.Controls 
     c.MouseDown += New MouseEventHandler(AddressOf c_MouseDown) 
    Next 
    Me.panel1.DragOver += New DragEventHandler(AddressOf panel1_DragOver) 
    Me.panel1.DragDrop += New DragEventHandler(AddressOf panel1_DragDrop) 
End Sub 

Private Sub c_MouseDown(sender As Object, e As MouseEventArgs) 
    Dim c As Control = TryCast(sender, Control) 
    c.DoDragDrop(c, DragDropEffects.Move) 
End Sub 

Private Sub panel1_DragDrop(sender As Object, e As DragEventArgs) 
    Dim c As Control = TryCast(e.Data.GetData(e.Data.GetFormats()(0)), Control) 
    If c IsNot Nothing Then 
     c.Location = Me.panel1.PointToClient(New Point(e.X, e.Y)) 
     Me.panel1.Controls.Add(c) 
    End If 
End Sub 

Private Sub panel1_DragOver(sender As Object, e As DragEventArgs) 
    e.Effect = DragDropEffects.Move 
End Sub 

Source

2

我改变一点点的@Shim的代码。 这里是更新的代码,其中的控制的副本将被放置在另一个面板

Random rnd = new Random(); 

private void Form5_Load(object sender, EventArgs e) 
{ 
    this.panel1.AllowDrop = true; 
    foreach (Control c in this.panel1.Controls) 
    { 
     c.MouseDown += new MouseEventHandler(c_MouseDown); 
    } 
    this.panel1.DragOver += new DragEventHandler(panel1_DragOver); 
    this.panel1.DragDrop += new DragEventHandler(panel1_DragDrop); 
} 

void c_MouseDown(object sender, MouseEventArgs e) 
{ 
    Control c = sender as Control; 
    c.DoDragDrop(c, DragDropEffects.Move); 
} 

void panel1_DragDrop(object sender, DragEventArgs e) 
{ 
    Control c = e.Data.GetData(e.Data.GetFormats()[0]) as Control; 
    // Here, you get a copy of your drag drop button and dynamically new button is created 
    Button btn = new Button(); 
    btn.Name = "Button" + rnd.Next(); 
    btn.Size = c.Size; 
    if (c != null) 
    { 
     // Add the newly created button to you Panel 
     btn.Location = this.panel1.PointToClient(new Point(e.X, e.Y)); 
     this.panel1.Controls.Add(btn); 
    } 
} 

void panel1_DragOver(object sender, DragEventArgs e) 
{ 
    e.Effect = DragDropEffects.Move; 
} 
1

此解决方案将拖动按钮(或选择的任何其他组件),同时移动鼠标,并将其放置的地方你把它

private SimpleButton selectedButton; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     xtraScrollableControl2.AllowDrop = true; 
     xtraScrollableControl2.DragEnter += XtraScrollableControl_DragEnter; 
     xtraScrollableControl2.DragDrop += XtraScrollableControl_DragDrop; 
     xtraScrollableControl2.DragOver += XtraScrollableControl_DragOver; 
    } 

    private void XtraScrollableControl_DragEnter(object sender, DragEventArgs e) 
    { 
     e.Effect = e.Data.GetDataPresent(typeof(Bitmap)) ? DragDropEffects.Copy : DragDropEffects.None; 
    } 

    private void XtraScrollableControl_DragDrop(object sender, DragEventArgs e) 
    { 

     var simpleButton = e.Data.GetData(e.Data.GetFormats()[0]) as SimpleButton; 
     if (simpleButton == null) return; 
     if (simpleButton.Parent != sender) 
     { 
      var btn = new SimpleButton 
      { 
       Dock = DockStyle.None, 
       Size = new Size(125, 50), 
       Text = simpleButton.Text, 
       Location = ((XtraScrollableControl) sender).PointToClient(new Point(e.X, e.Y)), 
       ImageList = simpleButton.ImageList, 
       ImageIndex = simpleButton.ImageIndex, 
       ImageLocation = simpleButton.ImageLocation, 
       Parent = ((XtraScrollableControl)sender) 
      }; 
      btn.MouseDown += simpleButton_MouseDown; 

      ((XtraScrollableControl)sender).Controls.Add(btn); 
     } 
     else 
     { 
      ((XtraScrollableControl)sender).Controls.Remove(simpleButton); 
      simpleButton.Location = ((XtraScrollableControl)sender).PointToClient(new Point(e.X, e.Y)); 
      ((XtraScrollableControl)sender).Controls.Add(simpleButton); 
     } 

     selectedButton = null; 
    } 

    private void XtraScrollableControl_DragOver(object sender, DragEventArgs e) 
    { 
     e.Effect = DragDropEffects.Copy; 
     selectedButton.Location = ((XtraScrollableControl)sender).PointToClient(new Point(e.X, e.Y)); 
    } 

    private void simpleButton_MouseDown(object sender, MouseEventArgs e) 
    { 
     var btn = sender as SimpleButton; 
     if (btn == null) return; 
     selectedButton = btn; 
     btn.DoDragDrop(btn, DragDropEffects.Copy); 
    } 

希望这将帮助一些

我使用的DevExpress组件 但对于非标准

 
DevExpress 
XtraScrollableControl 
SimpleButton 

Microsoft 
Panel 
Button 
相关问题