一个WinForm的TreeView,某node的CheckBox初始状态为false,当双击这个node的checkbox时,会出现很奇怪的情况: 第一次双击checkbox,checkbox显示的状态会切换两次状态,unchecked-> checked-> unchecked,而AfterCheck事件仅触发一次,在AfterCheck事件中获取到的checkbox状态为checked。在这里checkbox状态已经和显示状态不一致了 以后每次双击,checkbox显示的状态会出现一次切换,AfterCheck也会触发一次,并且checkbox显示的状态和值的状态仍然保持相反。 除上面这个问题外,还有一点,当双击treeview 的checkbox后,如果再去单击或双击该界面中除这个treeview外的任何部分,系统会忽略第一次点击事件。举例来说,一个窗口中,有一个treeview,还有一个ok按钮,当我双击这个treeview的一个checkbox后,再去点那个ok按钮,第一次点击是没有任何作用的,第二次以及以后的点击才会有效,包括点击最大化,最小化,以及关闭这种系统按钮。 为了解决以上问题,我重写了TreeView控件,在不影响其它地方的前提下,能很好的解决以上问题。
using System.Windows.Forms; using System.Drawing; namespace testTreeView { public partial class TreeViewEx : TreeView { private const int WM_LBUTTONDBLCLK = 0x0203; private const int WM_RBUTTONDOWN = 0x0204; protected override void WndProc(ref Message m) { if (m.Msg == WM_LBUTTONDBLCLK) { TreeViewHitTestInfo tvhti = HitTest(new Point((int)m.LParam)); if (tvhti != null && tvhti.Location == TreeViewHitTestLocations.StateImage) { m.Result = IntPtr.Zero; return; } } else if (m.Msg == WM_RBUTTONDOWN) { TreeViewHitTestInfo tvhti = HitTest(new Point((int)m.LParam)); if (tvhti != null) this.SelectedNode = tvhti.Node; } base.WndProc(ref m); } } }
浙公网安备 33010602011771号