因为我自学了,所以我已经在这个项目上工作了几个星期。我碰到了一堵墙,这里的社区非常有帮助,我又来了一个问题。
基本上,我有一个用户输入名称的输入框。然后,该名称将显示在列表框中。如果名称已经存在,该名称也会被放入XML表中。
列表框附近有一个按钮,允许用户从列表框中删除名称。这修改了XML,不是从表中删除名称,而是在该名称的子EndTime中添加结束时间。 如果用户随后将相同的名称添加到输入框,则会附加XML以添加另一个StartTime而不是创建新元素。
所有这些功能都很好(我的代码可能很笨重,但它到目前为止一直在工作。)当我尝试在将所有内容传递给XML之前验证文本框时,问题就出现了。我想要完成的是,如果名称存在于表单上的列表框中(即还没有被用户删除),那么XML没有任何反应,输入框被清除。这是为了防止由于用户意外地两次输入相同名称而导致的错误时间戳。
无论如何,我希望这是有道理的,我已经厌倦了。我得到的代码如下:
Private Sub Button1_Click_2(sender As System.Object, e As System.EventArgs) Handles addPlayerButton.Click
playerTypeCheck()
addPlayerXML()
clearAddBox()
End Sub
Private Sub playerTypeCheck()
If playerTypeCBox.SelectedIndex = 0 Then
addMiner()
ElseIf playerTypeCBox.SelectedIndex = 1 Then
addHauler()
ElseIf playerTypeCBox.SelectedIndex = 2 Then
addForeman()
End If
End Sub
Private Sub addMiner()
If minerAddBox.Text = String.Empty Then
Return
End If
If minerListBox.Items.Contains(UCase(minerAddBox.Text)) = True Then
Return
Else : minerListBox.Items.Add(UCase(minerAddBox.Text))
End If
If ComboBox1.Items.Contains(UCase(minerAddBox.Text)) = True Then
Return
Else : ComboBox1.Items.Add(UCase(minerAddBox.Text))
End If
End Sub
Private Sub addPlayerXML()
If System.IO.File.Exists("Miners.xml") Then
Dim xmlSearch As New XmlDocument()
xmlSearch.Load("Miners.xml")
Dim nod As XmlNode = xmlSearch.DocumentElement()
If minerAddBox.Text = "" Then
Return
Else
If playerTypeCBox.SelectedIndex = 0 Then
nod = xmlSearch.SelectSingleNode("/Mining_Op/Miners/Miner[@Name='" + UCase(minerAddBox.Text) + "']")
ElseIf playerTypeCBox.SelectedIndex = 1 Then
nod = xmlSearch.SelectSingleNode("/Mining_Op/Haulers/Hauler[@Name='" + UCase(minerAddBox.Text) + "']")
ElseIf playerTypeCBox.SelectedIndex = 2 Then
nod = xmlSearch.SelectSingleNode("/Mining_Op/Foremen/Foreman[@Name='" + UCase(minerAddBox.Text) + "']")
End If
If nod IsNot Nothing Then
nodeValidatedXML()
Else
Dim docFrag As XmlDocumentFragment = xmlSearch.CreateDocumentFragment()
Dim cr As String = Environment.NewLine
Dim newPlayer As String = ""
Dim nod2 As XmlNode = xmlSearch.SelectSingleNode("/Mining_Op/Miners")
If playerTypeCBox.SelectedIndex = 0 Then
newMinerXML()
ElseIf playerTypeCBox.SelectedIndex = 1 Then
newHaulerXML()
ElseIf playerTypeCBox.SelectedIndex = 2 Then
newForemanXML()
End If
End If
End If
Else
newXML()
End If
End Sub
Private Sub nodeValidatedXML()
If playerTypeCBox.SelectedIndex = 0 Then
minerValidatedXML()
ElseIf playerTypeCBox.SelectedIndex = 1 Then
haulerValidatedXML()
ElseIf playerTypeCBox.SelectedIndex = 2 Then
foremanValidatedXML()
End If
End Sub
Private Sub minerValidatedXML()
If minerListBox.Items.Contains(UCase(minerAddBox.Text)) = False Then
appendMinerTimeXML()
End If
End Sub
Private Sub appendMinerTimeXML()
Dim xmlSearch As New XmlDocument()
xmlSearch.Load("Miners.xml")
Dim docFrag As XmlDocumentFragment = xmlSearch.CreateDocumentFragment()
Dim cr As String = Environment.NewLine
Dim newStartTime As String = Now & ", "
Dim nod2 As XmlNode = xmlSearch.SelectSingleNode("/Mining_Op/Miners/Miner[@Name='" & UCase(minerAddBox.Text) & "']/StartTime")
docFrag.InnerXml = newStartTime
nod2.AppendChild(docFrag)
xmlSearch.Save("Miners.xml")
End Sub
最后,clearAddBox()子例程
Private Sub clearAddBox()
minerAddBox.Text = ""
End Sub
所以,我应该指出,如果我将nodeValidated()子例程重写为:
Private Sub nodeValidatedXML()
If playerTypeCBox.SelectedIndex = 0 Then
appendMinerTimeXML()
ElseIf playerTypeCBox.SelectedIndex = 1 Then
appendHaulerTimeXML()
ElseIf playerTypeCBox.SelectedIndex = 2 Then
appendForemanTimeXML()
End If
End Sub
然后所有的XML工作,除了它添加列表中已存在的名称的时间戳,这是我试图避免的。所以,如果我还没有完全生气,那么minerValidated()子程序无法调用appendMinerTimeXML()是什么?我觉得这个问题要么在minerValidated()sub中,要么clearAddBox()可能会以某种方式触发并且我错过了它?感谢您抽出宝贵的时间来解决这个问题。
编辑:澄清。我现在拥有的代码根本没有附加XML。一切都写得很好第一次,但是当我从列表中删除一个名称然后重新添加时,没有时间戳添加到XML。
答案 0 :(得分:2)
为此,我认为如果此行为真,您需要清除minerAddBox.Text
中的addminer()
。
minerListBox.Items.Contains(UCase(minerAddBox.Text)) = True
minerAddBox.Text = ""
Return
现在它将返回到addplayerXML
,这将返回到您的clearbox()
,因为您的addplayerXML()
If minerAddBox.Text = "" Then
Return
现在您转到clearbox()
(由于您已经清除了minerAddBox.Text
,现在并不需要这样做)
您的minerValidatedXML()
是真的,因为当您向列表框重新添加名称时,您没有清除文本框。或者,如果与文本框
If minerListBox.Items.Contains(UCase(minerAddBox.Text)) = True Then
minerListBox.Items.remove(UCase(minerAddBox.Text))