ここから本文です

Vb.netで質問です

mam********さん

2018/3/2722:53:52

Vb.netで質問です

次のソースコードの処理はForのループ処理でListboxに入れられた複数の値をメッセージボックスに表示させる処理なのですが、下のソースのままですと、複数のメッセージボックスとなってでてきてしまいます。
なので、これを一つのメッセージボックスで一回だけ表示させるという風にしたいのですが、どのように改良したら一つのメッセージボックスで表示させることができるのか 教えてください!

この処理ですとリストボックスに入れた数だけメッセージボックスが出てしまうのでこれを一つにまとめたいです
例を挙げますと

Listbox1にA B BCと入力されていたら
A=1
B=2
C=1
とこのように一つのメッセージボックスで表示させたいです(一度にABBCと打つのではなく、一個ずつテキストボックスから入力してリストにいれます)
<ソース>↓



Public Class Form1
Private list_2 As New List(Of String)


Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress

list_2.Add(TextBox1.Text)
Dim bFind As Boolean = False
For i = 0 To ListBox1.Items.Count - 1
If ListBox1.Items(i) = TextBox1.Text Then
bFind = True
Exit For
End If
Next
If bFind = False Then
ListBox1.Items.Add(TextBox1.Text)
End If
TextBox1.Text = ""
TextBox1.Focus()





End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

Dim list1 As New List(Of Integer)


For i = 0 To ListBox1.Items.Count - 1
list1.Add(0)
Next
For i = 0 To ListBox1.Items.Count - 1
For j = 0 To list_2.Count - 1
If list_2(j) = ListBox1.Items(i) Then
list1(i) += 1
End If

Next
Next

For i = 0 To ListBox1.Items.Count - 1

MsgBox(ListBox1.Items(i) & "=" & list1(i))

Next




End Sub
End Class


説明下手で申し訳ありませんが、宜しくお願いします
説明が不足している点があれば 指摘していただけると助かります

閲覧数:
84
回答数:
5

違反報告

ベストアンサーに選ばれた回答

mom********さん

2018/3/2805:16:38

この質問ってLISTクラスの変数:list_2 をカウントするので間違いないですよね?
ListBox1は『重複登録』を禁止してますし???

Private list_2 As New List(Of String)

Private Sub TextBox1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
    If Not ListBox1.Items.Contains(e.KeyChar) Then ListBox1.Items.Add(e.KeyChar)
    list_2.Add(e.KeyChar)
    TextBox1.Text = ""
    TextBox1.Focus()
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim dic As New SortedDictionary(Of String, Integer)

    list_2.ForEach(Sub(x)
                       If (Not dic.ContainsKey(x)) Then dic.Add(x, 0)
                       dic(x) = dic(x) + 1
                   End Sub)
    Dim st() As String = dic.Select(Function(x) x.Key & "=" & x.Value).ToArray

    MsgBox(String.Join(Environment.NewLine, st))
End Sub

それとも私の理解がおかしいのかな?

  • mom********さん

    2018/3/2811:04:10

    上記がややこしければLISTクラスを2つTextBox1_KeyPressで登録する方法。


    Private list_2 As New List(Of String)
    Private list1 As New List(Of Integer) 'どちらのプロシージャーでも使えるカウント用

    Private Sub TextBox1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
        If Not ListBox1.Items.Contains(e.KeyChar) Then ListBox1.Items.Add(e.KeyChar)
        If Not list_2.Contains(e.KeyChar) Then '重複しないリストを作成
            list_2.Add(e.KeyChar) : list1.Add(1) '押されていないキーなら登録とカウントを1に
        Else
            list1(list_2.IndexOf(e.KeyChar)) += 1 '既に押されていたらIndex番号を取得し+1
        End If
        TextBox1.Text = ""
        TextBox1.Focus()
    End Sub

    ***続く

  • その他の返信(4件)を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2018/3/28 22:31:24

自分の説明足らずの質問に丁寧に答えていた頂き本当にありがとうございます! この処理は重複登録を禁止し作ってます
説明が不足していて申し訳ない、、
他にも色んな回答を頂き大変参考になりましたです!ほんとうにありがとうございました!

ベストアンサー以外の回答

1〜4件/4件中

並び替え:回答日時の
新しい順
|古い順

red********さん

2018/3/2820:17:43

Dictionaryクラスのほうが簡単かも …

Formクラスの変数に

dim dic as new Dictionaly(Of String, Integer)

を追加

TextBoxのKeyPressイベントで
dim ss as string = e.KeyChar.ToString
if dic.ContainsKey(ss) = false then
dic.Add(ss,0)
end if
dic(ss) += 1
TextBox1.Text = ""
ListBox1.Items.Add(ss)

Button1のクリックイベントで

dim sb as new System.Text.StringBuilder
for each kvp as KeyValuePair(Of String, Integer) in dic
sb.AppendLine(String.Format("{0} = {1}",kvp.Key, kvp.Value))
Next
MsgBox( sb.ToString)

といった具合で …

bas********さん

2018/3/2815:43:42

私なら、For文での表示はせずに、

例えば

Dim text As String

かなんかを用意して、

text = text & (追加する文字列) & (改行を示すやつ)

だったかな? ( 頭の中がJavaScriptとごっちゃになっているが。 )

そういう風にして、表示用のものを別に用意してそれに追加。

それを最後に MsgBox関数でしたっけ? それで表示。

みたいな。

kak********さん

2018/3/2801:59:17

'コード例
Dim allText As New System.Text.StringBuilder
For i = 0 To ListBox1.Items.Count - 1
allText.Append(ListBox1.Items(i)).Append("=").AppendLine(list1(i))
'MsgBox(ListBox1.Items(i) & "=" & list1(i))
Next
MsgBox(allText.ToString)

動作は未確認です。

obo********さん

2018/3/2723:12:43

メッセージボックスは、ユーザにメッセージを表示するための簡素なものなので、細かい調整をしたいならば、自分で希望のメッセージを表示させたいフォームを作るしかないと思います。

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる