Создан класс ReceiptItem.Это может быть просто структура, которая, вероятно, будет лучше (тип с более легким значением).Затем List (Of ReceiptItem) сохраняет объекты.
Крошечный Fucntion получает выбранный переключатель.Это может быть сделано в цикле, что и делает внутренняя часть Linq.
Чтобы чек выглядел лучше, он должен действительно отображаться в ListView или DataGridView.Вы можете смоделировать столбцы в ListBox с отступами и так далее, но вам придется использовать моноширинный шрифт, который сам по себе ужасен.
Private Sub btnCalculate_Click(sender As Object, e As EventArgs) Handles btnCalculate.Click
Dim lstItems As New List(Of ReceiptItem)
Dim SelectedRadioButton1 As RadioButton = GetSelectedRadioButton(GroupBox1)
lstItems.Add(New ReceiptItem(SelectedRadioButton1.Text, 1.05D))
Dim SelectedRadioButton2 As RadioButton = GetSelectedRadioButton(GroupBox2)
lstItems.Add(New ReceiptItem(SelectedRadioButton2.Text, CDec(SelectedRadioButton2.Tag)))
If chkMayo.Checked = True Then
lstItems.Add(New ReceiptItem("Mayonaise", 0.6D))
End If
If chkButter.Checked = True Then
lstItems.Add(New ReceiptItem("Butter", 0.6D))
End If
FillReceiptListBox(lstItems)
End Sub
Private Function GetSelectedRadioButton(ctrl As Control) As RadioButton
Dim rButton As RadioButton = ctrl.Controls.OfType(Of RadioButton).FirstOrDefault(Function(r) r.Checked = True)
Return rButton
End Function
Private Sub FillReceiptListBox(lst As List(Of ReceiptItem))
Dim Total As Decimal
For Each item In lst
Total += item.Price
Dim strPrice As String = item.Price.ToString("N2")
ListBox1.Items.Add($"{item.Description} -- {item.Price.ToString("N2")}")
Next
ListBox1.Items.Add($"Total {Total.ToString("C")}")
End Sub
Class ReceiptItem
Public Property Description As String
Public Property Price As Decimal
Public Sub New(des As String, p As Decimal)
Description = des
Price = p
End Sub
End Class