Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Drag'n'Drop узлов TreeView

341
02 марта 2008 года
Der Meister
874 / / 21.12.2007
Дамы и господа! Есть вопрос: существует ли стандартная реализация перетаскивания элементов внутри TreeView? Поиск по MSDN показал, что Microsoft предлагает сделать всё (в том числе, инициацию Drag&Drop, а так же отрисовку курсора и перетаскиваемого элемента "из ничего") своими руками. Но перспектива программировать неинтересные нюансы вроде подсветки вкупе с предотвращением генерации SelectionChanged для узла в момент, когда курсор находится над ним при перетаскивании, меня, признаться, угнетает... Должны же быть ну хоть наработки какие-то, что ли? Мож кто уже сталкивался?..
5
02 марта 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: Der Meister
Дамы и господа! Есть вопрос: существует ли стандартная реализация перетаскивания элементов внутри TreeView?


Думаю, для начала, будет ясно ;)
[highlight=csharp]
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication1 {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}

private TreeNode GetHoveringNode(int screen_x, int screen_y) {
Point pt = treeView1.PointToClient(new Point(screen_x, screen_y));
TreeViewHitTestInfo hitInfo = treeView1.HitTest(pt);
return hitInfo.Node;
}

private void treeView1_ItemDrag(object sender, ItemDragEventArgs e) {
treeView1.DoDragDrop(e.Item, DragDropEffects.All);
}

private void treeView1_DragOver(object sender, DragEventArgs e) {
TreeNode hoveringNode = GetHoveringNode(e.X, e.Y);
TreeNode draggingNode = e.Data.GetData(typeof(TreeNode)) as TreeNode;
if (hoveringNode != null && hoveringNode != draggingNode) {
e.Effect = DragDropEffects.Move;
hoveringNode.TreeView.SelectedNode = hoveringNode;
} else {
e.Effect = DragDropEffects.None;
}
}

private void treeView1_DragDrop(object sender, DragEventArgs e) {
if (e.Effect == DragDropEffects.Move) {
TreeNode hoveringNode = GetHoveringNode(e.X, e.Y);
if (hoveringNode != null) {
TreeNode draggingNode = e.Data.GetData(typeof(TreeNode)) as TreeNode;
if (draggingNode != null) {
draggingNode.Remove();
hoveringNode.Nodes.Add(draggingNode);
}
}
}
}

}
}
[/highlight]Даа, у treeView1 свойство AllowDrop стоит в true.

341
03 марта 2008 года
Der Meister
874 / / 21.12.2007
Цитата: hardcase
Думаю, для начала, будет ясно ;)



Да тут, по-моему, изложено исчерпывающе... Muchas grac`ias! :)

37K
13 марта 2008 года
webcane
1 / / 13.03.2008
я бы только добавил:
 
Код:
this.treeView1.DragDrop += new System.Windows.Forms.DragEventHandler(this.treeView1_DragDrop);
            this.treeView1.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.treeView1_ItemDrag);
            this.treeView1.DragOver += new System.Windows.Forms.DragEventHandler(this.treeView1_DragOver);

в InitializeComponent()
5
14 марта 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: webcane
я бы только добавил

Друг мой, подобные вещи - очевидны.

78K
12 декабря 2011 года
Zemeloev
1 / / 12.12.2011
Нет проверки на то, чтобы не копировать родительский Node в один из своих дочерних..
82K
13 апреля 2012 года
Mascka
1 / / 13.04.2012
Тот же код, но слегка переработанный. Может, кому пригодится.


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;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private TreeNode GetHoveringNode(int screen_x, int screen_y) {
Point pt = treeView1.PointToClient(new Point(screen_x, screen_y));
TreeViewHitTestInfo hitInfo = treeView1.HitTest(pt);
return hitInfo.Node;
}

private void treeView1_ItemDrag(object sender, ItemDragEventArgs e) {
treeView1.DoDragDrop(e.Item, DragDropEffects.All);
}

private void treeView1_DragOver(object sender, DragEventArgs e) {
TreeNode hoveringNode = GetHoveringNode(e.X, e.Y);
TreeNode draggingNode = e.Data.GetData(typeof(TreeNode)) as TreeNode;
if (hoveringNode != null && hoveringNode != draggingNode && draggingNode != hoveringNode.Parent) {
e.Effect = DragDropEffects.Move;
hoveringNode.TreeView.SelectedNode = hoveringNode;
} else {
e.Effect = DragDropEffects.None;
}
}

private void treeView1_DragDrop(object sender, DragEventArgs e) {
if (e.Effect == DragDropEffects.Move) {
TreeNode hoveringNode = GetHoveringNode(e.X, e.Y);
if (hoveringNode != null) {
TreeNode draggingNode = e.Data.GetData(typeof(TreeNode)) as TreeNode;
if (draggingNode != null) {
if (draggingNode.Level == hoveringNode.Level)
{
if (draggingNode.Level != 0)
{
draggingNode.Remove();
hoveringNode.Parent.Nodes.Insert(hoveringNode.Index + 1, draggingNode);
}
if (draggingNode.Level == 0)
{
draggingNode.Remove();
treeView1.Nodes.Insert(hoveringNode.Index + 1, draggingNode);
}


}
if (draggingNode.Level > hoveringNode.Level)
{

draggingNode.Remove();
hoveringNode.Nodes.Insert(0, draggingNode);

}

}
}
}
}

}
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог