禁用按钮
本文关键字:按钮 | 更新日期: 2023-09-27 18:11:50
我想防止用户在按钮已经执行并且过程尚未完成时两次单击按钮。
我正在使用紧凑的框架3.5,我有问题,当用户点击两次按钮,已经执行或其他一些按钮。我想在程序执行时禁用所有按钮,并在进程完成时再次启用它们。
操作系统:Windows mobile 6.1
框架:.NET 3.5 CF
尝试添加这个。Enabled = false在Click处理程序范围内的第一件事(这是有问题的表单)。完成后,请确保将其设置为true。如果这些都在处理程序的范围内,您可能需要使用Application.DoEvents()或Update()来显示可见的进度。也许做任何扩展处理的首选方法是生成一个后台线程,并使用Invoke和BeginInvoke从它更新你的UI。
我发现在构建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建议的是,你不需要在每个控件上调用刷新,而只是使控件无效,然后刷新容器,这将导致所有无效的控件立即重新绘制。我还没有测试过这个,但一个小的变化,如…
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);
这是最简单的方法,对于一个名为button1
的按钮:
void button1_Clicked(object sender, EventArgs e) {
button1.Enabled = false;
try {
// put your code here
} finally {
button1.Enabled = true;
}
}