TreeView控件和ListView的拖动

cnjack 2003-06-07 09:16:29
源贴:http://www.uncj.net/bbs/dispbbs.asp?boardID=2&replyID=12102&ID=2045&skin=1

using System ;
using System.Drawing ;
using System.Collections ;
using System.ComponentModel ;
using System.Windows.Forms ;
using System.Data ;
//导入程序中使用的命名空间
namespace TreeViewAndListViewDrag
{
public class Form1 : Form
{
private TreeView treeView1 ;
private Point Position = new Point( 0 , 0) ;
// bool lv1_mdown = false ;
private ListView listView1 ;
private System.ComponentModel.Container components = null ;
public Form1 ( )
{
InitializeComponent ( ) ;
//初始化窗体中的各个组件
}
//清除程序中使用到的各种资源
protected override void Dispose ( bool disposing )
{
if ( disposing )
{
if ( components != null )
{
components.Dispose ( ) ;
}
}
base.Dispose ( disposing ) ;
}
private void InitializeComponent ( )
{
System.Windows.Forms.ListViewItem listViewItem1 = new System.Windows.Forms.ListViewItem(new string[] {
"Item01"}, -1, System.Drawing.SystemColors.WindowText, System.Drawing.SystemColors.Window, new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(134))));
System.Windows.Forms.ListViewItem listViewItem2 = new System.Windows.Forms.ListViewItem(new string[] {
"Item02"}, -1, System.Drawing.SystemColors.WindowText, System.Drawing.SystemColors.Window, new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(134))));
this.treeView1 = new System.Windows.Forms.TreeView();
this.listView1 = new System.Windows.Forms.ListView();
this.SuspendLayout();
//
// treeView1
//
this.treeView1.AllowDrop = true;
this.treeView1.ImageIndex = -1;
this.treeView1.Location = new System.Drawing.Point(48, 40);
this.treeView1.Name = "treeView1";
this.treeView1.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {
new System.Windows.Forms.TreeNode("节点01"),
new System.Windows.Forms.TreeNode("节点02")});
this.treeView1.SelectedImageIndex = -1;
this.treeView1.Size = new System.Drawing.Size(121, 144);
this.treeView1.TabIndex = 0;
this.treeView1.DragEnter += new System.Windows.Forms.DragEventHandler(this.treeView1_DragEnter);
this.treeView1.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.treeView1_ItemDrag);
this.treeView1.DragDrop += new System.Windows.Forms.DragEventHandler(this.treeView1_DragDrop);
//
// listView1
//
this.listView1.AllowDrop = true;
this.listView1.Items.AddRange(new System.Windows.Forms.ListViewItem[] {
listViewItem1,
listViewItem2});
this.listView1.Location = new System.Drawing.Point(208, 40);
this.listView1.Name = "listView1";
this.listView1.Size = new System.Drawing.Size(121, 144);
this.listView1.TabIndex = 2;
this.listView1.View = System.Windows.Forms.View.List;
this.listView1.DragDrop += new System.Windows.Forms.DragEventHandler(this.treeView1_DragDrop);
this.listView1.DragEnter += new System.Windows.Forms.DragEventHandler(this.treeView1_DragEnter);
this.listView1.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.listView1_ItemDrag);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(376, 237);
this.Controls.AddRange(new System.Windows.Forms.Control[] {
this.listView1,
this.treeView1});
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "Form1";
this.Text = "全面掌握C#中的拖放操作";
this.ResumeLayout(false);

}
static void Main ( )
{
try
{
Application.Run ( new Form1 ( ) ) ;
}
catch(Exception me)
{
MessageBox.Show(me.Message,"Information");
}
}
private void treeView1_ItemDrag ( object sender , ItemDragEventArgs e )
{
string strItem = e.Item.ToString ( ) ;
//开始进行"Drag"操作
DoDragDrop ( strItem , DragDropEffects.Copy | DragDropEffects.Move ) ;
}
private void listView1_DragEnter ( object sender , DragEventArgs e )
{
//判断是否目前拖动的数据是字符串,如果是,则拖动符串对目的组件进行拷贝
if ( e.Data.GetDataPresent ( DataFormats.Text ) )
e.Effect = DragDropEffects.Move ;
else
e.Effect = DragDropEffects.None ;
}
private void listView1_DragDrop ( object sender , DragEventArgs e )
{
string dummy = "temp" ;
//获得进行"Drag"操作中拖动的字符串
string s = ( string ) e.Data.GetData ( dummy.GetType ( ) ) ;
s = s.Substring ( s.IndexOf ( ":" ) + 1 ).Trim ( ) ;
Position.X = e.X ;
Position.Y = e.Y ;
Position = listView1.PointToClient ( Position ) ;
//在目标组件中加入以此字符串为标题的项目
listView1.Items.Add ( new ListViewItem ( s , 0 ) ) ;
}

