эффект перетаскивания c # winform treeview

#c# #winforms #.net-2.0

#c# #winforms #.net-2.0

Вопрос:

Я хотел бы указать пользователю, что они пытаются перетащить на неправильный уровень узла, изменив значок на мыши. Кажется, я не могу разобраться с этим … есть предложения?

Ответ №1:

Удаление в treeview — сомнительное предложение, узел, на который пользователь хотел бы перейти, может быть не виден. Либо потому, что он свернут и скрыт, либо прокручивается за пределы экрана. В любом случае, вы хотите использовать событие перетаскивания и проверить, где находится мышь. Вот пример формы, которая делает это. Поместите на него treeview и добавьте несколько узлов. Нажмите на форму и перетащите. Он разрешает перетаскивание только на узлах 2-го уровня:

 public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        treeView1.AllowDrop = true;
        treeView1.DragEnter  = treeView1_DragEnter;
        treeView1.DragOver  = treeView1_DragOver;
    }
    protected override void OnMouseDown(MouseEventArgs e) {
        DoDragDrop("foo", DragDropEffects.Copy);
        base.OnMouseDown(e);
    }
    private void treeView1_DragEnter(object sender, DragEventArgs e) {
        // TODO: check e.Data
        e.Effect = DragDropEffects.Copy;
    }
    private void treeView1_DragOver(object sender, DragEventArgs e) {
        Point pos = treeView1.PointToClient(new Point(e.X, e.Y));
        var hit = treeView1.HitTest(pos);
        TreeNode node = hit.Node;
        if (hit.Node != null) {
            node.Expand();
            if (node.Level != 1) node = null;
        }
        e.Effect = node != null ? DragDropEffects.Copy : DragDropEffects.None;
    }
}
  

Ответ №2:

Проверьте http://msdn.microsoft.com/en-us/library/system.windows.forms.drageventargs.aspx для документации DragEventArgs. Для этого эффекта следует установить значение none:

   e.Effect = DragDropEffects.None;