禁止控件在C#中接收事件

时间:2009-05-05 12:02:44

标签: c# winforms .net-2.0 controls

我在其中有一个加载控件的对话框。每个和evey控件将在加载序列期间填充,并且可能需要一段时间才能完全填充。同时,我想让用户点击任何控件。换句话说,我想禁用控件接收事件,我不想禁用控件(因为它可能看起来很奇怪)。另外,我不想订阅和取消订阅事件定期间隔。有没有办法阻止控件在短时间内收听事件?

Sudarsan Srinivasan

4 个答案:

答案 0 :(得分:4)

禁用控件的重点是向用户传达控件无法在特定时间使用。这是用户已经学习并习惯的惯例,因此我建议遵循这一惯例。不这样做可能会使用户感到困惑。

最简单的方法是禁用控件所在的容器,而不是禁用每个控件。更好的方法(或者至少是我喜欢的方式)是有一个方法可以根据UI所处的状态来控制控件的VisibleEnabled属性。

答案 1 :(得分:2)

最简单的方法是将控制填充移出加载事件(如果可能)。然后在Load中做类似的事情:

private bool _LoadComplete;

void OnFormLoad(Object sender, EventArgs e)
{
    _LoadComplete = true;
    InitializeControls();
    _LoadComplete = false;
}

void InitializeControls()
{
    // Populate Controls
}

void OnSomeControlEvent()
{
    if (_LoadComplete)
    {
         // Handle the event
    }
}

编辑其他一些想法:

  • 设置Application.Cursor = WaitCursor(通常会禁止点击,但不是100%保证)
  • 创建一个“Spinner”控件,让用户知道屏幕正忙。当装载时将其带到前面,使其位于顶部并覆盖所有其他控件。完成加载后,将其设置为visible = false并显示其他控件

答案 2 :(得分:1)

不幸的是,我知道的唯一方法是拥有一个类变量(称为_loading),并在每个控制处理程序中执行以下操作:

If (! _loading )
{
    ...
}

加载完成后,在加载代码集_loading = true;中。

答案 3 :(得分:0)

如果您只想禁用用户输入,则可以将表单的Enabled属性设置为false。

这样可以阻止用户输入任何表单的控件,而不会改变控件的外观;它是ShowDialog方法在内部使用的技术。