TreeView игнорировать двойной щелчок только при флажке
У меня есть treeview с флажком, я пытаюсь отключить двойной щелчок, только когда это делается в флажке.
Я нашел способ полностью отключить двойной щелчок, но это было не то, что я хотел.
Я ценю, если вы можете мне помочь.
Ответы
Ответ 1
Если вы просто хотите узнать о событии DoubleClick из CheckBox:
private void TreeViewDoubleClick(object sender, EventArgs e)
{
var localPosition = treeView.PointToClient(Cursor.Position);
var hitTestInfo = treeView.HitTest(localPosition);
if (hitTestInfo.Location == TreeViewHitTestLocations.StateImage)
return;
// ... Do whatever other processing you want
}
Ответ 2
Я нашел этот вопрос, когда искал ту же ошибку. Проблема с решением NoodleFolk заключается в том, что он отключает расширение трех, дважды щелкнув элемент. Объединив ответ NoodleFolk с ответом john arlens, вы получите что-то вроде этого:
class NewTreeView : TreeView
{
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x203) // identified double click
{
var localPos = PointToClient(Cursor.Position);
var hitTestInfo = HitTest(localPos);
if (hitTestInfo.Location == TreeViewHitTestLocations.StateImage)
m.Result = IntPtr.Zero;
else
base.WndProc(ref m);
}
else base.WndProc(ref m);
}
}
Я (быстро) протестировал это решение и, похоже, работает.
Ответ 3
Вариант 1: полностью отключить событие двойного щелчка.
Создание контроля клиента
class MyTreeView : TreeView
{
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0203)
{
m.Result = IntPtr.Zero;
}
else
{
base.WndProc(ref m);
}
}
}
и в файле вашего конструктора (form.Designer.cs), найдите, где был создан элемент управления, и замените вызов конструктора TreeView новым элементом управления.
this.treeView1 = new MyTreeView();
Вариант 2. Обработайте событие двойного щелчка в виде двух событий с одним кликом.
class MyTreeView : TreeView
{
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0203)
{
m.Msg = 0x0201;
}
base.WndProc(ref m);
}
}
Лично я думаю, что вариант 2 более интуитивно понятен. Когда пользователь дважды нажимает флажок, флажок не установлен.
Ответ 4
Объединив приведенные выше ответы, я нашел, что это лучшее решение для меня. Двойной щелчок на node для расширения его дочерних объектов по-прежнему работает, только двойной щелчок на флажке затронут и исправлен:
class MyTreeView : TreeView
{
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0203 && this.CheckBoxes)
{
var localPos = this.PointToClient(Cursor.Position);
var hitTestInfo = this.HitTest(localPos);
if (hitTestInfo.Location == TreeViewHitTestLocations.StateImage)
{
m.Msg = 0x0201;
}
}
base.WndProc(ref m);
}
}