Я создал класс для данных, связанных с энергетическим полем. Общие поля содержат значения, используемые во всех экземплярах класса. Эти значения устанавливаются в методе Form.Load путем вызова метода SetRates. Поскольку это метод Shared, вам не нужно создавать экземпляр класса. MonthNumber используется для заказа списка счетов за электроэнергию. Возможно, вам придется изменить метод CalculateGrossMonthlyBill, потому что я предположил градуированную скорость. Метод ToString используется полем со списком для определения отображения.
В дизайне формы я назвал каждое текстовое поле в групповом поле MonthlyEnergyUse месяцем, который они представляют. Вы, вероятно, захотите начать со свойства .Text, равного 0. Свойство .Tag каждого месяца — это число, представляющее месяц. 3 марта, 4 апреля и т. д. Эти номера будут использоваться для заказа списка.
В Form.Load установлены тарифы Shared. Хотя я жестко запрограммировал значения, их можно было получить из текстового файла или базы данных. Если их нужно изменить, вам не придется перекомпилировать программу.
После того, как текстовые поля месяца заполнены, нажимается Button1. Сначала пользовательский ввод проверяется с помощью функции .TryParse. Мы создаем список EnergyBill, затем перебираем каждое текстовое поле, вызывая конструктор EnergyBill, передавая значения из свойств текстового поля. Конструктор устанавливает Read Only свойства класса. Этот новый EnergyBill затем добавляется в список.
Далее список упорядочен по MonthNumber с небольшим количеством магии Linq. Затем он привязывается к ComboBox (это заменяет текстовое поле, которое вы пометили как «Месяц» в правой части формы.
Общий итог рассчитывается с использованием .Sum метода списка и отображается в текстовом поле.
Вы можете увидеть данные за каждый месяц, выбрав месяц в поле со списком. Элементы ComboBox являются объектами, но базовым типом является EnergyBill, поэтому мы можем привести элемент и получить доступ ко всем свойствам.
Public Class EnergyBill
Private _MonthlyChargeWithTax As Decimal
Private _DiscountAmount As Decimal
Private _TotalAmount As Decimal
Private Shared LowUsageRate As Decimal
Private Shared HighUsageRate As Decimal
Private Shared DiscountRate As Decimal
Private Shared TaxRate As Decimal
Public Property Month As String
Public Property MonthNumber As Integer
Public Property EnergyUsage As Double
Public ReadOnly Property MonthChargeWithTax As Decimal
Get
Return _MonthlyChargeWithTax
End Get
End Property
Public ReadOnly Property DiscountAmount As Decimal
Get
Return _DiscountAmount
End Get
End Property
Public ReadOnly Property TotalAmount As Decimal
Get
Return _TotalAmount
End Get
End Property
Public Sub New(BillingMonth As String, MonthNum As Integer, Usage As Integer)
Month = BillingMonth
EnergyUsage = Usage
MonthNumber = MonthNum
_MonthlyChargeWithTax = CalculateGrossMonthlyBill(Usage)
_DiscountAmount = _MonthlyChargeWithTax * DiscountRate
_TotalAmount = _MonthlyChargeWithTax - _DiscountAmount
End Sub
Private Function CalculateGrossMonthlyBill(usage As Integer) As Decimal
Dim MonthCharge As Decimal
Select Case usage
Case <= 200
MonthCharge = usage * LowUsageRate
Case Else
MonthCharge = 200 * LowUsageRate
MonthCharge += (usage - 200) * HighUsageRate
End Select
Return MonthCharge * 1.06D
End Function
Public Shared Sub SetRates(LowUsage As Decimal, HighUsage As Decimal, Discount As Decimal, Tax As Decimal)
LowUsageRate = LowUsage
HighUsageRate = HighUsage
DiscountRate = Discount
TaxRate = Tax
End Sub
Public Overrides Function ToString() As String
Return Month
End Function
End Class
Форма...
Public Class UtilityBills
Private Sub UtilityBills_Load(sender As Object, e As EventArgs) Handles MyBase.Load
EnergyBill.SetRates(0.109D, 0.153D, 0.5D, 0.06D)
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
If Not ValidateUsage() Then
MessageBox.Show("All text boxes must have a valid number.")
Exit Sub
End If
Dim lst As New List(Of EnergyBill)
For Each tb In GroupBox1.Controls.OfType(Of TextBox)
Dim eb As New EnergyBill(tb.Name, CInt(tb.Tag), CInt(tb.Text))
lst.Add(eb)
Next
Dim orderedList = (lst.OrderBy(Function(eb) eb.MonthNumber)).ToList
ComboBox1.DataSource = orderedList
Dim TotalMonths = lst.Sum(Function(eb) eb.TotalAmount)
TextBox5.Text = TotalMonths.ToString("C2")
End Sub
Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
Dim eb = DirectCast(ComboBox1.SelectedItem, EnergyBill)
TextBox1.Text = eb.MonthChargeWithTax.ToString("C2")
TextBox2.Text = eb.DiscountAmount.ToString("C2")
TextBox3.Text = eb.TotalAmount.ToString("C2")
End Sub
Private Function ValidateUsage() As Boolean
Dim usage As Integer
For Each tb In GroupBox1.Controls.OfType(Of TextBox)
If Not Integer.TryParse(tb.Text, usage) Then
Return False
End If
Next
Return True
End Function
End Class
person
Mary
schedule
26.09.2020