C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

textboxで文字を入れ、ComboBoxがおかしくなる /aa (19/03/15(Fri) 23:13) #90513
Re[1]: textboxで文字を入れ、ComboBoxがおかしくなる /Azulean (19/03/18(Mon) 06:06) #90522
Re[1]: textboxで文字を入れ、ComboBoxがおかしくなる /魔界の仮面弁士 (19/03/18(Mon) 09:50) #90523
  └ Re[2]: textboxで文字を入れ、ComboBoxがおかしくなる /aa (19/03/18(Mon) 12:49) #90527
    ├ Re[3]: textboxで文字を入れ、ComboBoxがおかしくなる /aa (19/03/19(Tue) 13:34) #90539
    └ Re[3]: textboxで文字を入れ、ComboBoxがおかしくなる /魔界の仮面弁士 (19/03/19(Tue) 14:08) #90540
      └ Re[4]: textboxで文字を入れ、ComboBoxがおかしくなる /aa (19/03/19(Tue) 14:50) #90541 解決済み


親記事 / ▼[ 90522 ] ▼[ 90523 ]
■90513 / 親階層)  textboxで文字を入れ、ComboBoxがおかしくなる
□投稿者/ aa (3回)-(2019/03/15(Fri) 23:13:16)

分類:[.NET 全般] 

2019/03/18(Mon) 00:05:52 編集(投稿者)
2019/03/16(Sat) 12:42:58 編集(投稿者)

<pre><pre>ご質問させていただきます。

ComboBox1.SelectedIndexとtextboxに文字をいれるとコンボボックスのアイテムがその文字(アイテム)が出るようにしています。

分からない事、やりたい事

テキストボックスに文字を(い)入れるとコンボボックスのアイテムは
いだけに表示され、何故か画像a00に表示されます。
い1選択されているはずなのに画像がa00となってます。

すいません、初心者ですか。
うまくいきませんでした。
教えてください。お願いします。

ソースコードVBです。
=========================================================
'Form1

Imports System.IO
Imports System
Imports System.Globalization
Imports System.Threading

Public Class Form1

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
If ListBox1.SelectedIndex = 0 Then
'新しいフォームです。
_07_shouhin.Show()
Me.Hide()
End If
End Class

===========================================
'新しいフォーム
Imports System.ComponentModel
Imports System.Globalization
Public Class _07_shouhin

Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged

TextBox1.Text = ComboBox1.SelectedValue.ToString

End Sub


Private Sub TextBox2_TextChanged(sender As Object, e As EventArgs) Handles TextBox2.TextChanged
Dim cca = New CultureInfo("ja-jp").CompareInfo
Dim opt As CompareOptions
opt = opt Or CompareOptions.IgnoreWidth '全角と半角を区別しない
opt = opt Or CompareOptions.IgnoreKanaType 'ひらがなとカタカナを区別しない
opt = opt Or CompareOptions.IgnoreCase '大文字と小文字を区別しない
opt = opt Or CompareOptions.IgnoreNonSpace '文字列比較で分音文字などの結合の分音文字を無視することを示します。
opt = opt Or CompareOptions.IgnoreSymbols '文字列の比較が空白文字が区切り記号、通貨記号、パーセント記号、数学記号、アンパサンド、やなどの記号を無視することを示します。

Dim txt As String = TextBox2.Text

ComboBox1.DataSource = list.Where(
Function(s)
Return 0 = cca.Compare(Strings.Left(s.Key, txt.Length), txt, opt)
End Function).ToArray()

End Sub

Private Sub _07_shouhin_Load(sender As Object, e As EventArgs) Handles MyBase.Load

TextBox1.Enabled = False
'アイテムはあ1x3とい1x3
list.Add("あ1",0)
list.Add("あ1",0)
list.Add("あ2",0)
list.Add("あ3",0)
list.Add("い1",0)
list.Add("い2",0)
list.Add("い3",0)
ComboBox1.DisplayMember = "key"
ComboBox1.ValueMember = "value"
ComboBox1.DataSource = New BindingSource(list, Nothing)

ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
end sub

'画像とselectindex

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'あ1、画像A00.jpgです。
If ComboBox1.SelectedIndex = 0 Then
PictureBox1.Image = My.Resources.A00
End If
'あ2、画像A01.jpgです。
If ComboBox1.SelectedIndex = 1 Then
PictureBox1.Image = My.Resources.A01
End If
'あ3、画像A02.jpgです。
If ComboBox1.SelectedIndex = 2 Then
PictureBox1.Image = My.Resources.A02
End If
'い1、画像A03.jpgです。
If ComboBox1.SelectedIndex = 3 Then
PictureBox1.Image = My.Resources.A03
End If
'い2、画像A04.jpgです。
If ComboBox1.SelectedIndex = 4 Then
PictureBox1.Image = My.Resources.A04
End If
'い3、画像A05.jpgです。
If ComboBox1.SelectedIndex = 5 Then
PictureBox1.Image = My.Resources.A05
End If
end sub
================================================

