Как мне добавить результаты в список?

#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