【问题标题】:Disabling a control from receiving a event in C#在 C# 中禁用控件接收事件
【发布时间】:2009-05-05 12:02:44
【问题描述】:

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

苏达桑·斯里尼瓦桑

【问题讨论】:

  • 您不想禁用控件,因为您说它看起来很奇怪,但是启用单击时不执行任何操作的控件不是更奇怪吗?

标签: c# winforms .net-2.0 controls


【解决方案1】:

禁用控件的全部意义在于向用户传达该控件不能在特定时间使用的信息。这是用户已经学习并习惯的约定,因此我建议您遵循该约定。不这样做可能会使用户感到困惑。

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

【讨论】:

    【解决方案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 并显示您的其他控件

    【讨论】:

    • 是的。我也得到了相同的解决方案。这是我所做的,1. 在所有其他控件之上放置一个面板 2. 通过覆盖控件的 ExStyle 和 CreateParams 属性使面板透明 3. 在繁忙操作期间控制面板的可见性 感谢您的建议
    【解决方案3】:

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

    If (! _loading )
    {
        ...
    }
    

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

    【讨论】:

      【解决方案4】:

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

      这具有阻止用户输入任何表单控件的效果,而不改变控件的外观;这是ShowDialog 方法内部使用的技术。

      【讨论】:

      • 不幸的是,我的是一个用户控件。托管在父窗体中的用户控件的整个对话框
      猜你喜欢
      • 1970-01-01
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-15
      • 1970-01-01
      • 2013-07-21
      • 2012-01-18
      相关资源
      最近更新 更多