【问题标题】:Double click ignored when there is a long logic in click event of .NET treeview.NET treeview的点击事件中存在长逻辑时,双击被忽略
【发布时间】:2014-07-23 07:29:42
【问题描述】:

我无法在 .net 树视图中捕捉双击事件。在点击事件中,我有一些耗时的逻辑(即更新 UI 部分的数据库调用)。所以由于这里的时间延迟,我在双击的情况下的第二次点击被忽略了,因此,树视图预期的正常行为(即双击展开)不起作用。 我的点击事件如下。

private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{ 
 if (e.Button == MouseButtons.Left)
{
//database call
}
}

当系统双击时间设置为最快时,数据库调用防止双击被触发。 我试图在其中实现一个线程,但我的应用程序阻止我在其中使用任何其他线程。因此,请提出一种方法,我可以在不使用线程的情况下触发双击事件(或让节点在双击时展开):(

提前谢谢你:)

【问题讨论】:

  • 这是什么意思:but my application prevents me from using any other thread within it?
  • 我不能使用其他线程。它给出了一个线程冲突异常,因为应用程序的其余部分是以这种方式创建的。如果可能的话,请建议一种没有线程的方法:(
  • 您使用的是哪个版本的 .net?
  • .NET 版本 4
  • 在双击的情况下,您还希望数据库代码也运行吗?一个简单的解决方案是在点击事件中启动一个计时器,当计时器到期时,它将运行数据库代码,您仍然可以按照其他人的建议在单独的线程中执行数据库代码。如果您不想在双击时运行数据库代码,您可以取消双击事件中的计时器。

标签: c# treeview double-click


【解决方案1】:

不要在主线程中做任何花费超过几毫秒的工作,它已经有很多工作要做。请让它做那些。

你可以在这里使用TPL..

var uiContext = TaskScheduler.FromCurrentSynchronizationContext();
var task = Task.Factory.StartNew(() =>
{
    //Your database call here, which will be run in threadpool thread
    return resultFromDatabase;
}, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default);
task.ContinueWith(antecedent =>
{
    var resultFromDatabase = antecedent.Result;//This runs in main thread
    //Update UI
}, CancellationToken.None, TaskContinuationOptions.None, uiContext);

StartNew 提供了许多重载,要知道为什么我选择了具有这么多参数的重载,你可以read it here,同样适用于ContinueWith

【讨论】:

  • 感谢您的建议。我会尝试将其放入我的代码中并查看:)
【解决方案2】:

我怀疑你是否可以绕过这个没有另一个线程来完成繁重的工作。在您的情况下发生的情况是,可能是资源密集型的 DB 调用正在您的事件处理程序中发生,该事件处理程序由事件调度程序线程执行,这是处理 GUI 的代码(包括对事件的响应不仅仅是渲染)。

理想的解决方案是使用后台工作器并让它完成繁重的工作。如果您需要做一些 GUI 操作,那么您可以查看this 之前的 SO 线程以获取更多信息。

话虽如此,如果你真的不能使用线程,你可以做的是在你的数据库操作之前禁用你的控件并在之后重新启用它。这应该会禁止用户通过该控件向您发送新事件,但话虽如此,应用程序很可能会在一段时间内变得无响应。

【讨论】:

    【解决方案3】:

    那么,理想情况下,数据库调用应该在另一个线程中进行。您应该考虑重构您的应用程序以使其成为可能。

    一种可能的解决方法是处理treeView_NodeMouseClick 中的右键单击(或中键单击),以便在左键双击时仍调用treeView_NodeMouseDoubleClick

    【讨论】:

    • 对于人民币我只想显示上下文菜单,因此不应为此发送数据库调用。典型行为是 LM 单击 - 使用 db 调用更新 UI;LM 双击 - 使用 db 调用更新 UI 并展开树视图; RMB - 显示上下文菜单而不更新 UI
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 2010-10-07
    • 2019-05-21
    相关资源
    最近更新 更多