검색결과 리스트
Drop에 해당되는 글 1건
- 2012.03.15 [C#] .Net 탐색기, Drag And Drop 구현
글
Drag And Drop도 구현
Ctrl+마우스 DnD : 복사, 마우스 DnD : 이동
탐색기 갱신의 약간의 버그와 소스코드가 드러운데
나중을 위해서 그냥 저장...
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace TestExplorer
{
public partial class MainForm : Form
{
private TreeNode sourceNode = null;
public MainForm()
{
InitializeComponent();
}
private void LoadDrive()
{
DriveInfo[] drivers = DriveInfo.GetDrives();
foreach (DriveInfo i in drivers)
{
if ( (i.DriveType & DriveType.Fixed) == DriveType.Fixed )
{
TreeNode newNode1 = this.treeView1.Nodes.Add(i.Name);
TreeNode newNode2 = this.treeView2.Nodes.Add(i.Name);
DirectoryInfo di = new DirectoryInfo(i.Name);
try
{
if (di.GetFileSystemInfos().Count() > 0)
{
newNode1.Nodes.Add("temp");
newNode2.Nodes.Add("temp");
}
}
catch (Exception e)
{
}
}
}
}
private void RefreshNode(TreeNode sourceNode, TreeNode targetNode)
{
}
private void Form1_Load(object sender, EventArgs e)
{
LoadDrive();
}
private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
{
// root는 제외
//MessageBox.Show(e.Node.Text);
e.Node.Nodes.Clear();
string fullPath = e.Node.FullPath;
DirectoryInfo di = new DirectoryInfo(fullPath);
FileSystemInfo[] arrFsi = di.GetFileSystemInfos();
e.Node.TreeView.BeginUpdate();
foreach (FileSystemInfo i in arrFsi)
{
if ( (i.Attributes & FileAttributes.Hidden) != FileAttributes.Hidden )
{
TreeNode newNode = e.Node.Nodes.Add(i.Name);
DirectoryInfo newDI = new DirectoryInfo(i.FullName);
try
{
if (newDI.GetFileSystemInfos().Count() > 0)
{
newNode.Nodes.Add("temp");
}
}
catch (Exception ex)
{
}
}
}
e.Node.TreeView.EndUpdate();
}
private void treeView1_MouseDown(object sender, MouseEventArgs e)
{
System.Console.WriteLine("treeView1_MouseDown");
TreeViewHitTestInfo hitInfo = this.treeView1.HitTest(e.Location);
if (hitInfo != null && hitInfo.Node != null)
{
TreeNode node = hitInfo.Node;
System.Console.WriteLine(node.FullPath);
// 현재 노드를 선택해준다.
node.TreeView.SelectedNode = node;
}
}
private void treeView1_QueryContinueDrag(object sender, QueryContinueDragEventArgs e)
{
System.Console.WriteLine("treeView1_QueryContinueDrag");
if (e.EscapePressed)
{
e.Action = DragAction.Cancel;
}
}
private void treeView2_DragEnter(object sender, DragEventArgs e)
{
System.Console.WriteLine("treeView2_DragEnter");
}
private void treeView2_DragOver(object sender, DragEventArgs e)
{
System.Console.WriteLine("treeView2_DragOver");
if (e.Data.GetDataPresent(DataFormats.StringFormat))
{
if ((e.KeyState & 8) == 8)
{
e.Effect = DragDropEffects.Copy;
}
else
{
e.Effect = DragDropEffects.Move;
}
}
}
private void treeView2_DragDrop(object sender, DragEventArgs e)
{
System.Console.WriteLine("treeView2_DragDrop");
if (e.Data.GetDataPresent(DataFormats.StringFormat))
{
string sourcePath = (string)e.Data.GetData(DataFormats.StringFormat);
Point pt = new Point(MousePosition.X, MousePosition.Y);
pt = this.treeView2.PointToClient(pt);
TreeViewHitTestInfo hitInfo = this.treeView2.HitTest(pt);
if (hitInfo != null && hitInfo.Node != null)
{
string targetPath = hitInfo.Node.FullPath;
// 폴더 복사
if (Directory.Exists(sourcePath) == true
&& Directory.Exists(targetPath) == true)
{
FileProgressForm form = new FileProgressForm();
form.SourcePath = sourcePath;
form.TargetPath = targetPath;
if (e.Effect == DragDropEffects.Move)
{
form.Action = FileProgressForm.ACTION_TYPE.MOVE;
}
else if (e.Effect == DragDropEffects.Copy)
{
form.Action = FileProgressForm.ACTION_TYPE.COPY;
}
DialogResult result = form.ShowDialog();
if (result == DialogResult.OK)
{
TreeView tree = hitInfo.Node.TreeView;
hitInfo.Node.TreeView.TopNode.Collapse();
hitInfo.Node.TreeView.TopNode.Expand();
hitInfo.Node.Collapse();
hitInfo.Node.Expand();
sourceNode.TreeView.TopNode.Collapse();
sourceNode.TreeView.TopNode.Expand();
sourceNode.Collapse();
sourceNode.Expand();
}
else if (result == DialogResult.Cancel)
{
}
}
// 파일 복사
else if (File.Exists(sourcePath) == true
&& Directory.Exists(targetPath) == true)
{
FileProgressForm form = new FileProgressForm();
form.SourcePath = sourcePath;
form.TargetPath = targetPath;
if (e.Effect == DragDropEffects.Move)
{
form.Action = FileProgressForm.ACTION_TYPE.MOVE;
}
else if (e.Effect == DragDropEffects.Copy)
{
form.Action = FileProgressForm.ACTION_TYPE.COPY;
}
DialogResult result = form.ShowDialog();
if (result == DialogResult.OK)
{
TreeView tree = hitInfo.Node.TreeView;
hitInfo.Node.TreeView.TopNode.Collapse();
hitInfo.Node.TreeView.TopNode.Expand();
hitInfo.Node.Collapse();
hitInfo.Node.Expand();
sourceNode.TreeView.TopNode.Collapse();
sourceNode.TreeView.TopNode.Expand();
sourceNode.Collapse();
sourceNode.Expand();
}
else if (result == DialogResult.Cancel)
{
}
}
else
{
MessageBox.Show("파일이 존재하지 않거나, 복사하려는 곳이 폴더가 아닙니다.");
}
}
}
}
private void Main_Shown(object sender, EventArgs e)
{
//DialogResult result = MessageBox.Show("정식 버전을 구입하세요", "확인", MessageBoxButtons.YesNo);
//if (result == DialogResult.No)
//{
// this.Close();
//}
//else
//{
// MessageBox.Show("정식 버전을 구입해 주셔서 감사합니다.");
//}
}
private void treeView1_ItemDrag(object sender, ItemDragEventArgs e)
{
TreeNode node = e.Item as TreeNode;
if (node != null )
{
System.Console.WriteLine(node.FullPath);
string fullPath = node.FullPath;
sourceNode = node;
Console.WriteLine("treeView1_ItemDrag=" + fullPath);
// DoDragDrop 시작
DragDropEffects effects = DoDragDrop(fullPath, DragDropEffects.Copy | DragDropEffects.Move);
// 트리 부모 노드를 갱신해 준다.
if (effects == DragDropEffects.Move)
{
}
}
}
private void treeView2_NodeMouseHover(object sender, TreeNodeMouseHoverEventArgs e)
{
}
}
}
designer code
namespace TestExplorer
{
partial class MainForm
{
///
/// 필수 디자이너 변수입니다.
///
private System.ComponentModel.IContainer components = null;
///
/// 사용 중인 모든 리소스를 정리합니다.
///
/// 관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다.
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form 디자이너에서 생성한 코드
///
/// 디자이너 지원에 필요한 메서드입니다.
/// 이 메서드의 내용을 코드 편집기로 수정하지 마십시오.
///
private void InitializeComponent()
{
this.splitContainer1 = new System.Windows.Forms.SplitContainer();
this.treeView1 = new System.Windows.Forms.TreeView();
this.treeView2 = new System.Windows.Forms.TreeView();
this.splitContainer1.Panel1.SuspendLayout();
this.splitContainer1.Panel2.SuspendLayout();
this.splitContainer1.SuspendLayout();
this.SuspendLayout();
//
// splitContainer1
//
this.splitContainer1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.splitContainer1.Location = new System.Drawing.Point(13, 13);
this.splitContainer1.Name = "splitContainer1";
//
// splitContainer1.Panel1
//
this.splitContainer1.Panel1.Controls.Add(this.treeView1);
//
// splitContainer1.Panel2
//
this.splitContainer1.Panel2.Controls.Add(this.treeView2);
this.splitContainer1.Size = new System.Drawing.Size(659, 387);
this.splitContainer1.SplitterDistance = 327;
this.splitContainer1.TabIndex = 2;
//
// treeView1
//
this.treeView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.treeView1.HotTracking = true;
this.treeView1.Location = new System.Drawing.Point(3, 3);
this.treeView1.Name = "treeView1";
this.treeView1.Size = new System.Drawing.Size(321, 381);
this.treeView1.TabIndex = 4;
this.treeView1.QueryContinueDrag += new System.Windows.Forms.QueryContinueDragEventHandler(this.treeView1_QueryContinueDrag);
this.treeView1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.treeView1_MouseDown);
this.treeView1.BeforeExpand += new System.Windows.Forms.TreeViewCancelEventHandler(this.treeView1_BeforeExpand);
this.treeView1.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.treeView1_ItemDrag);
//
// treeView2
//
this.treeView2.AllowDrop = true;
this.treeView2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.treeView2.HotTracking = true;
this.treeView2.Location = new System.Drawing.Point(3, 3);
this.treeView2.Name = "treeView2";
this.treeView2.Size = new System.Drawing.Size(322, 381);
this.treeView2.TabIndex = 3;
this.treeView2.BeforeExpand += new System.Windows.Forms.TreeViewCancelEventHandler(this.treeView1_BeforeExpand);
this.treeView2.NodeMouseHover += new System.Windows.Forms.TreeNodeMouseHoverEventHandler(this.treeView2_NodeMouseHover);
this.treeView2.DragDrop += new System.Windows.Forms.DragEventHandler(this.treeView2_DragDrop);
this.treeView2.DragEnter += new System.Windows.Forms.DragEventHandler(this.treeView2_DragEnter);
this.treeView2.DragOver += new System.Windows.Forms.DragEventHandler(this.treeView2_DragOver);
//
// MainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(684, 412);
this.Controls.Add(this.splitContainer1);
this.Name = "MainForm";
this.Text = "TestExplorer";
this.Load += new System.EventHandler(this.Form1_Load);
this.Shown += new System.EventHandler(this.Main_Shown);
this.splitContainer1.Panel1.ResumeLayout(false);
this.splitContainer1.Panel2.ResumeLayout(false);
this.splitContainer1.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.SplitContainer splitContainer1;
private System.Windows.Forms.TreeView treeView2;
private System.Windows.Forms.TreeView treeView1;
}
}
'.Net > .Net' 카테고리의 다른 글
[.Net] Func 및 Action 제네릭 대리자에 가변성 사용(C# 및 Visual Basic) (0) | 2012.04.10 |
---|---|
[C#] Implementing a Database Factory Pattern in C# ASP .NET (0) | 2012.03.25 |
[C#] .Net Control.Invoke (0) | 2012.03.18 |
[.Net] System.CodeDom namespace (0) | 2012.03.09 |
[즐겨찾기] .Net Install (0) | 2012.03.08 |
RECENT COMMENT