private void listView1_ItemDrag ( object sender , ItemDragEventArgs e )
{
//判断是否是鼠标右键按动
if ( e.Button == MouseButtons.Right ) return ;
int nTotalSelected = listView1.SelectedIndices.Count ;
//判断组件中是否存在项目
if ( nTotalSelected <= 0 ) return ;
IEnumerator selCol = listView1.SelectedItems.GetEnumerator ( ) ;
selCol.MoveNext ( ) ;
ListViewItem lvi = ( ListViewItem )selCol.Current ;
string mDir = "" ;
for ( int i = 0 ; i < lvi.SubItems.Count ; i++ )
mDir += lvi.SubItems[ i ].Text + " ," ;
string str = mDir.Substring ( 0 , mDir.Length-1 ) ;
if ( str == "" ) return ;
//对组件中的字符串开始拖放操作
listView1.DoDragDrop ( str , DragDropEffects.Copy | DragDropEffects.Move ) ;
}
private void treeView1_DragEnter ( object sender , DragEventArgs e )
{
//判断是否目前拖动的数据是字符串,如果是,则拖动符串对目的组件进行拷贝
if ( e.Data.GetDataPresent ( DataFormats.Text ) )
e.Effect = DragDropEffects.Copy ;
else
e.Effect = DragDropEffects.None ;
}
private void treeView1_DragDrop ( object sender , DragEventArgs e )
{
//获得进行"Drag"操作中拖动的字符串
string dummy = "temp" ;
string s = ( string ) e.Data.GetData ( dummy.GetType ( ) ) ;
s = s.Substring ( s.IndexOf ( ":" ) + 1 ).Trim ( ) ;
Position.X = e.X ;
Position.Y = e.Y ;
Position = treeView1.PointToClient ( Position ) ;
TreeNode DropNode = this.treeView1.GetNodeAt ( Position ) ;
//在目标组件中加入以此字符串为标题的项目
if ( DropNode != null )
{
TreeNode DragNode = new TreeNode ( s ) ;
treeView1.Nodes.Insert ( DropNode.Index+1 , DragNode ) ;
}
}
}
}
程序编译没有错误,但程序一运行到main()函数,就出错
me.Message="DragDrop注册失败"
为什么?
...全文
164 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
bierhoff 2003-06-10
  • 打赏
  • 举报
回复
up
cnjack 2003-06-10
  • 打赏
  • 举报
回复
那位大侠帮小弟一把,
cnjack 2003-06-09
  • 打赏
  • 举报
回复
cnjack 2003-06-08
  • 打赏
  • 举报
回复
但是我拖动节点经过其它的节点时,它们的颜色不会反色,要不然我怎么知道将节点放在哪一个节点下呀.请教
tjq_tang 2003-06-07
  • 打赏
  • 举报
回复
[STAThread]
static void Main ( )
就ok了
ju_feng 2003-06-07
  • 打赏
  • 举报
回复
main函数前要有[STAThread]
lovered 2003-06-07
  • 打赏
  • 举报
回复
[v]

110,552

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