A00.jpg 〜A05.jpgはPictureboxのプロパティimageにいれました。
お助けお願いします。
Vistua lbasic
Frameworck4.7.2
OS windows10
Vistualstudio2019です。</pre></pre>
[ □ Tree ] 返信 編集キー/

▲[ 90513 ] / 返信無し
■90522 / 1階層)  Re[1]: textboxで文字を入れ、ComboBoxがおかしくなる
□投稿者/ Azulean (1048回)-(2019/03/18(Mon) 06:06:48)
No90513 (aa さん) に返信
> ComboBox1.DataSource = list.Where(
> Function(s)
> Return 0 = cca.Compare(Strings.Left(s.Key, txt.Length), txt, opt)
> End Function).ToArray()

ComboBox.SelectedIndex は「ComboBox の中でのインデックス」になります。
また、TextChanged イベントハンドラの中で ComboBox.DataSource、つまり、ComboBox の中身を書き換えています。
このため、「ComboBox の中でのインデックス」と「list のインデックス」は異なりますので、「list のインデックスと一致する前提で SelectedIndex で処理を決めている部分」(Button1_Click)が間違いとなります。

この先考えられる方法は少なくとも 2 つ。

1. ComboBox にセットするクラス (?) に元のインデックスも持たせる。そして、ComboBox.SelectedValue をキャストして元のインデックスを取り出す。
2. ComboBox.SelectedValue で選択されているものを取得し、list の IndexOf を使って list 内を検索して元のインデックスを求める。
[ 親 90513 / □ Tree ] 返信 編集キー/

▲[ 90513 ] / ▼[ 90527 ]
■90523 / 1階層)  Re[1]: textboxで文字を入れ、ComboBoxがおかしくなる
□投稿者/ 魔界の仮面弁士 (2114回)-(2019/03/18(Mon) 09:50:48)
No90513 (aa さん) に返信
> 'アイテムはあ1x3とい1x3
> list.Add("あ1",0)
> list.Add("あ1",0)
> list.Add("あ2",0)

この list という変数のデータ型は何ですか?
key や value と書いていることから、
 Private list As New Dictionary(Of String, Integer)()
かと想像したのですが、それだと "あ1" が重複エラーになってしまいます。


たとえば list を Dictionary(Of String, Image) にしても良いなら、
もう少し簡単に書けるかもしれません。


Private list As New Dictionary(Of String, Image)()
Private Sub _07_shouhin_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  TextBox1.Enabled = False
  list.Add("あ1", My.Resources.A00)
  list.Add("あ2", My.Resources.A01)
  list.Add("あ3", My.Resources.A02)
  list.Add("い1", My.Resources.A03)
  list.Add("い2", My.Resources.A04)
  list.Add("い3", My.Resources.A05)
  ComboBox1.DisplayMember = "Key"
  ComboBox1.ValueMember = "Value"
  ComboBox1.DataSource = New BindingSource(list, Nothing)
End Sub
Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
  TextBox1.Text = ComboBox1.GetItemText(ComboBox1.SelectedItem)
  'PictureBox1.Image = TryCast(ComboBox1.SelectedValue, Image)
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  PictureBox1.Image = TryCast(ComboBox1.SelectedValue, Image)
End Sub



> '新しいフォームです。
> _07_shouhin.Show()
> Me.Hide()

Hide された [Form1] フォームは、その後どこかで Close もしくは再表示されるようになっていますか?
現状のコードだと、[_07_shouhin] フォームが閉じられた後、非表示の Form1 が
メモリ上に残ったままとなり、アプリケーションが終了しないことになってしまいますよ。

End Sub やら End Class やらが抜けているので、実際には省略された部分に、
そうした後始末のコードが書かれているのかもしれませんが…。



> If ComboBox1.SelectedIndex = 1 Then
>  PictureBox1.Image = My.Resources.A01
> End If
My.Resources から取得した画像は、取得するたびに新しいインスタンスが生成される仕様なので、
このような使い方をすると、呼び出すたびにメモリ消費量が増加していきますのでご注意ください。

消費量を抑えるには、コレクション等に蓄えておいて、それを使いまわすようにするか(上記サンプルのように)、
あるいは画像を使い終わるたびに Dispose で破棄するなどの手段があります。

といっても、増えすぎればガベージコレクトによって自動回収されるはずですので、
この程度なら極端にメモリを圧迫することは無いでしょうけれど。
[ 親 90513 / □ Tree ] 返信 編集キー/

