faiqaa Ответов: 1

Проблема с валидацией (проверкой присутствия) с помощью VB.NET


Я использую всего 7 текстовых полей, шесть из них названы в txtBox1,txtBox2,txtBox3,txtBox4,txtBox5,txtBox6, седьмой называется txtBoxSearch,я попытался, используя приведенный ниже код, чтобы выполнить наличие проверьте, проблема заключается в том, что я только хочу, чтобы провести наличие проверяем на первые 6 текстовых полей, ниже код включает txtBoxSearch, а также. Я не знаю, как с этим справиться, у кого-нибудь есть какие-нибудь идеи?Спасибо.

Что я уже пробовал:

      Dim PresenceCheck As Boolean

 Dim emptyTextBoxes =
From txt In Me.Controls.OfType(Of TextBox)()
             Where txt.Text.Length = 0
         Select txt.Name()
        If emptyTextBoxes.Any Then

        End If
        PresenceCheck = False
        'this piece of code looks for all text boxes in the form, if any of them are blank their name would be included in the messagebox which reminds the user to fill them in'


        MessageBox.Show(String.Format("Please fill following textboxes: {0}",
                        String.Join(",", emptyTextBoxes)))
        MessageBox.Show("Customer has not been successfully added")

1 Ответов

Рейтинг:
11

Maciej Los

Если вы хотите получить список текстовых полей, то какое имя вы хотите получить? txtBoxN (где N это число) и текстовое поле не пустое, тогда попробуйте это сделать:

Dim pattern As String = "^txtBox\d$"
Dim r As Regex = New Regex(pattern)

Dim notEmptyTextBoxes = Me.Controls.OfType(Of TextBox) _
                            .Where(Function(x) x.Text.Trim.Length > 0 And r.Match(x.Name).Success) _
                            .ToList()

For Each tb As TextBox In notEmptyTextBoxes
    MsgBox(String.Format("{0} {1}", tb.Name, tb.Text))
Next


Если вы хотите сообщить пользователю о текстовых полях для заполнения, попробуйте сделать это:
Dim msg = String.Join("; ", Me.Controls.OfType(Of TextBox) _
                            .Where(Function(x) x.Text.Trim.Length = 0 And r.Match(x.Name).Success) _
                            .Select(Function(x) x.Name) _
                            .ToList())

MsgBox("Please, fill the following textboxes: " & vbCr & _
        msg, MsgBoxStyle.Information, "Information")


faiqaa

ладно, моя вина, дайте мне посмотреть, работает ли это сейчас. Спасибо. Так что в основном я пытаюсь сохранить данные клиента и если текстовые поля пусты мне не нужно сохранять детали
однако если они будут заполнены, то мне это понадобится.

Maciej Los

Кстати: вы можете редактировать свои комментарии. Наведите на него курсор мыши, и с правой стороны вы увидите карандаш. ;)

faiqaa

Здравствуйте, не могли бы вы взглянуть на это?, одна вещь, которая происходит, заключается в том, что когда я заполнил все текстовые поля и нажал кнопку, я получаю несколько окон сообщений, показывающих мне информацию, введенную в различные текстовые поля, и последнее окно сообщения говорит:" пожалуйста, заполните следующие текстовые поля:"), это происходит даже тогда, когда они заполнены.

 Dim PresenceCheck As Boolean
        Dim pattern As String = "^txtBox\d$"
        Dim r As Regex = New Regex(pattern)

        Dim notEmptyTextBoxes = Me.Controls.OfType(Of TextBox) _
                                    .Where(Function(x) x.Text.Trim.Length > 0 And r.Match(x.Name).Success) _
                                    .ToList()

        For Each tb As TextBox In notEmptyTextBoxes
            MsgBox(String.Format("{0} {1}", tb.Name, tb.Text))
        Next
        Dim msg = String.Join("; ", Me.Controls.OfType(Of TextBox) _
                               .Where(Function(x) x.Text.Trim.Length = 0 And r.Match(x.Name).Success) _
                               .Select(Function(x) x.Name) _
                               .ToList())
        PresenceCheck = False
        MsgBox("Please, fill the following textboxes: " & vbCr & _
                msg, MsgBoxStyle.Information, "Information")

        If PresenceCheck = True Then
            Dim Filenum As Integer = FreeFile()
            FileOpen(Filenum, "C:\Users\Windows 7 User\Desktop\Customers.txt", OpenMode.Append) 'Text file is opened'

            PrintLine(Filenum, txtBox1.Text & "," & txtBox2.Text & "," & txtBox3.Text & "," & txtBox4.Text & "," & txtBox5.Text & "," & txtBox6.Text) 'The data entered in the above text boxes is combined together separated with commas and stored into the open text file'

            FileClose(Filenum) 'Once this is done the text file is closed and message below is displayed'

            MessageBox.Show("Customer has been successfully registered")
        End If

