我希望阻止用户在按钮上执行两次单击并且该过程尚未完成。
我正在使用紧凑的框架3.5,当用户在已经执行的按钮或其他按钮上单击两次时,我遇到了问题。我想在程序执行时禁用所有按钮,并在完成该过程后再次启用它们。
操作系统:Windows mobile 6.1
框架:.NET 3.5 CF
答案 0 :(得分:3)
尝试在Click处理程序的范围内添加this.Enabled = false第一件事(这是有问题的表单)。完成后务必将其设置为true。如果在处理程序的范围内全部显示,则可能需要Application.DoEvents()或Update()来显示可见进度。可能执行任何扩展处理的首选方法是生成后台线程并使用Invoke和BeginInvoke从中更新UI。
答案 1 :(得分:2)
我发现在构建Windows移动应用程序时我经常需要这样做,所以做了一个简单的实用程序类。
public static class FormUtility
{
/// <summary>
/// Lock the form whilst processing
/// </summary>
/// <param name="controlCollection"></param>
/// <param name="enabled"></param>
public static void FormState(Control.ControlCollection controlCollection, bool enabled)
{
foreach (Control c in controlCollection)
{
c.Enabled = enabled;
c.Invalidate();
c.Refresh();
}
}
}
然后,我需要做的就是调用一行来锁定表单。
FormUtility.FormState(this.Controls, false);
你最终会得到像
这样的东西 private void btnSave_Click(object sender, EventArgs e)
{
FormUtility.FormState(this.Controls, false);
//Do your work
if (!SaveSuccessful())
//Renable if your validation failed
FormUtility.FormState(this.Controls, true);
}
编辑:我认为@tcarvin建议的是你不需要在每个控件上调用refresh,而只是使控件无效,然后刷新容器,这将导致所有无效的控件一次重绘。我没有对此进行过测试,只是对......之类的小改动进行了测试。
public static void FormState(Form form, bool enabled)
{
foreach (Control c in form.Controls)
{
c.Enabled = enabled;
c.Invalidate();
}
form.Refresh();
}
然后使用
FormUtility.FormState(this, true);
答案 2 :(得分:0)
对于名为button1
的按钮:
void button1_Clicked(object sender, EventArgs e) {
button1.Enabled = false;
try {
// put your code here
} finally {
button1.Enabled = true;
}
}