c# - 对 textbox_textchanged 强制延迟

文章介绍了如何在C#中处理TextBox的TextChanged事件,以等待用户输入特定数量的字符(10或13位的ISBN编号)后再执行相应操作。通过使用Timer组件,可以实现延迟触发,避免每次按键都进行检查,确保在用户完成输入后才执行搜索或验证。此外,还提供了一个自定义的DelayTextBox控件示例,用于在特定延迟时间后触发OnTextChanged事件。
摘要由CSDN通过智能技术生成

我有一个模拟键盘输入的条形码扫描仪。我使用它在文本框中输入 ISBN 编号,然后执行对该标题的搜索。我需要 textbox 方法在做任何事情之前等待 10 或 13 个字符的输入,但是我不知道如何去做。

到目前为止,我有以下几点:

private void scanBox_TextChanged(object sender, EventArgs e)
        {

            if (scanBox.Text.Length == 10)
            {
                getRecord10();
            }
            else if (scanBox.Text.Length == 13)
            {
                getRecord13();
            }
            else
            {
                MessageBox.Show("Not in directory", "Error");
            }
        }

我正在考虑某种计时器实现来推迟最后一个条件,但我真正需要的是等待 10 或 13 位数字的方法。条码扫描器模拟被按下的单个键,这就是它当前失败的原因。

最佳答案

您可以使用 Timer(或 WPF 中的 DispatcherTimer)。此示例应用程序在最后一次击键后 300 毫秒更新窗口的标题。

    System.Windows.Forms.Timer _typingTimer; // WinForms
    // System.Windows.Threading.DispatcherTimer _typingTimer; // WPF

    public MainWindow()
    {
        InitializeComponent();
    }

    private void scanBox_TextChanged(object sender, EventArgs e)
    {
        if (_typingTimer == null)
        {
            /* WinForms: */
            _typingTimer = new Timer();
            _typingTimer.Interval = 300;
            /* WPF: 
            _typingTimer = new DispatcherTimer();
            _typingTimer.Interval = TimeSpan.FromMilliseconds(300);
            */

            _typingTimer.Tick += new EventHandler(this.handleTypingTimerTimeout);
        }
        _typingTimer.Stop(); // Resets the timer
        _typingTimer.Tag = (sender as TextBox).Text; // This should be done with EventArgs
        _typingTimer.Start(); 
    }

    private void handleTypingTimerTimeout(object sender, EventArgs e)
    {
        var timer = sender as Timer; // WinForms
        // var timer = sender as DispatcherTimer; // WPF
        if (timer == null)
        {
            return;
        }

        // Testing - updates window title
        var isbn = timer.Tag.ToString();
        windowFrame.Text = isbn; // WinForms
        // windowFrame.Title = isbn; // WPF

        // The timer must be stopped! We want to act only once per keystroke.
        timer.Stop();
    }

部分代码取自 Roslyn 语法可视化工具

关于c# - 对 textbox_textchanged 强制延迟,我们在Stack Overflow上找到一个类似的问题: c# - Enforcing a delay on textbox_textchanged - Stack Overflow

====================================

C# 文本框 TextChanged 延时触发

public partial class DelayTextBox : TextBox
    {
        #region private globals

        private System.Timers.Timer DelayTimer; // used for the delay
        private bool TimerElapsed = false; // if true OnTextChanged is fired.
        private bool KeysPressed = false; // makes event fire immediately if it wasn't a keypress
        
        
        #endregion

        #region object model

        // Delay property
        private int delayTime = 3000;

        public int DelayTime
        {
            get { return delayTime; }
            set { delayTime = value; }
        }
        
        #endregion

        #region ctor

        public DelayTextBox()
        {
            InitializeComponent();

            // Initialize Timer
            DelayTimer = new System.Timers.Timer(delayTime);
            DelayTimer.Elapsed += new ElapsedEventHandler(DelayTimer_Elapsed);
        }

        #endregion

        #region event handlers

        void DelayTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            // stop timer.
            DelayTimer.Enabled = false;

            // set timer elapsed to true, so the OnTextChange knows to fire
            TimerElapsed = true;

            // use invoke to get back on the UI thread.
            this.Invoke(new DelayOverHandler(DelayOver), null);
        }

        #endregion

        #region overrides

        protected override void OnKeyPress(KeyPressEventArgs e)
        {
            if (!DelayTimer.Enabled)
                DelayTimer.Enabled = true;
            else
            {
                DelayTimer.Enabled = false;
                DelayTimer.Enabled = true;
            }

            KeysPressed = true;
            base.OnKeyPress(e);
        }

        protected override void OnTextChanged(EventArgs e)
        {
            // if the timer elapsed or text was changed by something besides a keystroke
            // fire base.OnTextChanged
            if (TimerElapsed || !KeysPressed)
            {
                TimerElapsed = false;
                KeysPressed = false;
                base.OnTextChanged(e);
            }
        }

        #endregion

        #region delegates

        public delegate void DelayOverHandler();

        #endregion

        #region private helpers

        private void DelayOver()
        {
            OnTextChanged(new EventArgs());
        }

        #endregion

    }

