如何为此做一个循环

How to make a loop for this

        If NUD_Pepperoni.Value > 0 Then 
            txtSummary.AppendText(vbNewLine + "Pepperoni" + vbTab & vbTab & NUD_Pepperoni.Text + vbTab & price.ToString("c1") + vbTab + vbTab & (NUD_Pepperoni.Value * price).ToString("c1") + vbNewLine)
        End If
        If NUD_Hawaiian.Value > 0 Then 
            txtSummary.AppendText(vbNewLine + "Hawaiian" + vbTab & vbTab & vbTab & NUD_Hawaiian.Text + vbTab & price.ToString("c1") + vbTab + vbTab & (NUD_Hawaiian.Value * price).ToString("c1") + vbNewLine)
        End If
        If NUD_Americano.Value > 0 Then 
            txtSummary.AppendText(vbNewLine + "Americano" + vbTab & vbTab & NUD_Americano.Text + vbTab & price.ToString("c1") + vbTab + vbTab & (NUD_Americano.Value * price).ToString("c1") + vbNewLine)
        End If 

有12个相同

下面的代码是我存储的值

Dim Pizzalist(11, 1) As Single

============================================= ===================

For p = 0 To 5
            Pizzalist(p, 0) = 8.5 'store the regular pizza Price
        Next
        For p = 6 To 11
            Pizzalist(p, 0) = 13.5 'store the gourmet pizza price
        Next

============================================= ===================

Pizzalist(0, 1) = NUD_Pepperoni.Value
        Pizzalist(1, 1) = NUD_Hawaiian.Value
        Pizzalist(2, 1) = NUD_Americano.Value
        Pizzalist(3, 1) = NUD_TacoFiesta.Value
        Pizzalist(4, 1) = NUD_Margherita.Value
        Pizzalist(5, 1) = NUD_BeefOnion.Value
        Pizzalist(6, 1) = NUD_BNY.Value
        Pizzalist(7, 1) = NUD_MML.Value
        Pizzalist(8, 1) = NUD_IL.Value
        Pizzalist(9, 1) = NUD_GSS.Value
        Pizzalist(10, 1) = NUD_AC.Value
        Pizzalist(11, 1) = NUD_TMC.Value'store the amount of specific pizza

我查阅了很多例子试图找出如何做到这一点,但我做不到。谢谢!

如果您有一个 class,其中包含与披萨相关的信息,我们称之为 Pizza,您可以创建一个 List(Of Pizza)。一旦输入了数据,就可以迭代该列表,例如,如果用户单击按钮来计算价格。

Public Class Form1

    Dim pizzas As New List(Of Pizza)

    Public Class Pizza
        Public Property QuantitySelector As NumericUpDown
        Public Property UnitPrice As Decimal
        Public Property Name As String

        Public ReadOnly Property Quantity As Integer
            Get
                Return Convert.ToInt32(QuantitySelector.Value)
            End Get
        End Property

        Sub New()
            ' Empty constructor
        End Sub

        Sub New(name As String, quantitySelector As NumericUpDown, unitPrice As Decimal)
            Me.QuantitySelector = quantitySelector
            Me.UnitPrice = unitPrice
            Me.Name = name
        End Sub

    End Class

    Private Sub bnCalcPrice_Click(sender As Object, e As EventArgs) Handles bnCalcPrice.Click
        Dim sb As New Text.StringBuilder

        For Each pz In pizzas
            If pz.Quantity > 0 Then
                sb.Append(vbNewLine & pz.Name & vbTab & vbTab & pz.Quantity & vbTab & pz.UnitPrice.ToString("c1") & vbTab & vbTab & (pz.Quantity * pz.UnitPrice).ToString("c1") & vbNewLine)
            End If
        Next

        txtSummary.Text = sb.ToString()

    End Sub

    Private Sub InitPizzas()
        Dim regularPrice = 8.5D ' Use Decimal values for money.
        Dim premiumPrice = 13.5D

        pizzas.Add(New Pizza("Hawaiian", NUD_Hawaiian, premiumPrice))
        pizzas.Add(New Pizza("Americano", NUD_Americano, premiumPrice))
        ' etc.

    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        InitPizzas()

    End Sub

End Class

您也可以添加代码以将每种披萨的单独价格相加。

我还为您创建了一个解决方案。安德鲁在我忙碌的同时回复了你,但我不想隐瞒你。 正如安德鲁所说,我会改变整个概念。我写了一个 class ,其中包含披萨最重要的属性。您可以在餐厅厨房更改金额。数据保存在List(of ClassPizza)中。正如安德鲁所说,您然后可以遍历此列表并利用这些属性。例如按 属性 xy 排序。也许是最佳食用日期?

您可以将数据保存在文本文件中。 (当然,它可以做得更好/不同,但我们今天不想夸大其词)。这些数据在程序启动时被读入。 (第一次当然没有数据,直接在OpenfileDialog里点取消)

