2016-09-15 7 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 

投票者は、最初のリストボックスで候補者の選択肢をダブルクリックする必要があります。ユーザは、ボタンをクリックすることによって投票を集計し、第2のリストボックスが候補ごとの投票と共に表示される。

今私は(ネクタイがある場合、または受賞者)ピクチャボックス、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

AのPictureBoxは 'Text'プロパティがありません。ラベルのように適切なものを使用する – Plutonix

答えて

1

あなたのコードは、実際に最初の塗料に正常に動作しているが、ピクチャボックスの画像は、独自のビットマップが設定されていない場合は、イベントの数が最小限に抑えとしても、同じくらい簡単(舞台裏でそのグラフィックスを再描画することができます/ mazimizingフォーム、および他のものの全体の束)、実際にあなたのテキストは決して現実にはそれが再描画されている可能性が高いときに、ほとんど瞬時に表示されないか消えているようです。これを修正するには、グラフィックスオブジェクトの参照用のビットマップを使用し、ビットマップのグラフィックをペイントしてから、ビットマップをピクチャボックスのimageプロパティに割り当てます。それでもテキストが表示されない場合、勝者の文字列が正しいがあることを確認してください...

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 

を:これは、forループの後に、このコードをあなたのcandidateWinner機能で試してみる...画像を永続的になります値セット、私はこのコードをテストし、それがコメントのために正しく


編集私のテスト文字列を示した。なぜなら、あなたが勝者を計算するために使用しているロジックの...あなただけにチェックされています

現在選択されている候補者の投票数がmaxVotesより高いかどうかを確認する勝者を選ぶためにそのような種類のロジックに固執したい場合は、すべての候補(インデックス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 
関連する問題