Maciej Los

Подумай об этом!

        Dim pattern As String = "^txtBox\d$"
        Dim r As Regex = New Regex(pattern)
        Dim msg As String = String.Join("; ", Me.Controls.OfType(Of TextBox) _
                               .Where(Function(x) x.Text.Trim.Length = 0 And r.Match(x.Name).Success) _
                               .Select(Function(x) x.Name) _
                               .ToList())
        If msg<>"" Then MsgBox("Please, fill the following textboxes: " & vbCr & _
                    msg, MsgBoxStyle.Information, "Information")

        msg = String.Join(",", Me.Controls.OfType(Of TextBox) _
                                    .Where(Function(x) x.Text.Trim.Length > 0 And r.Match(x.Name).Success) _
                                    .Select(Function(x) String.Concat(x.Name, ":", x.Text)) _
                                    .ToList())
        If msg<>"" Then
            Dim Filenum As Integer = FreeFile()
            FileOpen(Filenum, "C:\Users\Windows 7 User\Desktop\Customers.txt", OpenMode.Append) 'Text file is opened'
            PrintLine(Filenum, msg) 'The data entered in the above text boxes is combined together separated with commas and stored into the open text file'
            FileClose(Filenum) 'Once this is done the text file is closed and message below is displayed'
            MessageBox.Show("Customer has been successfully registered")
        End If

faiqaa

теперь он говорит: "разрешение перегрузки не удалось, потому что никакой доступный 'Concat' не может быть вызван с этими аргументами".

Maciej Los

Проверить еще раз.

faiqaa

Большое вам спасибо, сэр, он работает именно так, как мне было нужно.

Maciej Los

Экстра! Можете ли вы принять мой ответ как решение (чтобы удалить свой вопрос из списка без ответа)?

faiqaa

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

Maciej Los

Дорогой Фаика, все, что тебе нужно сделать, это измениться Where заявление. Нет никакого способа узнать, если вы не пытаетесь решить проблему самостоятельно.
Вы не можете ожидать, что я решу все ваши вопросы одним ответом.

faiqaa

Это нормально, если я смотрю на оба утверждения, где они действительно кажутся прекрасными, в первом длина должна быть равна 0, а во втором она должна быть больше 0, так как я имею дело с заполненными текстовыми полями.

Maciej Los

Ты идешь в правильном направлении! Примечание: если требуется заполнить все текстовые поля, переменная [msg] (во второй раз) должна содержать все данные текстовых полей. Иначе говоря... данные из пустых текстовых полей не записываются в текстовый файл (потому что там нет данных).
Я очень рад, что вы сами начали решать этот вопрос.
Удачи вам!
Овации,
Мацей

faiqaa

Сэр, я изо всех сил стараюсь понять то,что вы сказали, так как мне пришлось также добавить проверку для телефонных номеров, которые я сделал, я все еще сталкиваюсь с той же проблемой, что и провал проверки, данные должны быть сохранены, что в настоящее время происходит, даже если одно текстовое поле пусто, данные не должны быть сохранены, и если номер телефона меньше 9 или больше 11, то то же самое должно произойти.

Код, который у меня сейчас есть, таков::

