2016-09-15 36 views
2

以下是我編碼的簡單投票系統的代碼。在圖片框中顯示贏家的名字

Public Class Form1 
    Dim winner As String 
    Dim maxVotes As Integer 
    Dim votes() As String 
    Dim index As String 
    Dim candidates As String 

    Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click 
     If Not isValidInput(txtNewCandidate.Text) Then 
      Exit Sub 
     End If 
     lstCandidates.Items.Add(txtNewCandidate.Text) 
     txtNewCandidate.Clear() 
     txtNewCandidate.Focus() 
     ReDim Preserve votes(index) 
     index += 1 
    End Sub 

    Private Function isValidInput(ByRef firstName As String) As Boolean 
     If IsNumeric(txtNewCandidate.Text) Or txtNewCandidate.Text = "" Then 
      MsgBox("Please input a valid candidate name.") 
      txtNewCandidate.Focus() 
      Return False 
     Else 
      Return True 
     End If 
    End Function 

    Private Sub btnTally_Click(sender As Object, e As EventArgs) Handles btnTally.Click 
     lstTallies.Visible = True 
     lblTally.Visible = True 
     For i = 0 To lstCandidates.Items.Count - 1 
      lstTallies.Items.Add(lstCandidates.Items(i).ToString & " - " & votes(i)) 
     Next 
    End Sub 

    Private Sub lstCandidates_DoubleClick(sender As Object, e As EventArgs) Handles lstCandidates.DoubleClick 
     If lstCandidates.SelectedIndex = -1 Then 
      MsgBox("Select a candidate by double-clicking") 
     End If 
     votes(lstCandidates.SelectedIndex) += 1 
     MsgBox("Vote Tallied") 
    End Sub 

    Private Sub pbxWinner_Click(sender As Object, e As EventArgs) Handles pbxWinner.Click 

    End Sub 
End Class 

選民必須雙擊他們在第一個列表框中的候選人的選擇。然後用戶通過點擊按鈕來計票,第二個列表框將出現在每個候選人的投票中。

現在,我需要在圖片框pbxWinner中顯示獲勝者(或贏家,如果有領帶)。我不知道如何做到這一點。任何線索?

這是我正在做的,但下面的代碼不起作用。

Private Function candidateWinner(ByRef winner As String) As Boolean 
    For i As Integer = 0 To lstCandidates.SelectedIndex - 1 
     If votes(i) > maxVotes Then 
      maxVotes += 1 
     End If 
    Next 
    g = pbxWinner.CreateGraphics 
    g.TranslateTransform(10.0F, 0.0F) 
    g.DrawString(winner, New Font("Arial", 7, FontStyle.Regular), Brushes.DarkBlue, New PointF(0, 0)) 
    Return True 
End Function 
+0

一個PictureBox沒有'Text'屬性。使用更合適的標籤,如標籤 – Plutonix

回答

1

您的代碼實際上是工作的罰款初始塗料,但是當圖片框圖像不具有其自己的位圖組,一些事件可以重繪其圖形幕後(甚至簡單到最小化/ mazimizing的形式,以及一大堆其他的),所以實際上你的文本似乎根本不會出現或幾乎立即消失,實際上它很可能被重新繪製。要解決此問題,請使用位圖作爲圖形對象的引用,繪製位圖的圖形,然後將位圖分配給圖片框的圖像屬性。這將使圖像執着......給這個代碼在你candidateWinner功能的嘗試後for循環:

Dim bmp As New Bitmap(pbxWinner.Width, pbxWinner.Height) 
Dim g As Graphics = Graphics.FromImage(bmp) 
g.TranslateTransform(10.0F, 0.0F) 
g.DrawString(winner, New Font("arial", 7, FontStyle.Regular), Brushes.DarkBlue, 0, 0) 
pbxWinner.Image = bmp 

...如果你還沒有看到文本,確保贏家字符串有正確的值集,我測試此代碼並正確顯示我的測試字符串


爲編輯點評:

那是因爲你使用的計算勝利者的邏輯......你只是要檢查查看當前選定的候選人的投票數是否高於最大投票數然後將最大值增加1.如果你想堅持採用這種邏輯來選擇獲勝者,你可能想遍歷所有候選者(不僅僅是從索引0到當前選擇的那些候選者),如果他們投票計數高於最大值,然後將最大EQUAL設置爲其投票計數。然後循環中的下一個候選人將檢查他們的計數與先前的最大值。但是,如果您只是使用字典,追蹤贏家可能會容易得多,因爲您允許添加候選人,並且您必須更改您的「贏家」邏輯,以實際檢查輸入的每個人中擁有最多選票的人。這方面的一個光禿禿的骨頭例子是這樣的:

Dim dctTally As Dictionary(Of String, Integer) 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    dctTally = New Dictionary(Of String, Integer) 
End Sub 

Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click 
    dctTally.Add(txtNewCandidate.Text, 0) 
    lstCandidates.Items.Add(txtNewCandidate.Text) 
End Sub 

Private Sub lstCandidates_DoubleClick(sender As Object, e As EventArgs) Handles lstCandidates.DoubleClick 
    dctTally(lstCandidates.text) += 1 
End Sub 

Private Sub pbxWinner_Click(sender As Object, e As EventArgs) Handles pbxWinner.Click 
    Dim winner = dctTally.Aggregate(Function(l, r) If(l.Value > r.Value, l, r)).Key 
    Dim bmp As New Bitmap(pbxWinner.Width, pbxWinner.Height) 
    Dim g As Graphics = Graphics.FromImage(bmp) 
    g.TranslateTransform(10.0F, 0.0F) 
    g.DrawString(winner, New Font("arial", 7, FontStyle.Regular), Brushes.DarkBlue, 0, 0) 
    pbxWinner.Image = bmp 
End Sub 

這樣一來,該計劃允許儘可能多的名字,你想加入到候選人名單,並會增加一個計票每次他們的名字他們名稱是雙擊的。然後,當您點擊贏家pixturebox時,它會找到具有最高投票數的字典,並在贏家框中顯示他們的名字。

+0

雖然代碼顯示最後點擊的候選人 –

+0

這是代碼獲取函數中的for循環的結果,請參閱上面的編輯 – soohoonigan

+0

Works!謝謝!! –

1

你可以試試這個畫獲獎者:

Private Sub candidateWinner() 

    Dim y As Single = 0 

    maxVotes = votes.Select(Function(x) Convert.ToInt32(x)).Max() 

    For i = 0 To UBound(votes) 
     If votes(i) = maxVotes.ToString() Then 
      g = pbxWinner.CreateGraphics 
      g.TranslateTransform(10.0F, 0.0F) 
      g.DrawString(lstCandidates.Items(i).ToString(), New Font("Arial", 7, FontStyle.Regular), Brushes.DarkBlue, New PointF(0, y)) 
      y += 10 
      g.Dispose() 
     End If 
    Next 

End Sub