我的子程序有什么问题?

时间:2014-11-07 06:50:46

标签: vb.net

因为我自学了,所以我已经在这个项目上工作了几个星期。我碰到了一堵墙,这里的社区非常有帮助,我又来了一个问题。

基本上,我有一个用户输入名称的输入框。然后,该名称将显示在列表框中。如果名称已经存在,该名称也会被放入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。

1 个答案:

答案 0 :(得分:2)

  1. 您需要防止用户意外输入两次名称。(不确定是否意味着要添加两次)
  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,现在并不需要这样做)

    1. 当我从列表中删除名称然后重新添加时,没有时间戳添加到XML。
    2. 您的minerValidatedXML()是真的,因为当您向列表框重新添加名称时,您没有清除文本框。或者,如果与文本框

      相同,则可能需要删除现有的列表框项
      If minerListBox.Items.Contains(UCase(minerAddBox.Text)) = True Then
         minerListBox.Items.remove(UCase(minerAddBox.Text))