【问题标题】:How to disable controls until a condition is met?如何在满足条件之前禁用控件?
【发布时间】:2011-08-13 18:26:04
【问题描述】:

目前在我的程序中大约有 10 个控制事件处理程序我有这个代码:

        if (!mapLoaded)
            return;

当我通过打开文件对话框加载地图时,我将 mapLoaded 设置为 true。另一种方法是禁用所有启动控件,并在加载地图后启用所有控件。不幸的是,有 30 多个控件,而这只是 30 行......

a.Enabled = true;
b.Enabled = true;
c.Enabled = true;

我无法真正通过 this.Controls 执行 foreach 循环,因为某些控件是菜单条项、工具条项、面板项、滚动条、拆分器等,而该循环并未涵盖这些。

理想情况下,有一种方法可以在一个简单的循环中将每个控件的 enabled 属性设置为 true,但我不知道该怎么做。有什么想法吗?

【问题讨论】:

    标签: c# winforms loops


    【解决方案1】:

    使用数据绑定:

    1. mapLoaded 更改为一个属性,当其值发生变化时通知观察者...

      public bool MapLoaded
      {
          get
          {
              return mapLoaded;
          }
          set
          {
              if (value != mapLoaded)
              {
                  mapLoaded = value;
                  MapLoadedChanged(this, EventArgs.Empty);
              }
          }
      }
      private bool mapLoaded;
      
      public event EventHandler MapLoadedChanged = delegate {};
      // ^ or implement INotifyPropertyChanged instead
      
    2. 将控件的Enabled 属性数据绑定到MapLoaded。您可以使用 Windows 窗体设计器或使用代码设置数据绑定,例如紧接着InitializeComponent();:

      a.DataBindings.Add("Enabled", this, "MapLoaded");
      b.DataBindings.Add("Enabled", this, "MapLoaded");
      c.DataBindings.Add("Enabled", this, "MapLoaded");
      

    【讨论】:

    • 这就是我要找的。我会试试看。谢谢!
    • 您说您可以使用 Windows 窗体设计器设置数据绑定。选择在哪里?选择控件时,我没有在属性窗口中看到 Bindings 或 DataBindings 属性。
    • @John,这通常涉及四个步骤(在 VS2010 中): 1. 在项目中添加一个新的对象数据源;在这种情况下,您需要将 Form 类本身添加为数据源。您可能必须先编译项目,以便Form 类在添加数据源 向导中可见。 2.BindingSource 组件添加到您的表单并为其选择Form 对象数据源。 3.Form 的构造函数中,设置formBindingSource.DataSource = this;4. 使用任何控件的属性中的高级绑定向导来定义数据绑定。
    【解决方案2】:

    改变你的打开策略怎么样,有一个让你的用户加载地图的新表单,并且在加载之前不加载你的主表单?

    【讨论】:

    • 这是一个不错的建议,但我更喜欢 stakx 的解决方案。尽管如此,还是投了赞成票。
    猜你喜欢
    • 2019-11-11
    • 2021-11-14
    • 2020-08-29
    • 2017-12-24
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    • 1970-01-01
    相关资源
    最近更新 更多