Тусклый узор в виде строки = "^txtBox\d$"
Dim r As Regex = новое регулярное выражение(шаблон)
Dim msg As String = строка.Join("; ", Me.Controls.Метод Oftype(В Текстовое Поле) _
.Где(функция(x) x.Text.Trim.Length = 0 и r.Match(x.Name).Успех) _
.Выберите(функция(x) x.Name) _
.Список())
Если msg <> "" , То MsgBox("пожалуйста, заполните следующие текстовые поля:" & vbCr & _
msg, MsgBoxStyle.Информация, "Информация")

сообщение = строка.Присоединиться(",", Мне.Контроля.Метод Oftype(В Текстовое Поле) _
.Где(функция(x) x.Text.Trim.Length > 0 и r.Match(x.Name).Успех) _
.Выберите(функция(х) строки.Конкат(x.Name, ":", x.текст)) _
.Список())


Если txtBox5.Text.Length < 9, то
MsgBox("телефонные номера должны быть длиной не менее 9 цифр") 'если значение, введенное в текстовое поле 5, равно < 9, то будет показано соответствующее окно сообщения'
txtBox5.Сосредоточить()
Ящик для сообщений.Показать("клиент не был успешно зарегистрирован")
Конец, Если
Если txtBox5.Text.Length > 11, то
MsgBox("телефонные номера должны иметь длину не более 11 цифр") 'если значение, введенное в текстовое поле 5, равно > 11, то будет показано соответствующее окно сообщения'
txtBox5.Сосредоточить()
Ящик для сообщений.Показать("клиент не был успешно зарегистрирован")
Конец, Если

Если msg < & gt; "" То
Dim Filenum As Integer = Свободный Файл()
FileOpen(Filenum, "C:\Users\Windows 7. User\Desktop\Customers.txt", OpenMode.Добавить) 'текстовый файл открыт'
Рисунком "printline" (как filenum, txtBox1.Текст и amp; "," &амп; txtBox2.Текст и amp; "," &амп; txtBox3.Текст и amp; "," &амп; txtBox4.Текст и amp; "," &амп; txtBox5.Текст и amp; "," &амп; txtBox6.Текст) 'ввод данных в указанных полях сочетается вместе через запятую и хранятся в открытом текстовом файле'
FileClose(Filenum) 'после этого текстовый файл закрывается и отображается сообщение ниже'
Ящик для сообщений.Показать("клиент успешно зарегистрирован")
Конец, Если

Сэр,я понимаю, что вы хотите, чтобы я учился, но сейчас я действительно в отчаянии, так как у меня есть крайний срок на завтра, я начал кодировать с нескольких месяцев. Я действительно не знаю, что делать дальше.

Richard Deeming

NB: FreeFile / FileOpen / PrintLine / FileClose это древний способ записи VB6 в файл.

Раз уж ты употребляешь .NET, вы должны рассмотреть возможность использования .Чистый способ сделать это:
Как записать текст в файл | Microsoft Docs[^]
(Примеры приведены на языке C#, но их не так уж трудно перевести.)

If PresenceCheck Then
    IO.File.AppendLine("C:\Users\Windows 7 User\Desktop\Customers.txt",
        txtBox1.Text & "," & txtBox2.Text & "," & txtBox3.Text & "," & txtBox4.Text & "," & txtBox5.Text & "," & txtBox6.Text)
End If


И если это должен быть путь к рабочему столу текущего пользователя, вы должны использовать Мой.Компьютер.файловая система.Специальные каталоги.Рабочий стол[^] чтобы вернуть его:
Dim folderPath As String = My.Computer.FileSystem.SpecialDirectories.Desktop
Dim filePath As String = IO.Path.Combine(folderPath, "Customers.txt")

faiqaa

Подождите, вы ответили на главный вопрос наверху? или к комментариям?

Richard Deeming

Я отвечаю на ваш комментарий.

faiqaa

Но Сэр, вы написали "If PresenceCheck", я не использовал это в своем коде, и мне нужно было бы объявить его.

Richard Deeming

Комментарий, на который я ответил, имеет:

If PresenceCheck = True Then
    Dim Filenum As Integer = FreeFile()

Если не вы написали этот комментарий, то кто же?

faiqaa

О да, я думал, что вы говорите о последнем комментарии, извините за недоразумение.