C # TreeView.GetNodeAt () проблема с щелчком по изображениям

Я использую событие щелчка в TreeView, чтобы делать некоторые вещи при щелчке узла в TreeView. Я делаю это, получая узел, по которому щелкают, вызывая GetNodeAt () с координатами мыши, например:

private void TreeView_Click(object sender, System.EventArgs e)
{
    MouseEventArgs mouseEventArgs = e as MouseEventArgs;

    if (mouseEventArgs == null)
        return;

    // Get the node that is being clicked.                  
    TreeNode node = this.GetNodeAt(mouseEventArgs.X, mouseEventArgs.Y);

    // Do other stuff...
}

Однако метод GetNodeAt () работает только при щелчке по метке узла, при щелчке изображения узла GetNodeAt () возвращает значение null. Это немного раздражает, поскольку узел фактически выбирается при щелчке по изображению, но я не могу узнать, что это за узел.

Есть ли у кого-нибудь предложения?

Обновлено: я получил несколько предложений по использованию вместо этого SelectedNode. Я не могу, так как он устанавливается после запуска события Click. Фактически это в элементе управления, который наследует TreeView, и он запускает собственное событие Clicked, но с базовыми данными, которые представляет TreeNode, а не самим TreeNode.

Обновлено: оказывается, что кто-то переопределил метод GetNodeAt () в нашем коде, который ввел такое поведение, о котором я не подозревал. Таким образом, вопрос не имеет юридической силы, и нет никаких проблем с методом GetNodeAt (). Почему кто-то сделал это, остается загадкой. :)


person Sploofy    schedule 24.03.2009    source источник


Ответы (3)


Вы пробовали события BeforeSelect или AfterSelect? Вы можете получить выбранный узел прямо из TreeViewCancelEventArgs, а затем использовать его в своем событии Click.

Изменить: дополнительная мысль: единственная проблема, которую я вижу, заключается в том, что событие BeforeSelect на самом деле запускается после событий Click и MouseClick.

Другое редактирование: если вам нужно событие, которое запускается до Click, вы можете использовать NodeMouseClick - TreeNodeMouseClickEventArgs имеет свойство Node.

person Moose    schedule 24.03.2009
comment
Эти или SelectedNodeChanged должны быть событиями. Если вы не хотите что-то делать только тогда, когда мышь щелкает по нему, иначе использование клавиатуры может нарушить ваш код. - person Samuel; 24.03.2009
comment
Да, мне тоже потребовалось время, чтобы разобраться в себе, но Treeview.AfterSelect (или BeforeSelect), скорее всего, то, что вам нужно, а не событие щелчка. - person Davy8; 24.03.2009
comment
@Samuel - BeforeSelect и AfterSelect срабатывают даже при таком событии клавиатуры, как стрелка вверх. - person Moose; 24.03.2009
comment
Я знаю, я имел в виду, что вы должны следовать подходу Каспера, когда вам нужна только интерактивность мыши. - person Samuel; 24.03.2009
comment
Ой, извините, я думал, вы имели в виду, что это не сработает при использовании клавиатуры. Тогда продолжай! :-) - person Moose; 24.03.2009
comment
Я здесь пытаюсь исправить старый устаревший код, и, конечно же, должны были быть какие-то вещи, которые полагались на порядок, в котором вещи запускаются в AfterSelect, а BeforeSelect сломал вещи. NodeClicked, похоже, подойдет, спасибо. - person Sploofy; 24.03.2009

Почему бы просто не использовать TreeView.SelectedNode?

person Sean Bright    schedule 24.03.2009
comment
Я не могу, так как он устанавливается после запуска события Click. Фактически это в элементе управления, который наследует TreeView, и он запускает собственное событие Clicked, но с базовыми данными, которые представляет TreeNode, а не самим TreeNode. - person Sploofy; 24.03.2009

Пытаться:

TreeNode node = this.SelectedNode;

РЕДАКТИРОВАТЬ: Избитый до удара Шоном

person Chris Doggett    schedule 24.03.2009