如果 VB 中的多个文本框中没有文本,如何禁用按钮?
How disable a button if there is no text in multiple textboxes in VB?
我有 9 个名为 Textbox1
的文本框一直到 Textbox9
。我还有一个名为 Letter
的按钮,它从数组中选择一个随机字母。我有另一个名为 Start
的按钮。按下此按钮时会显示一个计时器,从 30 秒全部倒计时到零。我希望只有当所有 9 个文本框都包含文本时才会出现此按钮。我尝试了以下但似乎没有用:
将 if 语句中的所有 "And" 更改为 "Or"
Private Sub BtnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnStart.Click
If TxtBox1.Text = "" Or TxtBox2.Text = "" Or TxtBox3.Text = "" Or
TxtBox4.Text = "" Or TxtBox5.Text = "" Or TxtBox6.Text = "" Or
TxtBox7.Text = "" Or TxtBox8.Text = "" Or TxtBox9.Text = "" Then
TmrGame.Enabled = False
MessageBox.Show("There Must Be A Total Of Nine Letters To Start The Game", "Not Enough Letters")
Else
TmrGame.Enabled = True
End If
End Sub
通过使用 And,您检查所有文本框都必须为空,然后您将 timer.Enabled 设置为 false。对于 Or,您是说如果任何文本框为空,您会将 timer.Enabled 设置为 false。
Shar1er80 的回答是正确的。另一种方法是在任何文本框的文本更改后启用或禁用按钮。您可以使用事件处理程序轻松完成此操作:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim Boxes As TextBox() = {TextBox1, TextBox2, TextBox3, TextBox4, TextBox5, TextBox6, TextBox7, TextBox8, TextBox9}
For Each b In Boxes
AddHandler b.TextChanged, Sub(s, ee)
btnStart.Enabled = Not Boxes.Any(Function(box) box.Text = "")
'The same, not using a negation would be:
'btnStart.Enabled = Boxes.All(Function(box) box.Text <> "")
End Sub
Next
End Sub
首先,我创建了一个包含所有文本框的数组。它们和其他任何东西一样都是对象。然后我使用 AddHandler
关键字将每个框的 TextChanged
事件连接到一个子项。
在 Sub 中,我使用 LINQ 检查是否有任何文本框为空,如果是则禁用按钮(这类似于检查 or
连接的 If 语句中的每个框)。
尝试这样的事情:
Option Strict On
Option Explicit On
Option Infer Off
Public Class Form1
Private Sub BtnStart_Click(sender As Object, e As EventArgs) Handles BtnStart.Click
Dim execute As Boolean = True
For i As Integer = 1 To 9
If DirectCast(Me.Controls("TextBox" & i.ToString), TextBox).Text = "" Then execute = False
Next
If execute Then
'Your code to execute here
Else
MessageBox.Show("Please provide input in all fields.", "Incomplete Submission", MessageBoxButtons.OK, MessageBoxIcon.Warning)
End If
End Sub
End Class
我有 9 个名为 Textbox1
的文本框一直到 Textbox9
。我还有一个名为 Letter
的按钮,它从数组中选择一个随机字母。我有另一个名为 Start
的按钮。按下此按钮时会显示一个计时器,从 30 秒全部倒计时到零。我希望只有当所有 9 个文本框都包含文本时才会出现此按钮。我尝试了以下但似乎没有用:
将 if 语句中的所有 "And" 更改为 "Or"
Private Sub BtnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnStart.Click
If TxtBox1.Text = "" Or TxtBox2.Text = "" Or TxtBox3.Text = "" Or
TxtBox4.Text = "" Or TxtBox5.Text = "" Or TxtBox6.Text = "" Or
TxtBox7.Text = "" Or TxtBox8.Text = "" Or TxtBox9.Text = "" Then
TmrGame.Enabled = False
MessageBox.Show("There Must Be A Total Of Nine Letters To Start The Game", "Not Enough Letters")
Else
TmrGame.Enabled = True
End If
End Sub
通过使用 And,您检查所有文本框都必须为空,然后您将 timer.Enabled 设置为 false。对于 Or,您是说如果任何文本框为空,您会将 timer.Enabled 设置为 false。
Shar1er80 的回答是正确的。另一种方法是在任何文本框的文本更改后启用或禁用按钮。您可以使用事件处理程序轻松完成此操作:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim Boxes As TextBox() = {TextBox1, TextBox2, TextBox3, TextBox4, TextBox5, TextBox6, TextBox7, TextBox8, TextBox9}
For Each b In Boxes
AddHandler b.TextChanged, Sub(s, ee)
btnStart.Enabled = Not Boxes.Any(Function(box) box.Text = "")
'The same, not using a negation would be:
'btnStart.Enabled = Boxes.All(Function(box) box.Text <> "")
End Sub
Next
End Sub
首先,我创建了一个包含所有文本框的数组。它们和其他任何东西一样都是对象。然后我使用 AddHandler
关键字将每个框的 TextChanged
事件连接到一个子项。
在 Sub 中,我使用 LINQ 检查是否有任何文本框为空,如果是则禁用按钮(这类似于检查 or
连接的 If 语句中的每个框)。
尝试这样的事情:
Option Strict On
Option Explicit On
Option Infer Off
Public Class Form1
Private Sub BtnStart_Click(sender As Object, e As EventArgs) Handles BtnStart.Click
Dim execute As Boolean = True
For i As Integer = 1 To 9
If DirectCast(Me.Controls("TextBox" & i.ToString), TextBox).Text = "" Then execute = False
Next
If execute Then
'Your code to execute here
Else
MessageBox.Show("Please provide input in all fields.", "Incomplete Submission", MessageBoxButtons.OK, MessageBoxIcon.Warning)
End If
End Sub
End Class