代码之家  ›  专栏  ›  技术社区  ›  odiseh

.Net:为什么我们不能在winforms中以编程方式访问控件的某些属性?

  •  1
  • odiseh  · 技术社区  · 14 年前

    .Net:为什么我们不能在winforms中以编程方式访问控件的某些属性?例如,不能通过代码访问groupbox的“Locked”属性。所以当我想用编程的方式锁定它时,我能做些什么呢?使用Enabled=False将灰显其中的所有控件,这不是我想要的。

    有什么建议吗?

    5 回复  |  直到 14 年前
        1
  •  1
  •   okutane    14 年前

    你知道锁是什么意思吗?这不是一个普通的属性,也不会影响运行时,只影响设计器。你也许应该去解决你要解决的问题。我可以向你保证:这不需要“锁定”属性。

        2
  •  1
  •   Daniel Brückner Pradip    14 年前

    Locked根本不是一个属性-它只是存储在资源文件中的一个值。锁定 Form $this.Locked 设置为true。

    此外,一些属性通过 IExtenderProvider 类似于WPF中的附加属性。例如,设计师将显示一个属性 ToolTip 工具提示

    this.toolTip1.SetToolTip(this.button1, "A button.");
    

    工具提示 控件的属性。

    还有更多的机制像 ICustomTypeDescriptor

    有一个通用的解决方案来禁用WinForms控件而不使它们变灰,但不幸的是我既不记得也找不到它。。。

        3
  •  0
  •   Robben_Ford_Fan_boy    14 年前

    daveTextBox.Enabled = False
    

        4
  •  0
  •   Hans Olsson    14 年前

    正如其他人已经指出的,您实际上想要做的是使控件成为只读的,但是除了文本框和单选按钮之外,这可能相当复杂。

    SetControlsReadonly(gb.Controls) (假设一个名为gb的groupbox)。

    Private Sub SetControlsReadonly(ByVal ctrls As Windows.Forms.Control.ControlCollection)
      For Each ctrl As Control In ctrls
         ctrl.Enabled = True ' first enable everything so that it'll all look the same
         If TypeOf ctrl Is TextBox Then
            CType(ctrl, TextBox).ReadOnly = True
         ElseIf TypeOf ctrl Is Button Then
            CType(ctrl, Button).Enabled = False
         ElseIf TypeOf ctrl Is CheckBox Then
            CType(ctrl, CheckBox).AutoCheck = False
         ElseIf TypeOf ctrl Is ComboBox Then
            ctrl.Enabled = False 
            if ctrl.Tag IsNot Nothing Then
                ' call method that hides the combo and instead shows a readonly textbox in the same location containing the same data
            End If
         ElseIf TypeOf ctrl Is DateTimePicker Then
            ctrl.Enabled = False
         End If
         SetControlsReadonly(ctrl.Controls)
      Next
    End Sub