Подавить событие AfterSelect при перемещении узла в TreeView - PullRequest
0 голосов
/ 08 июля 2019

Я перемещаю TreeNode в элементе управления Windows Forms TreeView в результате события DragDrop:

void treeViewDragDrop(object sender, DragEventArgs e)
{
    // ...
    sourceNode.Remove();
    targetNode.Nodes.Add(sourceNode);
}

Однако вызов Remove вызывает событие AfterSelect объекта TreeView, на которое мне нужно реагировать, если выбор действительно изменяется.

Но в этом случае видимое изменение выбора является только результатом временного удаления узла. Я не хочу, чтобы выбор вообще изменился после того, как узел наконец переместился в свое целевое местоположение в дереве.

Итак, как правильно решить эту ситуацию, т. Е. Как подавить изменения выбора из-за движущихся узлов?

1 Ответ

1 голос
/ 09 июля 2019

Если вы не установили выбор программно, вы можете отменить выбор в событии BeforeSelect, если действие не создано пользователем:

private void TreeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e)
    {
        if (e.Action == TreeViewAction.Unknown)
            e.Cancel=true;
    } 

Если вы измените выделение программно, вы можете использовать простой обходной путь, расширив класс TreeView и установив своего рода «флаг»:

public class MyTreeViwe : TreeView
{
    public bool IsSuspendSelection { get; set; }

    protected override void OnBeforeSelect(TreeViewCancelEventArgs e)
    {
        if (IsSuspendSelection)
            e.Cancel = true;
        else base.OnBeforeSelect(e);
    }
}

затем выполните:

var tv = sourceNode.TreeView;
tv.IsSuspendSelection=true;
sourceNode.Remove();
tv.IsSuspendSelection=false;

Вы также можете отписаться, а затем снова подписаться на событие AfterSelect на sourceNode.TreeView, но я лично нахожу этот метод подверженным аварии. Нет способа узнать, подписан ли данный делегат на данное событие и сколько раз. Вы можете подписаться на событие несколько раз, и тогда ваш метод делегата AfterSelect будет запущен более одного раза.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...