2013-10-31 46 views
3

这个术语是VB类,我一直在困扰着一个我试图找出的问题。我们被要求在电影出租的地方为电影创作一个价格计算器。额外的信贷将它们存储在列表中并且能够列出列表。我已经得到了这么多,现在我想更进一步,实际上以附加价格为标题添加标题。我认为最简单的方法可能是使用数组,但我没有太多处理数组的经验。变量列表框?

我正在考虑按照存储每个标题(作为其添加的)以及变量中的价格在列表框的每一行中给出“电影标题 - $ 2.93”格式。为了解决这个问题,我打算发布我的完整源代码,这可能会让我更容易看到我想要完成的任务。任何帮助将非常感激。感谢堆栈溢出社区! 我的项目的屏幕截图可以在这里看到:http://puu.sh/54SgI.jpg

 
Public Class Form1 
    'globablly declared because I might use them outside of btnAdd_Click event 
    Const decDiscount As Double = 0.9 '1-.10 discount = .9 
    Const decDVD As Decimal = 2D 
    Const decBlueray As Decimal = 2.5D 
    Const decDVDNew As Decimal = 3.25D 
    Const decBluerayNew As Decimal = 3.5D

Dim intCount As Integer Dim decCost, decTotal As Decimal Dim decDayTotal As Decimal Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load AcceptButton = btnAdd End Sub Private Sub chkDiscount_Click(sender As Object, e As EventArgs) Handles chkDiscount.Click If chkDiscount.CheckState = 1 Then chkDiscount.Enabled = False End If End Sub Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click 'Display error when no title entered If txtAdd.Text = "" Then MessageBox.Show("Please enter a movie title and select the appropriate item details.", "Complete details", MessageBoxButtons.OK, MessageBoxIcon.Error) Else listMovies.Items.Add(txtAdd.Text) listMovies.SelectedIndex = listMovies.SelectedIndex + 1 End If 'update list 'clear txtbox txtAdd.Text = "" 'Decision Statements to calculate correct price If radDVD.Checked = True Then decCost = CDec(decDVD.ToString("c")) If chkNew.Checked = True Then decCost = CDec(decDVDNew.ToString("c")) End If ElseIf radBlueray.Checked = True Then decCost = CDec(decBlueray.ToString("c")) If chkNew.Checked = True Then decCost = CDec(decBlueray.ToString("c")) End If End If If chkDiscount.Checked = True Then decCost = CDec((decCost * decDiscount).ToString("c")) End If 'display cost txtCost.Text = CStr(CDec(decCost)) 'calc total decTotal = CDec(decTotal + decCost) 'display total txtTotal.Text = CStr(CDec(decTotal)) 'clear chkNew every item added to list chkNew.CheckState = 0 End Sub 'Public so summary message box can access variable Public Sub btnFinish_Click(sender As Object, e As EventArgs) Handles btnFinish.Click 'Add +1 to counter & update txtCounter intCount = CInt(Val(intCount) + 1) 'add to day total decDayTotal = CDec(Val(decDayTotal) + decTotal) 'Set Everything back to empty/enabled chkDiscount.Enabled = True chkDiscount.CheckState = 0 chkNew.CheckState = 0 txtAdd.Text = "" txtCost.Text = "" txtTotal.Text = "" decTotal = 0 decCost = 0 'Instead of clearing radios each time, a more desirable result would be to have DVD always set back to the default checked radio radDVD.Checked = True radBlueray.Checked = False listMovies.Items.Clear() End Sub Private Sub btnSummary_Click(sender As Object, e As EventArgs) Handles btnSummary.Click If decTotal > 0 Then MessageBox.Show("Please finish your current order before viewing a daily summary.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) Else MessageBox.Show(("Your total cutomer count is: " & intCount) + Environment.NewLine + ("Your total sales today is: $" & decDayTotal), "Daily Summary", MessageBoxButtons.OK) End If End Sub Private Sub btnRemove_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRemove.Click listMovies.Items.Remove(listMovies.SelectedItem) End Sub

+0

你的具体问题是什么?如果额外的功劳是将它们存储在列表中,不要使用数组,请使用List(String)或者可能是一个类。你也有很多冗余代码:'intCount = CInt(Val(intCount)+ 1)',因为intCount是一个整数,'intCount + = 1'是你所需要的。和**从来没有**使用Val(或Cint)看看XXX.TryParse和Convert.ToXXXX – Plutonix

+0

