vb.net - 使用编辑按钮禁用所有文本框字段解锁的快速方法
问题描述
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
但我需要一次性使用所有类型的字段。
感谢您对此主题的任何建议。我是初学者。
解决方案
参考这个问题
如果你把它放在一个名为 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 指针,那么您应该有一些解释为什么该选项显示为灰色/如何启用它。用户不会立即明白他们必须单击启用,并且如果您不希望技术支持呼叫“我正在单击名称框,我可以看到光标在闪烁,但是当我键入时没有任何反应!” 然后用“查看模式:要启用此数据的编辑,请单击[编辑]”等轻推他们
推荐阅读
- javascript - 如何在 TypeScript 中将箭头函数返回值分配给字符串 []
- node.js - 在本地其他项目中使用修改后的 Angular cdk 模块
- javascript - 角度http请求不起作用,但邮递员工作
- swift - Audiokit 的 AKAudioFile 基本目录输入问题
- sql-server-2012 - 使用不同的运算符重复
- c# - 如何在使用 QnA 制造商服务的聊天机器人应用程序中接收用户输入
- android - 在两个堆栈之间传递参数 - React Native
- python - 将权重从 TensorFlow 检查点加载到 Keras 模型
- typescript - 如何声明只公开一个功能的 UMD 模块?
- perl - Perl 语法 <$VARIABLE> 是什么意思?