▲[ 90523 ] / ▼[ 90539 ] ▼[ 90540 ]
■90527 / 2階層)  Re[2]: textboxで文字を入れ、ComboBoxがおかしくなる
□投稿者/ aa (4回)-(2019/03/18(Mon) 12:49:03)
2019/03/18(Mon) 19:48:23 編集(投稿者)
2019/03/18(Mon) 19:25:37 編集(投稿者)

>>'アイテムはあ1x3とい1x3
>>list.Add("あ1",0)
>>list.Add("あ1",0)
>>list.Add("あ2",0)

データ型はPrivate list As New Dictionary(Of String, Integer)()
です
0は値段表示されたいためこのように作りました。
字誤りあってすいませんでした。

list.add("あ1",0)
list.add("あ2",0)

Private list As New Dictionary(Of String, Image)()
> Private Sub _07_shouhin_Load(sender As Object, e As EventArgs) Handles MyBase.Load
>   TextBox1.Enabled = False
>   list.Add("あ1", My.Resources.A00)
>   list.Add("あ2", My.Resources.A01)
>   list.Add("あ3", My.Resources.A02)
>   list.Add("い1", My.Resources.A03)
>   list.Add("い2", My.Resources.A04)
>   list.Add("い3", My.Resources.A05)
>   ComboBox1.DisplayMember = "Key"
>   ComboBox1.ValueMember = "Value"
>   ComboBox1.DataSource = New BindingSource(list, Nothing)
> End Sub
> Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
>   TextBox1.Text = ComboBox1.GetItemText(ComboBox1.SelectedItem)
>   'PictureBox1.Image = TryCast(ComboBox1.SelectedValue, Image)
> End Sub
> Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
>   PictureBox1.Image = TryCast(ComboBox1.SelectedValue, Image)
> End Sub
>

サンプル参考します。
お二人のかたありがとうございます。

指示通りにやった所、画像は出来ました。

後もう一つは
list.add("あ1",'0,My.Resources.A00)
'省略

にした場合、元 list.add("あ1",0)の0も追加したいんです。
その場合は
Private list As New Dictionary(Of String, Integer)
Dim ?? As New Dictionary(Of String, Image)
とやってもエラーになってしまいました。

コンボボックスのアイテムが「あ1」
textbox「数字」
Pictureboxで文字入力後そのindexからの画像表示

この3つが出来るように数時間調べても見つからず・・・・
初心者なので頑張って覚えようと努力しています。

誤字もあって申し訳ございません。

サンプル直しておきます。
_07_shouhin
コンボボックスのアイテムがあ1、あ2、あ3、い1、い2、い3
Private list As New Dictionary(Of String, Integer)
_07_shouhin_Load

list.add("あ1",0)
list.add("あ2",0)
list.add("あ3",0)
list.add("い1",0)
list.add("い2",0)
list.add("い3",0)
ComboBox1.DisplayMember = "Key"
  ComboBox1.ValueMember = "Value"
  ComboBox1.DataSource = New BindingSource(list, Nothing)
End Sub

Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
TextBox1.Text = ComboBox1.SelectedValue.ToString
end sub
Private Sub TextBox2_TextChanged(sender As Object, e As EventArgs) Handles TextBox2.TextChanged
Dim cca = New CultureInfo("ja-jp").CompareInfo
Dim opt As CompareOptions
opt = opt Or CompareOptions.IgnoreWidth '全角と半角を区別しない
opt = opt Or CompareOptions.IgnoreKanaType 'ひらがなとカタカナを区別しない
opt = opt Or CompareOptions.IgnoreCase '大文字と小文字を区別しない
opt = opt Or CompareOptions.IgnoreNonSpace '文字列比較で分音文字などの結合の分音文字を無視することを示します。
opt = opt Or CompareOptions.IgnoreSymbols '文字列の比較が空白文字が区切り記号、通貨記号、パーセント記号、数学記号、アンパサンド、やなどの記号を無視することを示します。

Dim txt As String = TextBox2.Text

ComboBox1.DataSource = New BindingSource(list.Where(
Function(s)
Return 0 _
= cca.Compare(Strings.Left(s.Key, txt.Length), txt, opt)
End Function).ToArray(), Nothing)

End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click, Button2.Click
me.hide
Form1.Show()
End Sub



お願いします。
[ 親 90513 / □ Tree ] 返信 編集キー/

▲[ 90527 ] / 返信無し
■90539 / 3階層)  Re[3]: textboxで文字を入れ、ComboBoxがおかしくなる
□投稿者/ aa (5回)-(2019/03/19(Tue) 13:34:31)
後もう一つ聞きたい事があります。

 Private list As New Dictionary(Of String, Image)

    Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        TextBox1.Enabled = False
        list.Add("あ1", My.Resources.A00)
        list.Add("あ2", My.Resources.A01)
        list.Add("あ3", My.Resources.A02)
        list.Add("い1", My.Resources.A03)
        list.Add("い2", My.Resources.A04)
        list.Add("い3", My.Resources.A05)
        ComboBox1.DisplayMember = "Key"
        ComboBox1.ValueMember = "Value"
        ComboBox1.DataSource = New BindingSource(list, Nothing)
    End Sub
    Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
        TextBox1.Text = ComboBox1.GetItemText(ComboBox1.SelectedItem)

        PictureBox1.Image = TryCast(ComboBox1.SelectedValue, Image)
    End Sub
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        PictureBox1.Image = TryCast(ComboBox1.SelectedValue, Image)
    End Sub

