Как правильно заполнить текстовые поля из файла XML в выбранном элементе ComboBox?

Я пробовал так много разных способов заставить это работать, и он просто продолжает загружать первый элемент. Мне нужно иметь возможность заполнять различные текстовые поля всеми элементами из файла XML после сопоставления текста из поля со списком.

По сути, я загружаю свое приложение, Я СНАЧАЛА читаю XML-файл, чтобы загрузить ComboBox, затем, когда я выбираю элемент из ComboBox, я загружаю другие текстовые поля с подробностями об ошибке.

Мой файл XML:

<?xml version = "1.0" encoding = "us-ascii"?>
<!--SIP Data created by TECH on 1/24/2014 10:07:04 AM-->
<ERROR_ITEMS>
    <ERROR_DATA Posted = "6/11/2018 12:00:00 PM">
        <Response>ERROR001</Response>
            <Method>ErrorCode001</Method>
                <Request>Acknowledged</Request>
                    <Code>001</Code>
                        <Information>Information for code 001 goes here</Information>
                            <Troubleshooting>Error 001 designates connections failed. Check all connections.</Troubleshooting>
                                <Additional_Notes>Tech notes: Ensure proper gauge of wiring.</Additional_Notes>
                                    <DateTimeSaved>11/10/2014 1:45:25 PM</DateTimeSaved>
        <Response>ERROR002</Response>
            <Method>ErrorCode002</Method>
                <Request>Acknowledged</Request>
                    <Code>002</Code>
                        <Information>Information for code 002 goes here</Information>
                            <Troubleshooting>Error 002 designates input power failed. Check power to aux inputs.</Troubleshooting>
                                <Additional_Notes>Tech notes: Check all power connections</Additional_Notes>
                                    <DateTimeSaved>11/10/2014 1:50:25 PM</DateTimeSaved>
  </ERROR_DATA>
</ERROR_ITEMS>

И мой код VB.net:

Imports System.Xml
Imports System.Text
Imports System.IO
Imports System.Environment
Public Class Form1

    Private Sub ExitAppBTN_Click(sender As Object, e As EventArgs) Handles ExitAppBTN.Click
        Me.Close()
    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Try
            ' LOAD THE ERRORS INTO THE COMBO BOX
            Dim document As XmlDocument = New XmlDocument
            document.Load(Application.StartupPath & "/items.xml")

            For Each node In document.SelectNodes("ERROR_ITEMS/ERROR_DATA/Response")
                CmboERRORList.Items.Add(node.InnerText())
            Next

            'Load First Item
            CmboERRORList.SelectedIndex = 0
            CmboERRORList.Focus()
        Catch ex As Exception
            MsgBox("Error processing file. The error was: " & vbCrLf & Err.Description, MsgBoxStyle.Exclamation, "Error loading file contents to drop down list.")
        End Try
    End Sub

        Private Sub CmboERRORList_SelectedIndexChanged(sender As Object, e As EventArgs) Handles CmboERRORList.SelectedIndexChanged
                Try
                    'Load info from the XML file

                    Dim document As XmlDocument = New XmlDocument
                    document.Load(Application.StartupPath & "/items.xml")
                    Dim node = document.SelectSingleNode("ERROR_ITEMS/ERROR_DATA[Response = '" & CmboERRORList.Text & "']")
                    MsgBox(node.SelectSingleNode("Method").InnerText)

                    For Each node In document.SelectNodes("ERROR_ITEMS/ERROR_DATA[Response = '" & CmboERRORList.Text & "']")
                        Dim ErrResponseCode = node.SelectSingleNode("Method").InnerText
                        Dim ErrDetails = node.SelectSingleNode("Information").InnerText
                        txtDetails.Text = ErrDetails
                    Next

                Catch ex As Exception
                    MsgBox("Error Reading Error Data File, please contact technical support. Error is: " & Err.Description & vbCrLf & "Error Number is :" & Err.Number, MsgBoxStyle.Exclamation, "Error")
                End Try
            End Sub

Действительно ли ваш XML-код похож на предоставленный вами образец? Это не выглядит иерархической, это очень плоская структура. Эта структура не будет эффективно прочитана с помощью класса XmlDocument, для этого вам нужно использовать XmlReader.

JayV 19.06.2018 22:10

Ага. Пользуюсь этим годами, но ни разу не искал. Обычно у меня был один XML-файл для каждого элемента, но теперь я хочу использовать только один.

FNDevCJ 19.06.2018 22:26
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
161
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте это вместо вашего текущего обработчика событий ComboBox SelectedIndexChanged.

Private Sub CmboERRORList_SelectedIndexChanged(sender As Object, e As EventArgs) Handles CmboERRORList.SelectedIndexChanged
    Try
        'Load info from the XML file

        Dim settings As New XmlReaderSettings()
        settings.DtdProcessing = DtdProcessing.Parse
        Dim reader As XmlReader = XmlReader.Create("XmlFile1.xml", settings)
        Dim found As Boolean = False
        Dim nodeName As String = String.Empty
        Dim nodeText As String = String.Empty
        While reader.Read
            Select Case reader.NodeType
                Case XmlNodeType.Element
                    nodeName = reader.Name
                Case XmlNodeType.Text
                    nodeText = reader.Value
            End Select

            If (nodeName = "Response" AndAlso nodeText = CmboERRORList.Text) Then
                found = True
            End If

            If (found AndAlso nodeName = "Method" AndAlso reader.NodeType = XmlNodeType.Text) Then
                Debug.WriteLine("Method = " & reader.Value)
            ElseIf (found AndAlso nodeName = "Request" AndAlso reader.NodeType = XmlNodeType.Text) Then
                Debug.WriteLine("Request = " & reader.Value)
            ElseIf (found AndAlso nodeName = "Code" AndAlso reader.NodeType = XmlNodeType.Text) Then
                Debug.WriteLine("Code = " & reader.Value)
            ElseIf (found AndAlso nodeName = "Information" AndAlso reader.NodeType = XmlNodeType.Text) Then
                Debug.WriteLine("Information = " & reader.Value)
                txtDetails.Text = reader.Value
            ElseIf (found AndAlso nodeName = "Troubleshooting" AndAlso reader.NodeType = XmlNodeType.Text) Then
                Debug.WriteLine("Troubleshooting = " & reader.Value)
            ElseIf (found AndAlso nodeName = "Additional_Notes" AndAlso reader.NodeType = XmlNodeType.Text) Then
                Debug.WriteLine("Additional_Notes = " & reader.Value)
            ElseIf (found AndAlso nodeName = "DateTimeSaved" AndAlso reader.NodeType = XmlNodeType.Text) Then
                Debug.WriteLine("DateTimeSaved = " & reader.Value)

                Exit While
            End If
        End While
    Catch ex As Exception
        MsgBox("Error Reading Error Data File, please contact technical support. Error is: " & Err.Description & vbCrLf & "Error Number is :" & Err.Number, MsgBoxStyle.Exclamation, "Error")
    End Try
End Sub

Здесь я использую класс XmlReader для построчного чтения Xml. Если ваш XML-документ не является иерархическим, то XmlReader - действительно лучший вариант для его просмотра.

XmlReader (Ссылка на MSDN) очень низкоуровневый, что означает, что вам нужно проверять, что вы читаете, на каждом этапе и действовать соответственно. Дополнительная информация о методе Read и работе с NodeTypes

Обратите внимание, что я помещаю Exit While в последний Else..If оператор для завершения цикла While, поскольку узел DateTimeSaved является последним, который вас интересует

БАМ! Идеально. Спасибо!

FNDevCJ 20.06.2018 00:24

Другие вопросы по теме