vb.net - 检测 Try...Catch 的“发件人”
问题描述
我有一个程序,我在其中输入来自不同文本框的大量值,并且我使用try..catch
并检查每一个textbox
是否只输入数值。如果我输入不同的字符,它会得到它,这要归功于Catch ex As System.InvalidCastException
. 在此之后,我想更改textbox
出现错误的背景颜色,例如ex.backcolor = color.red
. 我已经搜索过这个并尝试了很多东西,但我真的不知道如何处理这个变量。感谢帮助,谢谢!
解决方案
根据您的描述,您几乎可以肯定做错了一些事情。我将提供一个完整的示例,但我将首先直接回答您的问题。你不需要“检测”任何东西。sender
参数是您想要的对象。每个事件处理程序中的sender
参数是引发事件的对象。这就是重点。如果您正在处理事件TextBoxes
并且想要更改引发事件的事件,那么您可以通过参数访问BackColor
它,例如TextBox
TextBox
sender
Dim tb = DirectCast(sender, TextBox)
tb.BackColor = Color.Red
在这种情况下进行验证的最佳方法取决于您的需要。不过,绝对没有理由抛出任何异常。首先,您需要决定是否要阻止用户离开包含无效输入的控件。如果你这样做了,那么你应该处理这个Validating
事件。您可以取消该事件以防止无效控件失去焦点。如果您不取消该事件,那么该Validated
事件也会引发,例如
Imports System.ComponentModel
Public Class Form1
Private Sub TextBoxes_Validating(sender As Object, e As CancelEventArgs) Handles TextBox3.Validating,
TextBox2.Validating,
TextBox1.Validating
Dim tb = DirectCast(sender, TextBox)
'Check whether the control contains any non-numeric characters.
If tb.Text.Any(Function(ch) Not Char.IsDigit(ch)) Then
tb.BackColor = Color.Red
tb.HideSelection = False
tb.SelectAll()
MessageBox.Show("Please enter only numeric characters.",
"Invalid Input",
MessageBoxButtons.OK,
MessageBoxIcon.Error)
tb.HideSelection = True
e.Cancel = True
End If
End Sub
Private Sub TextBoxes_Validated(sender As Object, e As EventArgs) Handles TextBox3.Validated,
TextBox2.Validated,
TextBox1.Validated
'If this event is raised then the control content is valid so reset the BackColor.
Dim tb = DirectCast(sender, TextBox)
tb.BackColor = SystemColors.Window
End Sub
End Class
如您所见,这些方法处理多个控件的事件,并且代码专门引用引发事件的控件。当用户试图离开一个控件时,它的内容会被验证,如果他们因为无效而不能离开,就会通知用户。
如果您希望让用户按自己的意愿导航但使用BackColor
立即指示无效内容,则可以TextChanged
改为处理该事件:
Private Sub TextBoxes_TextChanged(sender As Object, e As EventArgs) Handles TextBox3.TextChanged,
TextBox2.TextChanged,
TextBox1.TextChanged
Dim tb = DirectCast(sender, TextBox)
tb.BackColor = If(tb.Text.Any(Function(ch) Not Char.IsDigit(ch)),
Color.Red,
SystemColors.Window)
End Sub
编辑:
另一种选择是创建您自己的自定义控件并将功能直接构建到其中,因此您根本不必处理任何事件,例如
Imports System.ComponentModel
Public Class NumericTextBox
Inherits TextBox
<DefaultValue(GetType(Color), "Window")>
Public Property NormalBackColor As Color = SystemColors.Window
<DefaultValue(GetType(Color), "Red")>
Public Property ErrorBackColor As Color = Color.Red
Protected Overrides Sub OnTextChanged(e As EventArgs)
MyBase.OnTextChanged(e)
BackColor = If(Text.Any(Function(ch) Not Char.IsDigit(ch)),
ErrorBackColor,
NormalBackColor)
End Sub
End Class
构建项目后,该控件将添加到工具箱窗口的顶部。然后,您可以将该控件添加到表单中,而不是常规TextBox
控件。无需任何额外代码,您可以输入任何这些控件,如果您添加和删除非数字字符,它们将自动变为红色并再次变回。
使用我添加的属性,您可以BackColor
在设计器中选择两个可能的值,就像您选择其他属性一样。请注意,这些DefaultValue
属性使您能够右键单击工具箱中的那些属性并选择重置以将属性设置回指定的值。
推荐阅读
- c# - 如何将 Unity 对象动作与 HoloLens 节目的音乐同步?
- rest - 使用 JSON-LD Vs 有什么明显的优势吗?JSON:REST端点的API?
- python - 将 kmeans 算法与 jupyter notebook 一起使用时出现蓝屏
- python - 使用SyncRNG在R和Python之间生成相同随机数时如何解决OverflowError
- javascript - blur() 事件在 IPAD 和 Iphone 上不起作用
- sql - SQL Server 为非常大的数字上的操作保留小数位数和精度
- ios - 如何使可重用视图接受泛型类型
- java - Spring Cloud Stream - RabbitMQ 配置
- c++ - 使用随机数生成器选择数组值
- google-cloud-platform - 谷歌云中的自动扩缩实例