У меня есть winform со списком и деревом.
Как только мой список заполнен элементами, я хочу перетащить их (несколько или один) из списка и отбросить их в node в дереве.
Если у кого-то есть хороший пример в С#, это было бы здорово.
У меня есть winform со списком и деревом.
Как только мой список заполнен элементами, я хочу перетащить их (несколько или один) из списка и отбросить их в node в дереве.
Если у кого-то есть хороший пример в С#, это было бы здорово.
Прошло некоторое время с тех пор, как я перепутал с Drag/Drop, поэтому решил, что напишу быстрый пример.
В принципе, у меня есть форма, со списком слева и деревом справа. Затем я положил кнопку сверху. Когда кнопка нажата, она просто помещает дату следующего десяти дней в список. Он также заполняет TreeView двумя родительскими узлами и двумя дочерними узлами. Затем вам просто нужно обработать все последующие события перетаскивания, чтобы заставить его работать.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.treeView1.AllowDrop = true;
this.listBox1.AllowDrop = true;
this.listBox1.MouseDown += new MouseEventHandler(listBox1_MouseDown);
this.listBox1.DragOver += new DragEventHandler(listBox1_DragOver);
this.treeView1.DragEnter += new DragEventHandler(treeView1_DragEnter);
this.treeView1.DragDrop += new DragEventHandler(treeView1_DragDrop);
}
private void button1_Click(object sender, EventArgs e)
{
this.PopulateListBox();
this.PopulateTreeView();
}
private void PopulateListBox()
{
for (int i = 0; i <= 10; i++)
{
this.listBox1.Items.Add(DateTime.Now.AddDays(i));
}
}
private void PopulateTreeView()
{
for (int i = 1; i <= 2; i++)
{
TreeNode node = new TreeNode("Node" + i);
for (int j = 1; j <= 2; j++)
{
node.Nodes.Add("SubNode" + j);
}
this.treeView1.Nodes.Add(node);
}
}
private void treeView1_DragDrop(object sender, DragEventArgs e)
{
TreeNode nodeToDropIn = this.treeView1.GetNodeAt(this.treeView1.PointToClient(new Point(e.X, e.Y)));
if (nodeToDropIn == null) { return; }
if(nodeToDropIn.Level > 0)
{
nodeToDropIn = nodeToDropIn.Parent;
}
object data = e.Data.GetData(typeof(DateTime));
if (data == null) { return; }
nodeToDropIn.Nodes.Add(data.ToString());
this.listBox1.Items.Remove(data);
}
private void listBox1_DragOver(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Move;
}
private void treeView1_DragEnter(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Move;
}
private void listBox1_MouseDown(object sender, MouseEventArgs e)
{
this.listBox1.DoDragDrop(this.listBox1.SelectedItem, DragDropEffects.Move);
}
}
Вы хотите использовать функцию GetItemAt (Point point) для перевода места X, Y в элемент списка.
Вот неплохая статья об этом: Перетаскивание с использованием С#.
Чтобы перетащить элемент во время перетаскивания, вам необходимо использовать COM ImageList, который хорошо описан в следующей статье Пользовательские изображения перетаскивания, используя ImageLists.