Вызов функции в VB со структурой в качестве параметра - PullRequest
0 голосов
/ 08 февраля 2019
Public Class Form1
Public Structure Stock
    Dim prodSKU As String
    Dim sizeAmt As Integer
    Dim prodName As String
    Dim category As String
    Dim sellPrice As Decimal
    Dim buyPrice As Decimal
End Structure

Dim product(300) As Stock

Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
    product(0).prodSKU = txtSKU.Text
    product(1).prodSKU = "af"
    Call CheckData(Stock, txtSKU, product, txtName)

End Sub


Function CheckData(Stock As Object, txtSku As TextBox, product() As Object, txtName As TextBox)
        For index = 0 To 299
            txtSku.Text = product(index).prodSKU
            txtName.Text = product(index).prodName
            If txtSku.Text = product(index).prodSKU Or txtName.Text = product(index).prodName Then
                Dim Msg, Style, Title, Response
                Msg = "That SKU/Product Name already exists, enter another"    ' Define message.
                Style = vbOK    ' Define buttons.
                Title = "Repeated Saved Data"    ' Define title
                Response = MsgBox(Msg, Style, Title)
                If Response = vbOK Then    ' User chose Ok
                    Exit Function
                End If
            End If
        Next
    End Function

End Class

Я пытаюсь вызвать функцию «CheckData» со структурами в качестве одного из параметров и, похоже, не могу понять это.Примечание: Относительно новичок в VB, будьте осторожны.

1 Ответ

0 голосов
/ 08 февраля 2019

Сначала включите Option Strict.Вы можете найти этот параметр в Меню инструментов -> Параметры -> Проекты и решения -> VB по умолчанию.Это избавит вас от ошибок во время выполнения.

Function CheckData(Stock As Object, txtSku As TextBox, product() As Object, txtName As TextBox)
  1. Stock As Object

Неправильно называть вашу переменную тем же именем, что и ваша структура.Шаблон для параметров - это имя переменной как DataType.Ваша структура общедоступна, поэтому ее можно увидеть любым методом.Старайтесь держаться подальше от объекта как типа данных.Вы никогда не используете переменную Stock в своей функции, поэтому она не нужна.Помните, что Stock является локальной переменной.Это не имеет никакого отношения к Структуре, называемой Запасом.Тип объекта.

txtSku As TextBox

Кажется, что txtSku - это TextBox в вашей форме.Нет необходимости передавать это вашей функции, потому что функция может обращаться к ней напрямую.

product() As Object

product() - переменная уровня формы, которая, таким образом, видима для всех методов формы.Это не нужно.

txtName As TextBox

То же, что №2 - Ненужно

Function требуется DataType

Закрытая функция CheckData () As Boolean

и Возврат в теле функции

Return True

Это не обязательно должен быть Boolean, может быть любой тип.Это был просто пример.Поскольку ничего не возвращается, процедура должна быть Sub.

Dim product(300) As Stock

объявляет массив с 301 элементом с индексами от 0 до 300. В массивах vb.net объявляется продукт (UBound) или верхняя граница.Это резервирует некоторую память для 301 структуры акций.Возможно, было бы лучше использовать List (Of T) T обозначает тип.Итак, ваш список будет

Dim product as New List(Of Stock)

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

Теперь в вашем btnSave_Click Создайте новый экземпляр Stock

Dim stck в качестве нового запаса

Установите некоторые свойства

stck.prodSku = txtSKU.Text

Добавить в список продуктов

product.Add(stck)

повторно использовать ту же переменную, установив ее для нового экземпляра Stock

stck = New Stock
stck.prodSKU = "af"
procuct.Add(stck)

Не нужно использовать ключевое слово Call вэто и большинство обстоятельств.

CheckData()
Вернуться к телу Sub CheckData (), новой функции.Смотрите в строке комментарии и объяснения.
Public Structure Stock
    Dim prodSKU As String
    Dim sizeAmt As Integer
    Dim prodName As String
    Dim category As String
    Dim sellPrice As Decimal
    Dim buyPrice As Decimal
End Structure

'A plural name helps identify this as a collection
Private products As New List(Of Stock)

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    'Create a new Stock object
    Dim stck As New Stock
    stck.prodSKU = txtSKU.Text
    'Add the Stock object to the list
    products.Add(stck)
    stck = New Stock
    stck.prodSKU = "af"
    products.Add(stck)
End Sub

Private Sub CheckData()
    For Each item As Stock In products
        'These values will be overwritten on every iteration of the loop
        txtSku.Text = item.prodSKU
        txtName.Text = item.prodName
        'Well this is kind of silly you just set these properties so of course it is true!
        'If txtSku.Text = item.prodSKU Or txtName.Text = product(Index).prodName Then
        'With Option Strict uninitiated varaibles must have a type
        'Dim Msg, Style, Title, Response
        'the variable is assigned a value so the compiler now knows the type
        Dim Msg = "That SKU/Product Name already exists, enter another"    ' Define message.
        Dim Title = "Repeated Saved Data"    ' Define title
        'Since the user can only click OK this loop will only go once
        Dim Response As DialogResult = MessageBox.Show(Msg, Title, MessageBoxButtons.OK)
        If Response = vbOK Then    ' User chose Ok
            Exit Sub
        End If
    Next
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...