当新商品到达时,您可以单击“将新比萨饼进店”按钮并输入所有内容。为此打开第二个表格。注意确保没有输入错误(例如,数量 0 没有意义 – 文本随后变为红色)。

当前股票显示在12个文本框中。

这是Form1.vb:

Imports Microsoft.VisualBasic.ControlChars
Imports Microsoft.WindowsAPICodePack.Dialogs
Public NotInheritable Class FormMain
    Private ReadOnly Deu As New System.Globalization.CultureInfo("de-DE") ' change this to your language, for example "en-GB"
    Private ReadOnly All_my_pizzas_List As New List(Of ClassPizza)
    Private Sub FormMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        For Each tb As TextBox In Me.Controls.OfType(Of TextBox)
            tb.Text = "0"
        Next
    End Sub

    Private Sub FormMain_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
        Dim Path As String
        Using OFD1 As New CommonOpenFileDialog
            OFD1.Title = "pick file to open"
            OFD1.Filters.Add(New CommonFileDialogFilter("Text file", ".txt"))
            OFD1.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
            If OFD1.ShowDialog() = CommonFileDialogResult.Ok Then
                Path = OFD1.FileName
            Else
                Return
            End If
        End Using

        'read all Text
        Dim RAT() As String = System.IO.File.ReadAllLines(Path, System.Text.Encoding.UTF8)
        If RAT.Length = 0 Then Return

        For i As Integer = 1 To RAT.Length - 3 Step 1
            If RAT(i) = "#" Then
                All_my_pizzas_List.Add(New ClassPizza(CType(RAT(i + 1), ClassPizza.Types_of_pizza), CUShort(RAT(i + 2)), CDec(RAT(i + 3))))
            End If
        Next

        Update_Textboxes()

    End Sub

    Private Sub Update_Textboxes()
        Dim NUD_Pepperoni, NUD_Hawaiian, NUD_Americano, NUD_TacoFiesta, NUD_Margherita, NUD_BeefOnion, NUD_BNY, NUD_MML, NUD_IL, NUD_GSS, NUD_AC, NUD_TMC As Integer
        For Each piz As ClassPizza In All_my_pizzas_List
            Select Case piz.Type_of_pizza
                Case ClassPizza.Types_of_pizza.NUD_Pepperoni
                    NUD_Pepperoni += 1
                Case ClassPizza.Types_of_pizza.NUD_Hawaiian
                    NUD_Hawaiian += 1
                Case ClassPizza.Types_of_pizza.NUD_Americano
                    NUD_Americano += 1
                Case ClassPizza.Types_of_pizza.NUD_TacoFiesta
                    NUD_TacoFiesta += 1
                Case ClassPizza.Types_of_pizza.NUD_Margherita
                    NUD_Margherita += 1
                Case ClassPizza.Types_of_pizza.NUD_BeefOnion
                    NUD_BeefOnion += 1
                Case ClassPizza.Types_of_pizza.NUD_BNY
                    NUD_BNY += 1
                Case ClassPizza.Types_of_pizza.NUD_MML
                    NUD_MML += 1
                Case ClassPizza.Types_of_pizza.NUD_IL
                    NUD_IL += 1
                Case ClassPizza.Types_of_pizza.NUD_GSS
                    NUD_GSS += 1
                Case ClassPizza.Types_of_pizza.NUD_AC
                    NUD_AC += 1
                Case ClassPizza.Types_of_pizza.NUD_TMC
                    NUD_TMC += 1
                Case Else
                    Exit Select
            End Select
        Next

        TextBox_Pepperoni.Text = NUD_Pepperoni.ToString(Deu)
        TextBox_Hawaiian.Text = NUD_Hawaiian.ToString(Deu)
        TextBox_Americano.Text = NUD_Americano.ToString(Deu)
        TextBox_TacoFiesta.Text = NUD_TacoFiesta.ToString(Deu)
        TextBox_Margherita.Text = NUD_Margherita.ToString(Deu)
        TextBox_BeefOnion.Text = NUD_BeefOnion.ToString(Deu)
        TextBox_BNY.Text = NUD_BNY.ToString(Deu)
        TextBox_MML.Text = NUD_MML.ToString(Deu)
        TextBox_IL.Text = NUD_IL.ToString(Deu)
        TextBox_GSS.Text = NUD_GSS.ToString(Deu)
        TextBox_AC.Text = NUD_AC.ToString(Deu)
        TextBox_TMC.Text = NUD_TMC.ToString(Deu)
    End Sub

    Private Sub Button_toStore_Click(sender As Object, e As EventArgs) Handles Button_toStore.Click
        Using FNP As New Form_new_pizza
            FNP.GetData()
            If FNP.ShowDialog = DialogResult.Yes Then
                For i As UInt16 = 0US To FNP.Amount - 1US Step 1US
                    All_my_pizzas_List.Add(New ClassPizza(CType(FNP.SI, ClassPizza.Types_of_pizza), 1US, FNP.price))
                Next
            End If
        End Using
        Update_Textboxes()
    End Sub

    Private Sub Button_change_values_Click(sender As Object, e As EventArgs) Handles Button_change_values.Click
        ' this is still empty
    End Sub

    Private Sub Button_Save_Click(sender As Object, e As EventArgs) Handles Button_Save.Click
        '-------------------------------------------------------------------------------------------------------------
        ' User can choose where to save the database text file and the program will save it.
        '-------------------------------------------------------------------------------------------------------------
        Dim Path As String
        Using SFD1 As New CommonSaveFileDialog
            SFD1.Title = "write data into text file"
            SFD1.Filters.Add(New CommonFileDialogFilter("Text file", ".txt"))
            SFD1.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
            If SFD1.ShowDialog() = CommonFileDialogResult.Ok Then
                Path = SFD1.FileName & ".txt"
            Else
                Return
            End If
        End Using

        Using textfile As System.IO.StreamWriter = My.Computer.FileSystem.OpenTextFileWriter(Path, True, System.Text.Encoding.UTF8)
            textfile.WriteLine("Status of this file [dd.mm.yyyy hh:mm:ss]: " & Date.Now.ToString("G", Deu))

            For Each pizza As ClassPizza In All_my_pizzas_List
                textfile.WriteLine("#") ' Marker
                textfile.WriteLine(pizza.Type_of_pizza)
                textfile.WriteLine(pizza.stored_amount)
                textfile.WriteLine(pizza.price)
            Next

            textfile.Close()
        End Using

    End Sub
