.Net:为什么我们不能在 winforms 中以编程方式访问控件的某些属性?例如,不能通过代码访问 groupbox 的“Locked”属性。那么当我想以编程方式锁定它时,我可以做什么?使用 Enabled = False 会使其中的所有控件变灰,这不是我想要的。
有什么建议么 ?
.Net:为什么我们不能在 winforms 中以编程方式访问控件的某些属性?例如,不能通过代码访问 groupbox 的“Locked”属性。那么当我想以编程方式锁定它时,我可以做什么?使用 Enabled = False 会使其中的所有控件变灰,这不是我想要的。
有什么建议么 ?
你知道Locked的真正含义吗?这不是一个正常的属性,无论如何都不会影响运行时,只有设计师。您可能应该去解决您要解决的问题。我可以向您保证:不需要“锁定”属性。
Locked 根本不是一个属性——它只是存储在资源文件中的一个值。锁定Form
控件会产生一个$this.Locked
设置为 true 的布尔资源值。
此外,一些属性使用IExtenderProvider
类似于 WPF 中的附加属性附加到控件。例如,在将ToolTip
控件添加到设计器后,设计器将显示所有控件的属性ToolTip
。要通过代码设置工具提示文本,您必须使用
this.toolTip1.SetToolTip(this.button1, "A button.");
因为控件没有ToolTip
属性。
并且有更多类似的机制ICustomTypeDescriptor
导致在设计器中显示不同的属性,而不是真正为控件定义的属性。
有一个通用的解决方案可以禁用 WinForms 控件而不使它们变灰,但不幸的是我既不记得也找不到它......
你可以禁用它!!!!
daveTextBox.Enabled = False
这显然会改变控件的外观。如果您不想更改控件的外观,请覆盖按键事件处理程序以不执行任何操作。
正如其他人已经指出的那样,您实际上想要做的是将控件设为只读,但除了文本框和单选按钮之外,这可能相当复杂。
下面是我为处理此类事情而编写的一些代码的摘录,但客户想要便宜而不是完美,所以我有一些灵活性,所以它可能不适合你。该方法只是由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