教えて頂いた通り出来ました。
これをもう一個追加したい場合

Private list As New Dictionary(Of String, Image)の部分でIntegerを追加してもエラーになり、どのようにしたら出来ますか?

例

追加前
list.Add("あ1", My.Resources.A00)
追加後
list.Add("あ1", My.Resources.A00,0)
このように作りたいんです。

よろしくお願いします。



[ 親 90513 / □ Tree ] 返信 編集キー/

▲[ 90527 ] / ▼[ 90541 ]
■90540 / 3階層)  Re[3]: textboxで文字を入れ、ComboBoxがおかしくなる
□投稿者/ 魔界の仮面弁士 (2117回)-(2019/03/19(Tue) 14:08:32)
No90527 (aa さん) に返信
> にした場合、元 list.add("あ1",0)の0も追加したいんです。

あ1〜い3 まで、すべて「0」が設定されていたようですが、それで構わないのですね?


'=== 案1 ===
Private list As New Dictionary(Of String, (Number As Integer, Picture As Image))()
Private Sub _07_shouhin_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  TextBox1.Enabled = False
  list.Add("あ1", (0, My.Resources.A00))
  list.Add("あ2", (0, My.Resources.A01))
  list.Add("あ3", (0, My.Resources.A02))
  list.Add("い1", (0, My.Resources.A03))
  list.Add("い2", (0, My.Resources.A04))
  list.Add("い3", (0, My.Resources.A05))
  ComboBox1.DisplayMember = "Key"
  ComboBox1.ValueMember = "Value"
  ComboBox1.DataSource = New BindingSource(list, Nothing)
End Sub
Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
  TextBox1.Text = ComboBox1.GetItemText(ComboBox1.SelectedItem)
  'Dim selectedValue = DirectCast(ComboBox1.SelectedValue, (Number As Integer, Picture As Image))
  'Label1.Text = CStr(selectedValue.Number)
  'PictureBox2.Image = selectedValue.Picture
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  PictureBox1.Image = DirectCast(ComboBox1.SelectedValue, (Number As Integer, Picture As Image)).Picture
End Sub



'=== 案2 ===
Private list As Dictionary(Of String, Integer)
Private images As Dictionary(Of String, Image)

Private Sub _07_shouhin_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  TextBox1.Enabled = False
  list = New Dictionary(Of String, Integer)() From {
    {"あ1", 0}, {"あ2", 0}, {"あ3", 0},
    {"い1", 0}, {"い2", 0}, {"い3", 0}
  }
  images = New Dictionary(Of String, Image)() From {
    {"あ1", My.Resources.A00},
    {"あ2", My.Resources.A01},
    {"あ3", My.Resources.A02},
    {"い1", My.Resources.A03},
    {"い2", My.Resources.A04},
    {"い3", My.Resources.A05}
  }
  ComboBox1.DisplayMember = "Key"
  ComboBox1.ValueMember = "Value"
  ComboBox1.DataSource = New BindingSource(list, Nothing)
End Sub
Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
  Dim selectedKey As String = ComboBox1.GetItemText(ComboBox1.SelectedItem)
  'Dim selectedNumber As Integer = CInt(ComboBox1.SelectedValue)
  'Dim selectedImage As Image = images(selectedKey)
  TextBox1.Text = selectedKey
  'Label1.Text = CStr(selectedNumber)
  'PictureBox2.Image = selectedImage
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  images.TryGetValue(ComboBox1.GetItemText(ComboBox1.SelectedItem), PictureBox1.Image)
End Sub
[ 親 90513 / □ Tree ] 返信 編集キー/

▲[ 90540 ] / 返信無し
■90541 / 4階層)  Re[4]: textboxで文字を入れ、ComboBoxがおかしくなる
□投稿者/ aa (6回)-(2019/03/19(Tue) 14:50:14)
魔界の仮面弁士さん
ありがとうございます。
> '=== 案1 ===

お騒がせしました、ありがとうございました。
解決済み
[ 親 90513 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -