首页 > 解决方案 > 使用编辑按钮禁用所有文本框字段解锁的快速方法

问题描述

Vb.net 是否有快速禁用表单中所有可编辑字段(文本框、复选框等)的方法?我试图保护数据不被“意外”覆盖。我的用户必须单击编辑按钮才能“解锁”字段并使它们可编辑,并且用户必须按下保存按钮来更新数据库并再次锁定字段。

到目前为止,我只找到了一个手动输入来使每个文本框和复选框(其中大约 30 个在表单的不同选项卡中)只读值为 true 并在我单击编辑按钮时禁用它们。关于如何做到这一点的任何建议?我可以更快地为每个人做一个吗?我将如何制定代码?我发现了一篇 2007 年的文章,里面有这个片段:

For Each control As Control In Me.Controls

If TypeOf (control) Is TextBox Then

CType(control, TextBox).ReadOnly = True

End If
Next

但我需要一次性使用所有类型的字段。

感谢您对此主题的任何建议。我是初学者。

标签: vb.netvisual-studiocontrolseditreadonly

解决方案


参考这个问题

如果你把它放在一个名为 ControlExt.vb 的模块中:

Imports System.Runtime.CompilerServices
Module ControlExt

<Extension()>
Public Function GetAllChildren(Of T As Control)(parentControl As Control) As IEnumerable(Of T)
    Dim controls = parentControl.Controls.Cast(Of Control)
    Return controls.SelectMany(Of Control)(Function(ctrl) _
        GetAllChildren(Of T)(ctrl)) _
        .Concat(controls) _
        .Where(Function(ctrl) ctrl.GetType() = GetType(T)) _
    .Cast(Of T)
End Function

End Module

然后你可以在你的课堂上这样做:



Class WhateverForm

  Private _allTextboxes as List(Of TextBox)

  Public Sub New() 'in the constructor

    InitializeComponent()

    _allTextboxes = Me.GetAllChildren(Of TextBox).ToList()
  End Sub

这意味着表单上的所有文本框,无论它们在哪里(在子面板的任何子面板、组框的标签页等内),现在都在列表中。您可以在编辑按钮单击处理程序中执行此操作:

_allTextboxes.ForEach(Sub(b) b.ReadOnly = False)

当然,ReadOnly = True在保存按钮中执行推论。您不必将其限制为文本框;GetAllChildren 可以找到任何东西 - 也许你也想锁定复选框 - 有另一个列表_allCheckboxes,GetAllChildren(Of CheckBox)ForEach集合Enabled =

我要指出 ReadOnly 和 Enabled 略有不同,如果您要在 UI 中使内容变灰(或在 ReadOnly 的情况下为“半灰”​​),则作为 UX 指针,那么您应该有一些解释为什么该选项显示为灰色/如何启用它。用户不会立即明白他们必须单击启用,并且如果您不希望技术支持呼叫“我正在单击名称框,我可以看到光标在闪烁,但是当我键入时没有任何反应!” 然后用“查看模式:要启用此数据的编辑,请单击[编辑]”等轻推他们


推荐阅读