【问题标题】:c# Interrupt an executing Key event from a TextBox at the next key eventc# 在下一个按键事件时从 TextBox 中断正在执行的按键事件
【发布时间】:2010-10-14 14:27:21
【问题描述】:

我正在使用来自 TextBox 的输入来过滤 ListBox 中显示的信息。我希望每次按下某个键时都会进行过滤。

我面临的问题是,如果用户键入第二个、第三个等字符,过滤器将在每次按键时继续执行。例如。用户键入“a”并开始过滤,在完成对字母“a”的过滤之前,用户添加了字母“b”,因此完整的搜索字符串现在是“ab”。

此时,我希望第一个过滤器完全停止并从头开始在“ab”上启动新过滤器。

private bool Interrupt = false;
private bool Searching = true;

private void tbxFilter_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (Searching)
    {
        Interrupt = true;
    }
}

private void tbxFilter_KeyUp(object sender, KeyEventArgs e)
{
    Searching = true;

    foreach (MyObject o in ListOfMyObjects)
    {
        if (Interrupt)
        {
            Interrupt = false;
            break;
        }
        else
        {
            DoFilter(o);
        }
    }

    Searching = false;
}

上面的代码大致显示了我目前所拥有的内容,其中删除了一些特定于应用程序的部分(如类型和对象名称)。

我最理想的做法是能够在第二次按键开始时暂停(直到 Searching 设置为 false - 表示所有其他搜索都已退出),但添加一个 while 循环来检查将在此时锁定程序。

有没有办法做到这一点?

谢谢

编辑:显示项目的控件是 ListBox / ListView 控件。

【问题讨论】:

  • 为什么不使用组合框的自动完成功能呢?一切都为您解决
  • 显示项目的控件是 ListBox 或 ListView 控件。很抱歉没有在上面指定。
  • 不,没关系,我知道了,我只是想知道它是否必须是一个列表框,或者您是否可以使用组合框,因为它的功能与您需要的内置功能非常相似,可以节省你必须写这个

标签: c# wpf events textbox key


【解决方案1】:

我会为过滤创建一个工作线程。当一个新的过滤进程启动时,正在运行的工作线程被取消(通过设置标志或取消令牌,请参阅 .net 4.0 任务类)。

当线程完成时,您获取结果并将其显示在 GUI 线程上的一个操作中。

【讨论】:

  • 使用单个动作来更新界面实际上是我以这种方式实现搜索的原因。我最初使用的是一个 ICollectionView,它有一个过滤器委托来提供内置过滤,过滤本身非常快(仍然没有我想要的那么快,但也许可以接受)但是,当更改在最后呈现时过程中,有几秒钟的延迟,在此期间 UI 完全没有响应,因为所有更改都在 UI 线程中进行。
  • 在 Windows.Forms 中,您可以在设置数据时使用 pinvoke 禁用更新。这会给你一个很大的加速。如果您使用的是 WPF,则有类似的方法(不是 pinvoke,但有优化)在一次调用中设置数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
  • 2017-09-09
相关资源
最近更新 更多