动态创建 button 拖拉的问题

问题描述

我在panel里面动态创建了几个button,通过MouseMove实现了拖动,但是现在我拖动以后,在原来的位置会还有一个button,我需要怎么样才能把原来那个去掉。如果不是动态创建的,我看如果拖动,原来的位置是没有控件了的。privatevoidDrawJob(Graphicsg){//创建一个新的Button组件ButtonmyButton=newButton();//设定他的名称和Text属性,以及产生的相对位置myButton.Name="button"+1;myButton.Text="按钮"+1;myButton.Location=newPoint(100,200);//为产生的新的Button组件设定事件,本文中为产生的按钮设定了三个事件myButton.MouseMove+=newSystem.Windows.Forms.MouseEventHandler(this.button1_MouseMove);myButton.MouseDown+=newSystem.Windows.Forms.MouseEventHandler(this.button1_MouseDown);//myButton.Click+=newSystem.EventHandler(this.btn_Click);//在窗体中显示此按钮this.back_panel.Controls.Add(myButton);}privatevoidbutton1_MouseMove(objectsender,MouseEventArgse){Buttoncontrol=(Button)sender;if(e.Button==MouseButtons.Left){control.Left+=Cursor.Position.X-_oldPosition.X;control.Top+=Cursor.Position.Y-_oldPosition.Y;_oldPosition=Cursor.Position;}}privatevoidbutton1_MouseDown(objectsender,MouseEventArgse){_oldPosition=Cursor.Position;}

解决方案

解决方案二:
重绘按钮原先所在位置区域
解决方案三:
usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;namespaceWindowsApplication1{publicpartialclassForm14:Form{//以下为拖拽缩放的代码privateenumEnumMousePointPosition{MouseSizeNone=0,//'无MouseSizeRight=1,//'拉伸右边框MouseSizeLeft=2,//'拉伸左边框MouseSizeBottom=3,//'拉伸下边框MouseSizeTop=4,//'拉伸上边框MouseSizeTopLeft=5,//'拉伸左上角MouseSizeTopRight=6,//'拉伸右上角MouseSizeBottomLeft=7,//'拉伸左下角MouseSizeBottomRight=8,//'拉伸右下角MouseDrag=9//'鼠标拖动}//2、定义几个变量constintBand=5;constintMinWidth=10;constintMinHeight=10;privateEnumMousePointPositionm_MousePointPosition;privatePointp,p1;//3、定义自己的MyMouseDown事件privatevoidMyMouseDown(objectsender,System.Windows.Forms.MouseEventArgse){p.X=e.X;p.Y=e.Y;p1.X=e.X;p1.Y=e.Y;}//4、定义自己的MyMouseLeave事件privatevoidMyMouseLeave(objectsender,System.EventArgse){m_MousePointPosition=EnumMousePointPosition.MouseSizeNone;this.Cursor=Cursors.Arrow;}//5、设计一个函数,确定光标在控件不同位置的样式privateEnumMousePointPositionMousePointPosition(Sizesize,System.Windows.Forms.MouseEventArgse){if((e.X>=-1*Band)|(e.X<=size.Width)|(e.Y>=-1*Band)|(e.Y<=size.Height)){if(e.X<Band){if(e.Y<Band){returnEnumMousePointPosition.MouseSizeTopLeft;}else{if(e.Y>-1*Band+size.Height){returnEnumMousePointPosition.MouseSizeBottomLeft;}else{returnEnumMousePointPosition.MouseSizeLeft;}}}else{if(e.X>-1*Band+size.Width){if(e.Y<Band){returnEnumMousePointPosition.MouseSizeTopRight;}else{if(e.Y>-1*Band+size.Height){returnEnumMousePointPosition.MouseSizeBottomRight;}else{returnEnumMousePointPosition.MouseSizeRight;}}}else{if(e.Y<Band){returnEnumMousePointPosition.MouseSizeTop;}else{if(e.Y>-1*Band+size.Height){returnEnumMousePointPosition.MouseSizeBottom;}else{returnEnumMousePointPosition.MouseDrag;}}}}}else{returnEnumMousePointPosition.MouseSizeNone;}}

解决方案四:
//6、定义自己的MyMouseMove事件,在这个事件里,会使用上面设计的函数privatevoidMyMouseMove(objectsender,System.Windows.Forms.MouseEventArgse){ControllCtrl=(senderasControl);if(e.Button==MouseButtons.Left){switch(m_MousePointPosition){caseEnumMousePointPosition.MouseDrag:lCtrl.Left=lCtrl.Left+e.X-p.X;lCtrl.Top=lCtrl.Top+e.Y-p.Y;break;caseEnumMousePointPosition.MouseSizeBottom:lCtrl.Height=lCtrl.Height+e.Y-p1.Y;p1.X=e.X;p1.Y=e.Y;//'记录光标拖动的当前点break;caseEnumMousePointPosition.MouseSizeBottomRight:lCtrl.Width=lCtrl.Width+e.X-p1.X;lCtrl.Height=lCtrl.Height+e.Y-p1.Y;p1.X=e.X;p1.Y=e.Y;//'记录光标拖动的当前点break;caseEnumMousePointPosition.MouseSizeRight:lCtrl.Width=lCtrl.Width+e.X-p1.X;//lCtrl.Height=lCtrl.Height+e.Y-p1.Y;p1.X=e.X;p1.Y=e.Y;//'记录光标拖动的当前点break;caseEnumMousePointPosition.MouseSizeTop:lCtrl.Top=lCtrl.Top+(e.Y-p.Y);lCtrl.Height=lCtrl.Height-(e.Y-p.Y);break;caseEnumMousePointPosition.MouseSizeLeft:lCtrl.Left=lCtrl.Left+e.X-p.X;lCtrl.Width=lCtrl.Width-(e.X-p.X);break;caseEnumMousePointPosition.MouseSizeBottomLeft:lCtrl.Left=lCtrl.Left+e.X-p.X;lCtrl.Width=lCtrl.Width-(e.X-p.X);lCtrl.Height=lCtrl.Height+e.Y-p1.Y;p1.X=e.X;p1.Y=e.Y;//'记录光标拖动的当前点break;caseEnumMousePointPosition.MouseSizeTopRight:lCtrl.Top=lCtrl.Top+(e.Y-p.Y);lCtrl.Width=lCtrl.Width+(e.X-p1.X);lCtrl.Height=lCtrl.Height-(e.Y-p.Y);p1.X=e.X;p1.Y=e.Y;//'记录光标拖动的当前点break;caseEnumMousePointPosition.MouseSizeTopLeft:lCtrl.Left=lCtrl.Left+e.X-p.X;lCtrl.Top=lCtrl.Top+(e.Y-p.Y);lCtrl.Width=lCtrl.Width-(e.X-p.X);lCtrl.Height=lCtrl.Height-(e.Y-p.Y);break;default:break;}if(lCtrl.Width<MinWidth)lCtrl.Width=MinWidth;if(lCtrl.Height<MinHeight)lCtrl.Height=MinHeight;}else{m_MousePointPosition=MousePointPosition(lCtrl.Size,e);//'判断光标的位置状态switch(m_MousePointPosition)//'改变光标{caseEnumMousePointPosition.MouseSizeNone:this.Cursor=Cursors.Arrow;//'箭头break;caseEnumMousePointPosition.MouseDrag:this.Cursor=Cursors.SizeAll;//'四方向break;caseEnumMousePointPosition.MouseSizeBottom:this.Cursor=Cursors.SizeNS;//'南北break;caseEnumMousePointPosition.MouseSizeTop:this.Cursor=Cursors.SizeNS;//'南北break;caseEnumMousePointPosition.MouseSizeLeft:this.Cursor=Cursors.SizeWE;//'东西break;caseEnumMousePointPosition.MouseSizeRight:this.Cursor=Cursors.SizeWE;//'东西break;caseEnumMousePointPosition.MouseSizeBottomLeft:this.Cursor=Cursors.SizeNESW;//'东北到南西break;caseEnumMousePointPosition.MouseSizeBottomRight:this.Cursor=Cursors.SizeNWSE;//'东南到西北break;caseEnumMousePointPosition.MouseSizeTopLeft:this.Cursor=Cursors.SizeNWSE;//'东南到西北break;caseEnumMousePointPosition.MouseSizeTopRight:this.Cursor=Cursors.SizeNESW;//'东北到南西break;default:break;}}//drawpoint();}//7、制作一个初始化过程,将界面panel1上的所有控件都绑定MyMouseDown、MyMouseLeave、MyMouseMove事件,在Form初始化或者Form_Load时先执行它。publicvoidinitProperty(){for(inti=0;i<this.panel1.Controls.Count;i++){this.panel1.Controls[i].MouseDown+=newSystem.Windows.Forms.MouseEventHandler(MyMouseDown);this.panel1.Controls[i].MouseLeave+=newSystem.EventHandler(MyMouseLeave);this.panel1.Controls[i].MouseMove+=newSystem.Windows.Forms.MouseEventHandler(MyMouseMove);}}publicForm14(){TextBoxbt=newTextBox();bt.Bounds=newRectangle(10,10,72,21);InitializeComponent();panel1.Controls.Add(bt);initProperty();}}}

解决方案五:
放个Panel名字panel1和一个Button名字button1
解决方案六:
给你个例子你可以参考下http://blog.csdn.net/zgke/archive/2009/01/06/3718989.aspx
解决方案七:
up
解决方案八:
学习

时间: 2024-12-10 10:38:23

动态创建 button 拖拉的问题的相关文章

动态创建button 控件及事件。事件无法触发

问题描述 如题.代码如下:动态产生buttonforiasinteger=0to10DimibtnTempAsNewImageButtonibtnTemp.ID=String.Format("btn{0}",i)ibtnTemp.ImageUrl=CStr(IIf(MyBase.IsEnglishCulture,"../../Image/btn_delete_EN.gif","../../Image/btn_delete_HK.gif"))Add

动态创建控件时的奇葩事情,不明白,望指教!

问题描述 做了一个动态创建Button的用户控件,测试时发现按钮可以正常生成,但是绑定在其上的Click事件却无法触发.折腾了很久,发现只要我给Button的ID赋值,那么Click事件就无法触发,不知道是什么问题,望指教.publicpartialclassOperatorButton:System.Web.UI.UserControl{privateList<OperatorCommand>m_OperatorCommand=newList<OperatorCommand>()

泛型-c# 动态创建控件 及触发事件 即插即用。

问题描述 c# 动态创建控件 及触发事件 即插即用. 各大大好,初来驾到,请大家多多关照,问题是这样的.需求 :需要动态添加控件.然后需要项目做出来后要实现"即插即用"的特点.(即插即用:我们要是更新一个功能,用户只要更新这个控件就可以直接使用,而不用更新整个客服端)问题 :知道要用泛型来写,但是看了一天了,不知道如何下手,现已写了如下代码:using System;using System.Collections.Generic;using System.Linq;using Sys

button-给动态创建的按钮之间添加空间

问题描述 给动态创建的按钮之间添加空间 在程序中我动态的创建了很多按钮,但是如何在两个按钮之间添加空间呢?我用这样的代码但是没有实现,大家能帮助我吗?谢谢! private LinearLayout LLDynamic; private RelativeLayout.LayoutParams ParaOne;ParaOne = new RelativeLayout.LayoutParams(280 30);Button button1= new Button(Twindo_fromEditGro

动态创建SQL Server数据库、表、存储过程

server|创建|存储过程|动态|数据|数据库 下面是利用SQL语句创建数据库.表.存储过程.视图.索引.规则.修改表.查看数据等的方法.所要增加的控件如下: Imports System.DataImports System.Data.SqlClient Public Class Form1  Inherits System.Windows.Forms.Form  Private ConnectionString As String = "Data Source=.;Initial Cata

JS,Jquery及ExtJs不同脚本动态创建DOM对象

本文介绍简单使用JavaScript.JQuery.ExtJs进行DOM对象创建的测试,主要是使用JavaScript.JQuery.ExtJs动态创建Table对象.动态Table数据填充.多选控制. 1.简单前台数据处理 界面有点丑了,没美化界面,主要是JavaScript动态创建Table.效果图: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/T

动态创建MSSQL数据库表存储过程

下面是利用SQL语句创建数据库.表.存储过程.视图.索引.规则.修改表.查看数据等的方法.所要增加的控件如下: 以下是引用片段:Imports System.Data Imports System.Data.SqlClient Public Class Form1 Inherits System.Windows.Forms.Form Private ConnectionString As String = "Data Source=.;Initial Catalog=;User Id=sa;Pa

BCB中实现动态创建组件

栈(stack)是存放函数的所有动态局部变量及函数调用和返回的有关信息的一块内存.栈的内存管理严格遵循先进后出的顺序,这一点正是实现函数调用所需要的.从栈中分配内存效率特别高.数据对象使用栈中的内存(如动态局部变量)比使用堆中内存会使程序运行更快. 堆(heap)是供malloc().calloc().realloc()和new等函数获取内存空间的一块内存.从堆中获取内存比从栈中要慢得多,但堆的内存管理却比栈灵活得多,任何时候你都可以从堆中获取(或释放)内存,我们可以按任意顺序进行.用来存放递归

ASP.NET动态创建控件之绝境求生

在ASP.NET中动态创建一个控件总是不那么顺利,特别是当对页面的Life Cycle不是那么了然的情况下!这里简单描述一下要求,然后提供一个解决方案,大家看看有没有更好的Idea,如果有的话就是我的大幸了,呵呵! 要求:页面上有一个Add按钮,每点击一次该按钮,页面上动态创建一个WebPartZone! 提醒:WebPartZone只能在OnInit或之前才能创建,否则报异常! 大家都知道,按钮的点击事件是在RaisePostbackEvent时触发的,这意味着点击事件在OnLoad阶段之后才