【问题标题】:WinForms TreeView Check Events Being LostWinForms TreeView 检查事件丢失
【发布时间】:2016-03-29 21:01:54
【问题描述】:

当我在 WinForms TreeView 中双击一个未选中的节点时,它在视觉上会变为选中,然后是未选中。

但是,以下事件处理程序检测到只有一个 AfterCheck 事件被触发:

private void treeView1_AfterCheck( object sender, TreeViewEventArgs e )
{
    System.Diagnostics.Debug.WriteLine( "{0} {1}: {2}", e.Node.Checked, e.Node, e.Action );
}

e.Node.Checkedtrue,即使 GUI 中的可视化表示未被选中。

再次单击复选框会引发AfterCheck 事件,其中Node.Checked 等于false。该复选框在 GUI 上保持未选中状态。

双击选中的节点反之亦然。

我正在使用 Visual Studio 2010 为 .NET 4.0 编译并在 .NET 4.5.1 上运行。

有什么办法可以解决这个问题?

【问题讨论】:

  • 我在其他之后添加了 e.Node.Checked 到 WriteLine。编辑得更加理智。
  • 当您双击树视图中的复选框时,不仅会在检查事件后出现问题,还会在您的下一次鼠标按下时出现问题,如果您单击树视图本身的其他任何位置,您的下一个鼠标点击将丢失。我可以确认该问题在 Windows XP 中不存在,但在 7 和 8.1 中存在。
  • @HansPassant 在旧帖子中也提到过:本机 Windows 控件的 Vista 版本在 TreeView 包装器中引入了一个错误。它会自动检查项目,而不会生成包装器可以检测到以引发 BeforeCheck 和 AfterCheck 事件的通知消息。

标签: c# .net winforms


【解决方案1】:

当您双击树视图中的复选框时,不仅会在检查事件后出现问题,还会在您的下一次鼠标按下时出现问题,如果您单击树视图本身的其他任何位置,您的下一次鼠标单击将丢失.

Hans Passant 在旧帖子中也提到过:原生 Windows 控件的 Vista 版本在 TreeView 包装器中引入了一个错误。它会自动检查项目,而不会生成包装器可以检测到以引发 BeforeCheck 和 AfterCheck 事件的通知消息。

我可以确认该问题在 Windows XP 中不存在,但在 7 和 8.1 中存在。

为解决问题,你可以处理WM_LBUTTONDBLCLK消息并检查是否双击复选框,忽略它:

public class ExTreeView : TreeView
{
    private const int WM_LBUTTONDBLCLK = 0x0203;
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_LBUTTONDBLCLK)
        {
            var info = this.HitTest(PointToClient(Cursor.Position));
            if (info.Location == TreeViewHitTestLocations.StateImage)
            {
                m.Result = IntPtr.Zero;
                return;
            }
        }
        base.WndProc(ref m);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-14
    • 2018-09-17
    • 2011-03-11
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    相关资源
    最近更新 更多