我有一个模拟键盘输入的条形码扫描仪。我使用它在文本框中输入 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