【问题标题】:C# winforms TreeView sometimes selects wrong itemC# winforms TreeView 有时会选择错误的项目
【发布时间】:2016-05-26 07:49:49
【问题描述】:

我有一个带有 TreeView 的 winforms 项目。有时,当我选择某个项目时,会选择其他项目。我很确定没有任何代码可以覆盖选择。

https://www.dropbox.com/s/qutmu0tmrkjspc6/disablederrortreeview.rar?dl=0

这是示例项目。我需要更新树视图,因此有一个计时器会定期更新其内容(因此每秒一次的项目会被取消选择)但是当点击速度足够快时,有时它会选择不同的项目,而我没有点击。

有人知道问题可能是什么吗?是否有任何解决方法/修复方法可以防止这种情况发生?

谢谢

雅库布

【问题讨论】:

  • 我不会深入研究你的项目。但是,如果有一个 1Hz 定时器与用户点击并行运行,我当然会期待干扰.. 也许你可以在进入/离开时停止/启动定时器..?

标签: c# treeview


【解决方案1】:

两种行动:

您可以:在选择发生时禁用Tick 事件:

bool selecting = false;

private void treeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e)
{
    selecting = true;
}

private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
    selecting = false;
    // maybe you want to call the Tick now: 
    // timer1_Tick(null, null);
}

private void timer1_Tick(object sender, EventArgs e)
{
    if (selecting) return;
    // do your stuff
    ..
}

或者,您可以在 Tick 运行时禁用选择:

bool ticking = false;
TreeNode clickedNode = null;

private void treeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e)
{
    e.Cancel = ticking;
    clickedNode = e.Node;
}


private void timer1_Tick(object sender, EventArgs e)
{
    ticking = true;
    // do your stuff
    ticking = false;
    // try to select the clicked node
    if (clickedNode != null) 
      { treeView1.SelectedNode = clickedNode; clickedNode = null;}
}

【讨论】:

  • 谢谢你的回答,但恐怕那个计时器不会导致问题。即使您禁用了 Timer,当点击 TreeView 时,它有时也会选择错误的项目。
  • 在这种情况下,一定有代码把事情搞砸了。一定要调查 Before/AfterSelection 事件以及其他可疑事件,例如 Click、MouseUp/Down/Click 事件..
  • 这就是我创建这个应用程序的原因,没有修改 TreeView 的代码,除了 Timer Tick,它每秒只发生一次。因此,除了滴答声外,它不应干扰用户点击。我猜这是一些奇怪的 winforms 错误,它可能在 WPF 中已修复,但我必须使用 winforms。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-16
  • 1970-01-01
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
相关资源
最近更新 更多