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

时间:2010-05-15 10:05:14

标签: .net winforms properties windows-forms-designer

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

任何建议?

5 个答案:

答案 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