#vb.net
#vb.net
Вопрос:
Я пытаюсь создать программу, которая включает в себя всех президентов и позволяет выполнять поиск по любой букве или имени, чтобы показать результаты президентов, связанных с этой буквой или именем. Однако у меня возникли проблемы с фактическим добавлением их в список. Это проект класса, поэтому код разработан с учетом требований к нему. В частности, та часть, где говорится: «Показать совпадение addPresidentsToList(президенты (idxReturned), idxReturned) Это говорит о том, что он не объявлен, но я не уверен, как это сделать. Любые советы или рекомендации будут оценены, спасибо!
Public Class frmLab32
Const IDX_START As Integer = 0
Const IDX_END As Integer = 1
Const IDX_NAME As Integer = 2
Dim presidents() As String
Dim headerRowNeeded As Boolean
Private Sub frmLab32_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'Populate array from file
presidents = IO.File.ReadAllLines("USPresWithDates.txt")
End Sub
Private Sub btnSearch_Click(sender As Object, e As EventArgs) Handles btnSearch.Click
Dim idxReturned As Integer = -1
Dim idxStart As Integer = 0
'remove names
lstResults.Items.Clear()
'Header row?
headerRowNeeded = True
'Search for matches
Do
idxReturned = Array.FindIndex(presidents,
idxStart,
Function(el) el.Split(","c)(IDX_NAME).ToLower.Contains(txtSearch.Text.ToLower))
'Match Found?
If idxReturned > -1 Then
'Show the match
addPresidentsToList(presidents(idxReturned), idxReturned)
'Prepare for next search
idxStart = idxReturned 1
End If
Loop Until idxReturned = -1
'Any names found?
If lstResults.Items.Count = 0 Then
'Update counter
lblCount.Text = "0"
'Tell User
MessageBox.Show(text:="No match found",
caption:="Search Results",
buttons:=MessageBoxButtons.OK,
icon:=MessageBoxIcon.Information)
End If
End Sub
End Class
Комментарии:
1. Что вы хотите отобразить и где вы хотите это отобразить? Кажется, что каждый элемент вашего массива представляет собой данные CSV, содержащие две даты и имя. Вы хотите отобразить все
String
или только часть имени? Похоже, вы хотите отобразить их вListBox
. Это правильно? Если да, то добавление их в список в простейшей форме будет включать вызовlstResults.Items.Add
.2. Если у вас есть код, который пытается вызвать метод с именем
addPresidentsToList
, и вам говорят, что он не объявлен, очевидная вещь, которую нужно сделать, это объявить его. После того, как вы объявили метод, очевидная вещь, которую нужно сделать, это реализовать его. Также ничего не стоит, что имя метода подразумевает несколько президентов, в то время как аргументы подразумевают одного президента. Имя метода должно точно отражать то, что делает метод. Добавление одного элемента в список и добавление нескольких элементов в список — это две разные вещи. Кроме того, имена методов должны начинаться с заглавной буквы.
Ответ №1:
Мой текстовый файл выглядит следующим образом.
Washington, George
Adams, John
Jefferson, Thomas
Madison, James
Monroe, James
etc.
Я использую имена по умолчанию для элементов управления в моей текстовой программе, но гораздо лучше использовать описательное имя, как вы.
В Form.Load
я установил MaxLength
свойство текстового поля равным 1. Это позволит ввести в текстовое поле только один символ. Вы можете установить это свойство в конструкторе форм и пропустить эту строку кода. Затем заполните массив президентов точно так, как вы это делали.
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
TextBox5.MaxLength = 1
presidents = IO.File.ReadAllLines("C:UsersmaryoDesktopPresidents.txt")
End Sub
Теперь для кнопки поиска. Нам нужно проверить вводимые пользователем данные. Пользователь может ввести число или знак препинания. Char
https://learn.microsoft.com/en-us/dotnet/api/system.char?view=netcore-3.1#:~:text=Remarks-,.,bit numeric (ordinal) value. это структура .net, представляющая символ. Он предоставляет несколько интересных методов, которые могут быть полезны время от времени. Символ.isLetter() сообщает нам (true или false), является ли символ буквой. Именно это мы и хотим знать. Единственная проблема в том, что a String
не является a Char
, а .Text
свойство a TextBox
равно a String
. Поскольку мы ограничили ввод одним символом, мы можем преобразовать его String
в Char
with CChar()
. Если это буква, мы присваиваем ей значение, в SelectedLetter
противном случае мы исправляем пользователя и выходим из метода.
Вместо всего индексного материала мы можем использовать For Each
цикл. Он проверяет каждый элемент в президентах. String
вызывается метод StartsWith
. Мы можем проверить каждую строку в presidents, чтобы увидеть, соответствует ли она .StartsWith
SelectedLetter
. Если это произойдет, добавьте его в ListBox
.
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
ListBox1.Items.Clear()
'Validate user input
Dim SelectedLetter As String = ""
If Char.IsLetter(CChar(TextBox5.Text)) Then
SelectedLetter = TextBox5.Text.ToUpper
Else
MessageBox.Show("Please enter a letter A - Z.", "Enter Letter")
Exit Sub
End If
For Each pres In presidents
If pres.StartsWith(SelectedLetter) Then
ListBox1.Items.Add(pres)
End If
Next
If ListBox1.Items.Count = 0 Then
'Tell User
MessageBox.Show("No match found", "Search Results")
End If
End Sub