Хотя я считаю, что написание этого кода - пустая трата времени, учитывая отсутствие реакции на комментарии со стороны OP, по крайней мере я могу показать, как пример кода Le-Savard может быть исправлен так, чтобы множественные клики выбор вверх или вниз в контекстном меню ... при условии, что контекстное меню не закрывается автоматически каждый раз, и пользователь вынужден снова и снова выбирать один и тот же узел ... будет делать правильные действия с изначально выбранным узлом, а не создавать непреднамеренные побочные эффекты:
public static class Extensions
{
public static void MoveUp(this TreeNode node)
{
TreeNode parent = node.Parent;
if (parent != null)
{
int index = parent.Nodes.IndexOf(node);
if (index > 0)
{
parent.Nodes.RemoveAt(index);
parent.Nodes.Insert(index - 1, node);
// bw : add this line to restore the originally selected node as selected
node.TreeView.SelectedNode = node;
}
}
}
public static void MoveDown(this TreeNode node)
{
TreeNode parent = node.Parent;
if (parent != null)
{
int index = parent.Nodes.IndexOf(node);
if (index < parent.Nodes.Count - 1)
{
parent.Nodes.RemoveAt(index);
parent.Nodes.Insert(index + 1, node);
// bw : add this line to restore the originally selected node as selected
node.TreeView.SelectedNode = node;
}
}
}
}
Конечно, это исправление по-прежнему не учитывает тот факт, что в примере кода, что несколько корневых узлов не могут быть перемещены (поскольку они «без родителей»): это легко исправить.
Также это не относится к более интересному случаю, когда перемещение вверх по верхнему дочернему узлу означает, что вы делаете некоторую интерпретацию того, куда должен идти этот «продвигаемый» дочерний код: точно такой же «стратегический выбор» используется там, где вы «двигаетесь вниз». последний дочерний узел родительского узла и, следовательно, должен решить, куда он должен идти. В коде Dynami Le-Savard: эти случаи просто игнорируются.
Однако design-choice ограничивает перемещение дочерних узлов только в пределах своих родительских узлов. Коллекция узлов: выбор конструкции, который может идеально подходить для одного решения.
Аналогично, это выбор дизайна , чтобы заставить пользователя выбрать узел и щелкнуть по контексту, чтобы получить контекстное меню, в котором можно выбрать перемещение вверх или вниз каждый раз, когда он хочет чтобы переместить его : я бы не выбрал дизайн: я бы использовал перетаскивание или кнопки, которые позволяют повторять быстрое перемещение любого выбранного узла в любом месте дерева.
Кстати, мне нравится, что Dynami Le-Savard использует здесь расширения.