Я обнаружил, что мне нужно было делать это довольно часто при создании приложения для Windows Mobile, поэтому создал простой служебный класс.
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);