【问题标题】:using a collection of comboboxes to change the Enabled Property使用组合框的集合来更改 Enabled 属性
【发布时间】:2020-07-08 22:44:34
【问题描述】:

我正在构建一个大型数据输入表单,并希望基于复选框启用或禁用组合框组(如果选中该复选框,则为用户输入启用组合框集合,反之亦然)。我想使用集合,因为组合框并不总是按顺序排列(例如:组合框 1-7,然后是组合框 12,然后是 16 和 45-57)。收藏似乎很理想。

我已经构建了集合,添加了组合框,并向组合框添加了项目。当我运行应用程序时,所有项目都在组合框中。我可以单独启用或禁用它们,但我不能将组合框作为一个集合启用/禁用。我如何将它们作为一个组启用或禁用?

如果我选择表单中的所有组合框,然后运行与变量匹配的名称的直通列表(例如,对于框 1 - 56),我可以让它工作,但这使得使用集合多余的。我还想在集合组中输出数据以供以后使用。

为此,我已经把头撞在墙上一天左右了..

声明收藏

 Dim CablesCollectionBoxes As New Collection

将组合框添加到集合中

CablesCollectionBoxes.Add(ComboBox1)
 CablesCollectionBoxes.Add(ComboBox2)
 CablesCollectionBoxes.Add(ComboBox3)
 .
 <removed for space and readability>
 .
 CablesCollectionBoxes.Add(ComboBox56)
 

我正在尝试将 ComboBoxes 的集合修改为禁用状态,但下面的代码不起作用。

for I as integer = 1 to 56
   CablesCollectionBoxes.Item(i) = Disabled 
 next

如果我使用它,它确实有效,但我没有使用集合,我正在运行所有组合框和匹配的名称:

For i As Integer = 1 To 56
    Dim clsCombo As ComboBox = DirectCast(Me.Controls.Find("ComboBox" & i.ToString(), True)(0), ComboBox)
    clsCombo.Enabled = True
Next

或者这个

    ComboBox1.Enabled = True
    ComboBox2.Enabled = True
    ComboBox3.Enabled = True
    ComboBox4.Enabled = True
     .
    <removed for space and readability>
     .
    ComboBox56.Enabled = True

如何作为一个组访问组合框并更改属性?我是否错误地声明了集合?

【问题讨论】:

  • 您必须设置每个控件的属性。它可以更短,如[Your List Collection].ForEach(Sub(c) c.Enabled = False)。无论如何,您都会迭代集合中的元素。您可以构建一个类对象,按组启用/禁用控件(通过 name 或其他方式)并构建集合,以简化运行时的过程。如果您无法将单个元素添加到单个父容器中,那么迭代单个元素是不可避免的。将属性绑定到设置是可能的,但是使用Enabled 属性很棘手,而且 IMO 不值得。迭代集合并不是一个问题
  • 首先,不要使用 Collection 类。这是 VB6 的保留,不应在新代码中使用。如果您想要ComboBoxes 的集合,请使用List(Of ComboBox)
  • 如果控件在表单上的布局使得组在一起,您可以将Panels 添加到表单,然后将您的ComboBoxes 添加到Panels。然后,您可以完全取消集合并使用For Each cb In somePanel.Controls.OfType(Of ComboBox)()

标签: vb.net collections combobox properties


【解决方案1】:

不要使用集合。集合被软弃用。 Use List(Of T)

Dim comboList As New List(Of ComboBox)()
comboList.Add(cbo1)
comboList.Add(cbo2)
comboList.Add(cbo3)


' Imports System.Linq
comboList.ForEach(Sub(cbo) cbo.Enabled = True)

这是尽可能接近的。

现在,如果您想有一些选择性的方式来启用/禁用或其他方式,您可以使用Tag 属性进行标记,然后它将看起来像这样

comboList.Where(Function(cbo) cbo.Tag IsNot Nothing AndAlso CBool(cbo.Tag)).ToList().ForEach(Sub(cbo) cbo.Enabled = True)

【讨论】:

  • 啊。这就是我的想法,我在声明一个集合,我应该使用组合列表。旧的做法。
【解决方案2】:

确保程序启动时组合的复选框和启用属性是同步的。使用设计器。

Private ComboCollection As New List(Of ComboBox)

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    BuildCBCollection()
End Sub

Private Sub BuildCBCollection()
    For Each ctrl As Control In Me.Controls
        If TypeOf (ctrl) Is ComboBox Then
            ComboCollection.Add(CType(ctrl, ComboBox))
        End If
    Next
End Sub

Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
    For Each cb In ComboCollection
        cb.Enabled = Not cb.Enabled
    Next
End Sub

【讨论】:

  • 优秀。谢谢,我又跑了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-09
  • 1970-01-01
相关资源
最近更新 更多