============================

DevExpress控件库----FlyoutPanel提示控件

DevExpress控件库----FlyoutPanel提示控件

第一步:拖一个FlyoutPanel控件到WinForm窗体上。名称为 flyoutPanel1

设置在什么控件上显示提示信息:

设置在 panelControl1控件上显示提示信息

  flyoutPanel1.OwnerControl = panelControl1;

在鼠标移入panelControl1上时 显示提示信息:

  private void panelControl1_MouseEnter(object sender, EventArgs e)
        {
            flyoutPanel1.ShowBeakForm();
        }

如图:

在提示框中显示提示按钮的设置:

关闭按钮的事件:

复制代码

  private void flyoutPanel1_ButtonClick(object sender, DevExpress.Utils.FlyoutPanelButtonClickEventArgs e)
        {
            if (e.Button.Caption.Equals("关闭"))
            {
                flyoutPanel1.HideBeakForm();
            }
        }

复制代码

显示效果:

提示显示在控件的底部:

this.flyoutPanel1.OptionsBeakPanel.BeakLocation = DevExpress.Utils.BeakPanelBeakLocation.Top;

复制代码

 Point GetHotPoint(Control control)
        {
         
            Point pt = new Point(control.Width / 2, 0);
            
            if (flyoutPanel1.OptionsBeakPanel.BeakLocation==DevExpress.Utils.BeakPanelBeakLocation.Top)
            {
                pt.Y += control.Height;
            }

            return control.PointToScreen(pt);
        }
        private void panelControl1_MouseEnter(object sender, EventArgs e)
        {
            if (flyoutPanel1.FlyoutPanelState.IsActive)
            {
                return;
            }
            flyoutPanel1.ShowBeakForm(GetHotPoint(panelControl1));
        }

复制代码

显示效果图:

 此文为自己学习笔记!!如果有什么错误的地方!请指正!! https://www.cnblogs.com/xieyong_198510/p/4689711.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用 ASP.NET UpdatePanel 的简单示例,其中触发器为文本框失去焦点,调用 TextBox1_TextChanged 函数,更改 Label1 的内容: ``` <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager> <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional"> <ContentTemplate> <!-- UpdatePanel 中的内容 --> <asp:TextBox ID="TextBox1" runat="server" AutoPostBack="true" OnTextChanged="TextBox1_TextChanged"></asp:TextBox> <asp:Label ID="Label1" runat="server" Text="Hello World"></asp:Label> </ContentTemplate> <Triggers> <asp:AsyncPostBackTrigger ControlID="TextBox1" EventName="TextChanged" /> </Triggers> </asp:UpdatePanel> <script type="text/javascript"> function pageLoad() { // 在页面加载时注册文本框的失去焦点事件 var textBox = document.getElementById('<%= TextBox1.ClientID %>'); textBox.onblur = function() { __doPostBack('<%= TextBox1.ClientID %>', ''); } } </script> ``` 在上面的示例中,使用了 ASP.NET UpdatePanel 控件来实现异步更新 Label 的内容。当文本框失去焦点时,会触发 TextChanged 事件,在事件处理函数中更新 Label 的 Text 属性,然后将 UpdatePanel 的 UpdateMode 属性设置为 Conditional,以便在需要更新时才更新 UpdatePanel 中的内容。 需要注意的是,在 UpdatePanel 中需要设置 Triggers 属性来指定触发异步请求的控件和事件。在本例中,使用了 AsyncPostBackTrigger 来指定 TextBox1 的 TextChanged 事件作为异步请求的触发器。同时需要将 TextBox1 的 AutoPostBack 属性设置为 true,以便在文本框失去焦点时自动提交表单。 为了让文本框失去焦点时触发异步请求,需要在页面加载时注册文本框的失去焦点事件,使用 __doPostBack 函数手动提交表单。在本例中,使用了 JavaScript 来注册文本框的失去焦点事件。注意要使用 <%= TextBox1.ClientID %> 来获取文本框的客户端 ID,因为 ASP.NET 会自动生成一个不同于服务器控件 ID 的客户端 ID。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值