- PR -

ComboBox上のSelectedIndex処理について

1
投稿者投稿内容
キノコ
会議室デビュー日: 2003/05/22
投稿数: 4
投稿日時: 2005-08-17 17:50
こんにちは。

コンボでデータを選択した後、ボタンクリックでコンボを空欄にするプログラムです。
※のコマンド行で空欄になるように設定していますが、
ComboBox1.SelectedIndex = 0
と認識され、データの1行目が表示されてしまいます。

※のコマンドを2回書いて実行すれば、正常に動くのですが・・・。
原因がわかりません。どなたかご教授ください。

↓Form1_Load
Connection.ConnectionString = "database=VBHanbai;server=XXX;User ID =XX ;Password =XX "
Connection.Open()
Command = Connection.CreateCommand
Command.CommandText = "SELECT * FROM Syouhin"
Adapter.SelectCommand = Command
Adapter.Fill(Dset, "Syouhin")
Connection.Close()
ComboBox1.DataSource = Dset.Tables("Syouhin")
ComboBox1.DisplayMember = "SyohinName"
ComboBox1.SelectedIndex = -1

↓Button1_Click
ComboBox1.SelectedIndex = -1 ※
さかもと
ぬし
会議室デビュー日: 2004/05/14
投稿数: 586
投稿日時: 2005-08-17 18:08
さかもとと申します。

SQLで取得した結果に対し,1行目に空白行が無いのが原因だと思います。
(Index=-1に値が無いから?)

>※のコマンドを2回書いて実行すれば、正常に動くのですが・・・。
は試してないので分かりませんが,先ずは先頭に空白行を入れてみてはどうでしょうか?

ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2005-08-17 19:56
試してないですが、 ComboBox1.Text = "" じゃ駄目なんでしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-08-18 09:43
DataSource 使ってる場合は、SelectedIndex = -1 はダメだったような気がします。
空白のアイテムを自分で追加しないとダメだったような...?



_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
キノコ
会議室デビュー日: 2003/05/22
投稿数: 4
投稿日時: 2005-08-18 10:28
言い遅れました
Combobox1はドロップダウンリストなので、Text=""は使えなかったのです。

SelectedIndex=-1の動きを調べていると、
一番目の項目が選択されているときはSelectedIndex=−1をちゃんと認識しているのですが、
それ以外の項目が選択されているとSelectedIndex=0と認識しているようです。
動きは分かっているので対処法は分かるのですが、
なぜこのような動きをするのかがわかりません。
壱丸3
常連さん
会議室デビュー日: 2004/09/13
投稿数: 34
投稿日時: 2005-08-18 13:11
興味があったのでCLR Profilerで追いかけてみました。

どうやら、ComboBoxのCurrencyManagerが影響しているようです。
ComboBoxにDataSourceを設定したときの挙動として、
ComboBoxはSelectedIndexプロパティの値が変更されると、
CurrencyManagerのPositionプロパティの値を同値に変更しようとします。
また、CurrencyManagerはPositionプロパティの値が変更されると、
ComboBoxのSelectedIndexプロパティの値を同値に変更しようとします。
よって、基本的にCurrencyManagerのPositionプロパティの値は、
ComboBoxのSelectedIndexと同値になりますが
SelectedIndexが-1のときは、CurrencyManagerのPositionは0になります。
この仕様により、

・ComboBoxのSelectedIndexが1以上のときに、SelectedIndexを-1に設定すると
 →ComboBoxがCurrencyManagerのPositionをSelectedIndexと同値の-1に設定しようとする。
  →CurrencyManagerはPositionを0に補正して設定する。
   →CurrencyManagerはPositionが変更されたのでComboBoxのSelectedIndexを同値に設定する。
    →よって、ComboBoxのSelectedIndexが0に設定される。

・ComboBoxのSelectedIndexが0のときに、SelectedIndexを-1に設定すると、、
 →ComboBoxがCurrencyManagerのPositionをSelectedIndexと同値の-1に設定しようとする。
  →CurrencyManagerはPositionを0に補正して設定する。
   →CurrencyManagerのPositionは変更されていないのでComboBoxのSelectedIndexは設定しない。
    →よって、ComboBoxのSelectedIndexが-1に設定される。

細かい部分の動作は端折っていますが、おそらくこんな感じだと思います。

【追記】
ちょっと、間違えたみたいなので訂正します。
CurrencyManagerのPositionプロパティの値が変更されたときに
ComboBoxのSelectedIndexプロパティの値を同値に変更するのは、
CurrencyManagerではなくComboBox自身のようです。


[ メッセージ編集済み 編集者: 壱丸3 編集日時 2005-08-18 13:59 ]
壱丸3
常連さん
会議室デビュー日: 2004/09/13
投稿数: 34
投稿日時: 2005-08-18 16:11
MSのKBにありました。バグだそうです。

[BUG] SelectedIndex を -1 に設定したときにコンボ ボックスがクリアされない
http://support.microsoft.com/kb/327244
キノコ
会議室デビュー日: 2003/05/22
投稿数: 4
投稿日時: 2005-08-18 19:19
原因を教えていただきありがとうございました。
まさか .netのバグだとは想像もしていませんでしたが
お陰ですっきりしました。
1

スキルアップ/キャリアアップ(JOB@IT)