是的,我刚才清理了一切,谢谢。 我的具体问题涉及字典我认为,我不知道完成我想要完成的最佳方式。基本上,我想将电影标题添加到列表框以及条目右侧的价格以及删除事件我想从列表中删除它们以及更新decTotal整数。感谢你目前的帮助! (:@Plutonix – TheCrispyToast

回答

0

我不会走的很远,因为在这里你需要做的工作。但是,我会带班开始:

Public Class Movie 

Public Title As String = "" 
Public Cost As Decimal 

' prevents you from adding a movie without critical info 
Public Sub New(ByVal t As String, ByVal c As Decimal) 
    Title = t 
    Cost = c 

End Sub 

End Class 

这将举行一个电影标题的租赁信息,并保持在一起(并可以以打印完全按照自己的显示被添加到)。该计划(就我理解你的意思而言)将是为每部租借的电影创建一个,并将其添加到List(Of Movie)这比在这种情况下的字典更合适。

要创建一个电影:

Dim m As New Movie(theTitle, theCost) 

事我会做的事:

  • 你做了声明数值作为数字的好工作。修复将其转换为字符串并返回数字的代码。 (编辑您的帖子)
  • 您可以使用电影类来单独填充“购物车”列表框;在这一点上,listMovies.Items将是额外的信用列表。但它不会伤害使用/了解List (Of T)。 (顺便说一句,在打印机上'打印'是指打印纸吗?)
  • 你在做什么chkDiscount?如果他们检查它,则禁用它(并且从不启用)。你是否想要禁用新版本检查?在这种情况下,他们真的是一对无线电吗?
  • 无论哪种方式,CheckChanged是一个更好的事件进行评估,并没有理由手动设置自己发生的用户的检查状态。

退房名单(的T)和HTH

+0

我想要做的是设置一个删除事件,它从列表中删除标题(我已经拥有该部分),然后删除它们添加到列表中时所对应的价格。有不同的价格因素,所以价格是不同的每个List.Items.add()条目,这就是为什么我假设一个字典将是一个简单的方法来做到这一点。对于添加事件我有: lstMovies.Items.Add(txtAdd .Text) lstMovies.SelectedIndex = lstMovies.SelectedIndex + 1 myDict.Add(txtAdd.Text,decCost) @Plutonix – TheCrispyToast

0

一件好事,想想做这样的作业(特别是学习你的第一语言时)时是考虑算法(你需要的步骤达到你的目标)。

1,确定你需要达到目标的所有步骤。

第二,我认为这是您的问题的更重要的点,找出步骤需要在什么顺序(或更好的顺序,他们是最有效的)。

在你的情况下,我认为你是一种通过将电影名称先添加到列表中,然后尝试将价格添加到行中的方法。除非这种功能被要求作为分配的一部分,否则我将要求用户在接受任何一个(就像您当前使用的名称一样)之前输入名称的价格。像这样的:

If txtAdd.Text <> "" AND txtCost.Text <> "" Then 'requiring both fields to not be null 
    ''add moive code 
Else 
    ''MessageBox.Show("Yadda Yadda Yadda") 
End If 

我Plutonix同意,创建一个类,而矫枉过正你的情况,是一个好主意,因为它会给你练习的时候它会是适当的。一旦你有一个类的电影,然后你可以这样创建短片(S)的列表:

Dim MovieList as new List(of Movie) 

那么,每次按btnAdd按钮时,您可以值传递给电影和ADD它的名单。

Dim m As Movie 
Dim MovieList as new List(of Movie) 

Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click 
    'Display error when no title entered 
    If txtAdd.Text <> "" And txtCost.Text <> "" Then 
     myMovie = New Movie(txtAdd.Text, txtCost.Text) 
     myMovieList.Add(myMovie) 
     listMovies.Items.Clear() 

     For Each X As Movie In myMovieList 
      listMovies.Items.Add(X.DisplayMovie) 
     Next 
    Else 
     MessageBox.Show("Please enter a movie title and select the appropriate item details.", "Complete details", MessageBoxButtons.OK, MessageBoxIcon.Error) 
    End If 
    'Other Code 
End Sub 

注行ListMovies.Items.Add(X.DisplayMovie)我添加到类电影(如下图所示),这样它会做的格式如你所说的功能。

Public Function DisplayMovie() 
    Return Title & " - $" & Cost 
End Function 

这会给你带来很大的方便。尝试推断Plutonix和我自己解释的内容以进一步优化您的代码。例如,尝试将调整后的价格计算封装在自己的函数中,以便您可以从任何地方调用它。

+0

OMG,你删除了一个问题,我写了一个很大的答案,你可以联系我,也许我可以帮助你(关于你的游戏管理器)https://twitter.com/Waescher – Waescher