1

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

有什么建议么 ?

4

4 回答 4

1

你知道Locked的真正含义吗?这不是一个正常的属性,无论如何都不会影响运行时,只有设计师。您可能应该去解决您要解决的问题。我可以向您保证:不需要“锁定”属性。

于 2010-05-15T10:14:15.617 回答
1

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

此外,一些属性使用IExtenderProvider类似于 WPF 中的附加属性附加到控件。例如,在将ToolTip控件添加到设计器后,设计器将显示所有控件的属性ToolTip。要通过代码设置工具提示文本,您必须使用

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

因为控件没有ToolTip属性。

并且有更多类似的机制ICustomTypeDescriptor导致在设计器中显示不同的属性,而不是真正为控件定义的属性。

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

于 2010-05-15T10:41:10.623 回答
0

你可以禁用它!!!!

daveTextBox.Enabled = False

这显然会改变控件的外观。如果您不想更改控件的外观,请覆盖按键事件处理程序以不执行任何操作。

于 2010-05-15T10:14:41.233 回答
0

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

下面是我为处理此类事情而编写的一些代码的摘录,但客户想要便宜而不是完美,所以我有一些灵活性,所以它可能不适合你。该方法只是由SetControlsReadonly(gb.Controls)(假设一个名为 gb 的组框)调用。

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
于 2010-05-15T12:18:17.080 回答