[英]C# windows forms handle click spam
我有一个应用程序,其中包含许多用户控件和每个按钮上的许多按钮,每个按钮都有一个OnClick事件,它执行一些重要的事情然后发送到新的用户控件。
问题出现在用户多次点击非常快,事件代码在退出到新用户控件之前多次执行,从而导致问题。
我目前的解决方案是禁用事件处理程序第一行的按钮,但对每个窗口和处理程序执行此操作会很麻烦,我该怎么办?
编辑:它是一个很好的解决方案从Button派生,并覆盖OnClick事件,所以它总是检查“工作”变量,如果它是真的,它不会启动事件? 就像是:
public class MyButton : Button
{
private static bool isWorking = false;
protected override void OnClick(EventArgs e)
{
if (!isWorking)
{
isWorking = true;
base.OnClick(e);
isWorking = false;
}
//Else do nothing
}
}
您可以使用一些timeStamp
来延迟2次点击:
DateTime timeStamp;
//this will handle the clicks with the allowed interval being 0.5 second
//Note that a tick is equal to 1/10,000,000 of second.
private void click_Handler(object sender, EventArgs e) {
if ((DateTime.Now - timeStamp).Ticks < 5000000) return;
timeStamp = DateTime.Now;
//your code goes here ....
}
如果您希望所有按钮等到一个按钮的工作完成,请将bool isProcessing
变量添加到表单中。 将每个按钮的工作包装在if (!isProcessing)
,并在if语句的第一行中将该标志设置为true。 然后在退出if之前不要忘记将其设置为false。
我假设您正在异步执行所有这些操作,因为如果它在同一个线程中,则表单将在处理工作时锁定。 这将解决您的问题。
在敏感操作正在进行时禁用控件是我经常应用的典型解决方案。
但是由于在一个屏幕上可能存在相当多的控件受到UI中的某些点击或更改的影响,我通常会设计表单以使用专门的方法遍历所有受影响的控件并相应地禁用/启用它们。
像这样的东西:
void EnableControls(bool enable)
{
foreach (Control ctl in this.Controls)
ctl.Enabled = enable;
}
同样,您可以将控件分组到相关的存储桶中,以便仅禁用/启用其中一个等。取决于您的确切需求。
还有另一种使用计时器的解决方案 - 禁用按钮,但在1秒后启用它。 这可以防止紧张用户多次点击,如果这会导致数据损坏(即每次点击都被视为新操作)。
我会从每个按钮调用相同的函数,然后执行特定的任务:
private void Button_Click(object sender, EventAgrs e)
{
Button btn = sender;
btn.disable = true;
switch (btn.AccessibleName)
// call specific function for the particular button or do it all here
}
我不确定这是否可行,但只是一个想法......
您可以尝试使用面向方面的方法(例如在Postsharp的帮助下):
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.