基本上我要做的是写一个程序,你输入这个人的名字和出生日期,把它们存放到一个数组中(注意我是否必须做两个独立的数组),然后输入他们的名字到另一个文本框,然后点击另一个按钮,我可以获得出生日期。
我知道我必须包含 if
-loop,我知道如何声明数组。
我猜我可能需要使用精选案例。
以下是代码:
Public Class Form1
Dim Name(5) As String
Dim DOB(5) As String
Dim i As Integer
Private Sub btnNameEnter_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNameEnter.Click
Name(i) = txtInputName.Text
DOB(i) = txtInputDOB.Text
If i = 6 Then
MsgBox("You cannot enter any more names.")
End If
For i = 1 To 5
Name(i) = i
txtInputName.Clear()
txtInputDOB.Clear()
Next i
End Sub
Private Sub btnFindDOB_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFindDOB.Click
Select Case Name(i)
Case Is Name(1)
MsgBox("Date of birth: " & DOB(1))
Case is Name(2)
MsgBox("Date of birth: " & DOB(2))
Case is Name(3)
MsgBox("Date of birth: " & DOB(3))
Case is Name(4)
MsgBox("Date of birth: " & DOB(4))
Case is Name(5)
MsgBox("Date of birth: " & DOB(5))
End Select
End Sub
End Class
我会显示该程序的图片,但visual basic因某些原因不断删除它,并且不允许我重新添加按钮。
以下是错误列表的图片: http://gyazo.com/2489a307f4a8e2d9ce65aa2ad79b04f1 )
Public Class Form1 Dim DOB(5)As String Dim i As Integer Private Sub btnEnter_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)处理btnEnter.Click Dim Name(5)As String
Dim Counter As Integer
txtNameInp.Text = Name(i)
txtDOBInput.Text = DOB(i)
Counter = 0
For i = 1 To 5
If Counter = 6 Then
MsgBox("You can only enter 5 names and DOBs")
End If
Name(i) = txtNameInp.Text
DOB(i) = txtDOBInput.Text
Counter = Counter + 1
Next i
End Sub
Private Sub btnFindDOB_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFindDOB.Click
Select Case Name(i)
Case Name(1)
MsgBox(DOB(1))
Case Name(2)
MsgBox(DOB(2))
Case Name(3)
MsgBox(DOB(3))
Case Name(4)
MsgBox(DOB(4))
Case Name(5)
MsgBox(DOB(5))
End Select
End Sub
结束班
这是一个错误:http://gyazo.com/487290c3e523003fe58f82a15fdf6faa - 当我尝试输入第二个数字时会出现这个错误
答案 0 :(得分:2)
很难精确地使用错误图片而不是代码中的注释来指示错误的位置和文本,但是我可以看到:
Name
属性,您尝试通过阵列重新定义它。请使用类似myNames
的内容。i
的模块级变量和一个本地变量。将全局变更为有用的内容,例如curPosition
。这将跟踪您当前存储的元素。Exit Sub
;你希望在之前将任何内容存储到数组中,而不是之后。也许添加一条消息说 - '现在我会告诉你DOB的名字'。 Guess DOB
按钮,并报告给定DOB的名称。它的代码基本相同。按钮输入代码将在每次单击时运行,因此您不需要循环。顺便说一句,这简直是胡说八道:Name(i) = i
你用i
恰好是什么来覆盖一切。只需使用myNames
作为索引添加到myDOB
和curPosition
,然后将其递增:
myNames(curPosition)= txtInputName.Text
关系错误来自:Case Is Name(1)
错误是告诉你需要一个关系运算符,Is
不是(Is
与Objects一起使用,而字符串不是)。这里的代码也有点不稳定因为你没有控制i
的值。比较txtInputName
:
Select Case txtInputName.Text
Case = Name(1) ' ie does txtInputName match the value in Name(1)?
...
- 您可以在此处使用For循环代替案例陈述,而不是案例陈述。
让我们了解课程。而不是将相关信息彼此分离的数组,而不是一个类将数据保持在一起。
Public Class Person
Public property Name As String
Public Property DOB As DateTime ' I refuse to store a Date as string
Public Sub New(sName as String, dt as DateTime)
Name = sName
DOB = dt
End Sub
End Class
接下来,一个漂亮的列表来保存一些人物对象。列表就像一个数组,但更聪明:
Private pList As New List(Of Person)
添加一个人:
' ToDo: check that the date is valid using TryParse instead
' this exercise is left to the student
Dim p As New Person(txtInputName.Text, Datetime.Parse(txtInputDOB.Text))
plist.Add(p)
找人:
' case insensitive search
Dim search As String = txtNameToFind.Text.ToLowerInvariant
For Each p as Person In pList
If P.Name.TolowerInvariant = search Then
txtDOB.Text = p.DOB.ToString
Exit For
End If
Next
答案 1 :(得分:0)
试试这个:
Public Class Form1
Dim Name, DOB As List(Of String) 'Lists are better in this situation.
Private Sub btnNameEnter_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNameEnter.Click
'You don't need to specify the index in lists.
Name.Add(txtInputName.Text)
DOB.Add(txtInputDOB.Text)
txtInputName.Clear()
txtInputDOB.Clear()
End Sub
Private Sub btnFindDOB_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFindDOB.Click
'You get the index of the name you are searching for and get DOB for this index.
MsgBox("Date of birth: " & DOB.Item(Name.IndexOf(txtInputName.Text)))
End Sub
End Class