.Net:为什么我们无法在winforms中以编程方式访问控件的某些属性?例如,无法通过代码访问组框的“已锁定”属性。那么当我想以编程方式锁定它时,我可能会做什么?使用Enabled = False将显示其中的所有控件,这不是我想要的。
任何建议?
答案 0 :(得分:1)
你知道Locked究竟是什么意思吗?这不是一个普通的属性,无论如何都不影响运行时,只有设计师。您可能应该解决您尝试解决的问题。我可以向你保证:不需要“锁定”财产。
答案 1 :(得分:1)
如果要禁用控件而不将其删除,这样做的确切步骤可能相当复杂,具体取决于控件的类型。我正在为TextBox
提供CheckBox
下面的一些指示。RadioButton
& ComboBox
和控件。TextBox
请记住,由于某种原因,此功能无法统一构建到Winforms中:看起来已启用但实际上已禁用(只读)的控件可能会使许多用户感到困惑您的应用程序,因为处理您的控件将无法满足他们对Windows控件通常的行为方式的期望。
true
将TextBox.ReadOnly
属性设置为CheckBox
。
(请参阅MSDN上的文章Creating a Read-Only Text Box。)
RadioButton
(和false
)将CheckBox.AutoCheck
属性设置为RadioButton
请注意,这也适用于ComboBox
控件。
修改:很遗憾,我现在无法检索我的WndProc
只读的来源。但是,它相当复杂,涉及在{{1}}中拦截窗口消息。或许请查看this article on CodeProject。
答案 2 :(得分:1)
Locked根本不是属性 - 它只是存储在资源文件中的值。锁定Form
控件会将布尔资源值$this.Locked
设置为true。
此外,一些属性使用IExtenderProvider
附加到控件,类似于WPF中的附加属性。例如,在向设计人员添加ToolTip
控件后,设计人员将为所有控件显示属性ToolTip
。要按代码设置工具提示文本,您必须使用
this.toolTip1.SetToolTip(this.button1, "A button.");
因为控件没有ToolTip
属性。
还有更多机制,如ICustomTypeDescriptor
,导致设计器中显示的属性不同于为控件实际定义的属性。
有一个通用的解决方案来禁用WinForms控件而不会让它们变灰但不幸的是我既不记得也找不到它......
答案 3 :(得分:0)
你可以禁用它!!!!
daveTextBox.Enabled = False
这显然会改变控件的外观。如果您不想更改控件的外观,则覆盖按键事件处理程序以不执行任何操作。
答案 4 :(得分: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