#vb.net
#vb.net
Вопрос:
Мне нужна эта программа, чтобы countries.txt файл и считайте его в country.countryarray при загрузке программы. Затем пользователь должен иметь возможность ввести название страны в поле nmtext.text и нажать кнопку отправить, а аббревиатура страны должна быть извлечена из массива и отображена в поле abbrevtext.text и выполнить то же действие, если пользователь ищет аббревиатуру в поле abbrevtext.text, затем ему необходимоотобразите название страны в поле nmtext.text.
countries.txt файл содержит 250 стран и должен быть сохранен в отладочном файле для проекта, а содержимое файла выглядит примерно так при просмотре в notepad с возвратом каретки в конце каждой строки.
0.AC
1.Ascension Island
2.AD
3.Andorra
4.AE
5.United Arab Emirates
6.AF
7.Afghanistan
8.AG
9.Antigua and Barbuda
10.AI
Вот мой код до сих пор, и он не работает, он откроет форму и позволит мне ввести название страны, но он ничего не делает, когда я нажимаю отправить.
Imports System.IO
Imports Microsoft.VisualBasic.FileIO
Public Class CountForm
'CREATES STRUCTURE AND ARRAY
Public Structure Countries
Public CountryArray
Public CountryString As String
End Structure
'CREATES OBJECT FOR STRUCTURE
Public Country As Countries
'CREATES STREAM READER
Private MyStreamReader As System.IO.StreamReader
'CREATES FILESTRING VARIALE TO REFERENCE THE FILE PATH
Public FileString As String = "C:UsersUserDesktopBasicCountryFileCountryFilebinDebugCountries.Txt"
'CREATES TEXTFIELDPARSER AND REFERENCES FILESTRING TO CALL THE FILEPATH
Private TextFieldParser As New TextFieldParser(FileString)
Private Sub CountForm_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Try
Country.CountryArray = File.ReadAllText(FileString) '// gets all the text in the file'
Catch ex As Exception
Dim ResponseDialogResult As String
' File missing.
ResponseDialogResult = MessageBox.Show("Something Went Wrong",
"Debuging Purposes", MessageBoxButtons.OK,
MessageBoxIcon.Question)
If ResponseDialogResult = DialogResult.Yes Then
End If
If ResponseDialogResult = DialogResult.No Then
' Exit the program.
Me.Close()
End If
End Try
End Sub
Private Sub Submit_Click(sender As System.Object, e As System.EventArgs) Handles Submit.Click
Try
TextFieldParser.TextFieldType = FieldType.Delimited
TextFieldParser.SetDelimiters(Environment.NewLine)
Do Until MyStreamReader.Peek = -1
If NmText.Text.ToUpper.Contains(Country.CountryArray.ToUpper()) Then
AbbrevText.Text = Country.CountryArray.ToUpper - 1
Else
MessageBox.Show("Name or Abbreviation Was Not Found", "Error", MessageBoxButtons.OK)
End If
Loop
Catch ex As Exception
End Try
End Sub
Private Sub Clear_Click(sender As System.Object, e As System.EventArgs) Handles Clear.Click
NmText.Text = ""
AbbrevText.Text = ""
End Sub
End Class
Комментарии:
1. Избавьтесь от этого пустого try / catch и, возможно, вы увидите, какое исключение возникает. Никогда не скрывайте исключения.
2. Спасибо сделал это, и теперь он помечает несколько вещей. Извините, код неаккуратный, я возился с ним уже несколько часов и попробовал несколько разных способов заставить его работать. Сообщая мне, что environment.newline не является приемлемым разделителем. Я сделал это так, потому что в текстовом файле в конце каждой строки есть cr. Есть идеи, как это исправить?
3. @user2796618 вместо среды. Для перевода строки попробуйте использовать одно из следующих действий:
vbcrlf
,vbcr
, илиvblf
. Возможно, вы получаете ошибку, потому что окружающая среда зависит от настроек операционной системы компьютера, на котором выполняется код.4. С кодом много проблем. Я не могу понять цель
MyStreamReader
, но она не инициализируется в предоставленном вами коде (Private MyStreamReader As System.IO.StreamReader
не создает экземпляр). Кроме того, все, что вы когда-либо делаете с этимPeek
, для меня выглядит так, что это просто приведет к бесконечному циклуSubmit_Click
. Кроме того, место, в котором вы читаете файлCountForm_Load
,Country.CountryArray
не является массивом. Возможно, для начала неплохо было бы добавитьOption Strict On
иOption Explicit On
в верхней части файла, чтобы указать на некоторые основные ошибки.
Ответ №1:
Подход StreamReader / TextFieldParser кажется действительно сложным. Может быть, это работает для вас:
Public Class Form1
Private countryDict As New Dictionary(Of String, String)
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Dim lineArray = IO.File.ReadAllLines("countries.txt")
'this will cause trouble if there is a NewLine at the end of the file
'In this case just remove the last new line.
For index = 0 To lineArray.Length - 2 Step 2
countryDict.Add(lineArray(index), lineArray(index 1))
Next
End Sub
Private Sub Submit_Click(sender As System.Object, e As System.EventArgs) Handles Submit.Click
If countryDict.ContainsKey(NmText.Text.ToUpper()) Then
AbbrevText.Text = countryDict(NmText.Text.ToUpper())
Else
MsgBox("Name or Abbreviation Was Not Found")
End If
End Sub
End Class
Комментарии:
1. Я должен использовать StreamReader для удовлетворения требований, и я согласен, что это боль. Извините, спасибо за комментарий.
2. Обязательно ли использовать TextFieldParser?