有没有一种方法在C#中等到用户完成在文本框中键入之后才能获取他们键入的值而没有输入?
稍微修改了这个问题:
好吧,我有一个简单的计算器乘以2.
这就是我想要它做的事情:用户在文本框中输入一个1000之类的值,它会自动显示2000.
这是发生的事情:一旦用户输入1,它的乘以2并输出2.
ess*_*kar 49
我现在定义"完成打字",因为"用户输入了一些内容但在一段时间后没有输入任何内容".作为一个定义,我写了一个从TextBox派生的小类,通过一个DelayedTextChanged事件来扩展它.我不确保完整且没有bug,但它满足了小型烟雾测试.随意更改和/或使用它.我打电话给它,MyTextBox因为我现在无法想出一个更好的名字.您可以使用该DelayedTextChangedTimeout属性更改等待超时.默认值为10000毫秒(= 10秒).
public class MyTextBox : TextBox
{
private Timer m_delayedTextChangedTimer;
public event EventHandler DelayedTextChanged;
public MyTextBox() : base()
{
this.DelayedTextChangedTimeout = 10 * 1000; // 10 seconds
}
protected override void Dispose(bool disposing)
{
if (m_delayedTextChangedTimer != null)
{
m_delayedTextChangedTimer.Stop();
if (disposing)
m_delayedTextChangedTimer.Dispose();
}
base.Dispose(disposing);
}
public int DelayedTextChangedTimeout { get; set; }
protected virtual void OnDelayedTextChanged(EventArgs e)
{
if (this.DelayedTextChanged != null)
this.DelayedTextChanged(this, e);
}
protected override void OnTextChanged(EventArgs e)
{
this.InitializeDelayedTextChangedEvent();
base.OnTextChanged(e);
}
private void InitializeDelayedTextChangedEvent()
{
if (m_delayedTextChangedTimer != null)
m_delayedTextChangedTimer.Stop();
if (m_delayedTextChangedTimer == null || m_delayedTextChangedTimer.Interval != this.DelayedTextChangedTimeout)
{
m_delayedTextChangedTimer = new Timer();
m_delayedTextChangedTimer.Tick += new EventHandler(HandleDelayedTextChangedTimerTick);
m_delayedTextChangedTimer.Interval = this.DelayedTextChangedTimeout;
}
m_delayedTextChangedTimer.Start();
}
private void HandleDelayedTextChangedTimerTick(object sender, EventArgs e)
{
Timer timer = sender as Timer;
timer.Stop();
this.OnDelayedTextChanged(EventArgs.Empty);
}
}
Run Code Online (Sandbox Code Playgroud)
Roo*_*lie 15
另一个简单的解决方案是在表单中添加一个计时器,将Interval属性设置为250,然后使用计时器的tick事件,如下所示:
private void timer1_Tick(object sender, EventArgs e)
{
timer1.Stop();
Calculate(); // method to calculate value
}
private void txtNumber_TextChanged(object sender, EventArgs e)
{
timer1.Stop();
timer1.Start();
}
Run Code Online (Sandbox Code Playgroud)
oki*_*ieh 15
如果您使用的是WPF和.NET 4.5或更高版本,则在名为"Delay"的控件的Binding部分上会有一个新属性.它定义了更新源之后的时间跨度.
<TextBox Text="{Binding Name, Delay=500}" />
Run Code Online (Sandbox Code Playgroud)
这意味着源仅在500毫秒后更新.据我所知,它在TextBox输入结束后进行了更新.顺便说一句.此属性在其他场景中也很有用,例如.ListBox等
我面临着同样的挑战,这是我的简单方法。这没有问题。
public partial class Form2 : Form
{
static int VALIDATION_DELAY = 1500;
System.Threading.Timer timer = null;
public Form2()
{
InitializeComponent();
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
TextBox origin = sender as TextBox;
if (!origin.ContainsFocus)
return;
DisposeTimer();
timer = new System.Threading.Timer(TimerElapsed, null, VALIDATION_DELAY, VALIDATION_DELAY);
}
private void TimerElapsed(Object obj)
{
CheckSyntaxAndReport();
DisposeTimer();
}
private void DisposeTimer()
{
if (timer != null)
{
timer.Dispose();
timer = null;
}
}
private void CheckSyntaxAndReport()
{
this.Invoke(new Action(() =>
{
string s = textBox1.Text.ToUpper(); //Do everything on the UI thread itself
label1.Text = s;
}
));
}
}
Run Code Online (Sandbox Code Playgroud)
您可以处理文本框的LostFocus事件,该事件将在用户每次完成输入时触发并从文本框导航.以下是LostFocus的文档:http://msdn.microsoft.com/en-us/library/system.windows.forms.control.lostfocus.aspx
但是,我不确定你到底想要做什么,因为问题不是很明确"完成"的含义.
小智 5
在 UWP 中,我通过创建静态 lastTimeOfTyping 并检查“TextChanged”事件发生的时间来进行延迟检查。当新的“TextChanged”时间匹配时,这会等待静态 lastTimeOfTyping 匹配,然后执行所需的功能。
private const int millisecondsToWait = 500;
private static DateTime s_lastTimeOfTyping;
private void SearchField_OnTextChanged(object sender, TextChangedEventArgs e)
{
var latestTimeOfTyping = DateTime.Now;
var text = ((TextBox)sender).Text;
Task.Run(()=>DelayedCheck(latestTimeOfTyping, text));
s_lastTimeOfTyping = latestTimeOfTyping;
}
private async Task DelayedCheck(DateTime latestTimeOfTyping, string text)
{
await Task.Delay(millisecondsToWait);
if (latestTimeOfTyping.Equals(s_lastTimeOfTyping))
{
// Execute your function here after last text change
// Will need to bring back to the UI if doing UI changes
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用文本框onChange()事件。如果文本框中的文本发生变化,请检查输入的值是否为数字,并根据其他值计算总计值。