End Class

这是ClassPizza.vb

的代码
Public NotInheritable Class ClassPizza
    Public Enum Types_of_pizza
        NUD_Pepperoni
        NUD_Hawaiian
        NUD_Americano
        NUD_TacoFiesta
        NUD_Margherita
        NUD_BeefOnion
        NUD_BNY
        NUD_MML
        NUD_IL
        NUD_GSS
        NUD_AC
        NUD_TMC
    End Enum
    Public Type_of_pizza As Types_of_pizza

    Public stored_amount As UInt16 = 0US

    ''' <summary>
    ''' in $
    ''' </summary>
    Public price As Decimal

    Public Sub New(ByVal type As Types_of_pizza, ByVal storedAmount As UInt16, price As Decimal)
        Me.Type_of_pizza = type
        Me.stored_amount = storedAmount
        Me.price = price
    End Sub
End Class

这是第二个表格的代码 (Form_new_pizza.vb)

Public NotInheritable Class Form_new_pizza
    Public Amount As UInt16
    Public price As Decimal
    Public SI As Integer

    Public Sub GetData()
        For Each _item As Object In [Enum].GetValues(GetType(ClassPizza.Types_of_pizza))
            ListBox1.Items.Add(_item)
        Next
    End Sub
    Private Sub Form_new_pizza_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    End Sub

    Private Sub TextBox_Amount_TextChanged(sender As Object, e As EventArgs) Handles TextBox_Amount.TextChanged
        Dim success As Boolean = UInt16.TryParse(TextBox_Amount.Text, Amount)
        If success AndAlso Amount > 0US Then
            TextBox_Amount.ForeColor = Color.FromArgb(0, 200, 0) 'Green
        Else
            TextBox_Amount.ForeColor = Color.Red
        End If
    End Sub

    Private Sub TextBox_price_TextChanged(sender As Object, e As EventArgs) Handles TextBox_price.TextChanged
        Dim success As Boolean = Decimal.TryParse(TextBox_price.Text, price)
        If success Then
            TextBox_price.ForeColor = Color.FromArgb(0, 200, 0) 'Green
        Else
            TextBox_price.ForeColor = Color.Red
        End If
    End Sub

    Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedIndexChanged
        If ListBox1.SelectedIndex <> (-1) Then
            SI = ListBox1.SelectedIndex
        End If
    End Sub

    Private Sub Button_OK_Click(sender As Object, e As EventArgs) Handles Button_OK.Click
        If SI <> (-1) AndAlso Amount > 0US Then
            Me.DialogResult = DialogResult.Yes
        Else
            Me.DialogResult = DialogResult.No
        End If
    End Sub
End Class

当然,任何人都可以扩展并做得比我好,但是你可以开始,理解这个概念。

顺便说一下

您应该在项目属性中将“Option Strict”设置为On,以便建议您转换数据类型。还要将“Option Infer”设置为 Off,以便您始终必须记下数据类型(“As Integer”、“As Double”……)。然而,后者是一个品味问题。 此外,您应该删除 VB6 命名空间,因为 VB6 功能已弃用。 如果需要控制字符(比如NewLine),可以写Imports Microsoft.VisualBasic.ControlChars .

====================================

请注意,我使用的是从 Visual Studios 自己的 Nuget 包管理器下载的 FileDialog。见图像。您不必这样做,但我更喜欢这个 FileDialog,因为它提供的选项比已经包含的选项更多。