- PR -

ComboboxにおけるSelectedValue指定でのデータ選択について

投稿者投稿内容
ほぬ
会議室デビュー日: 2004/02/19
投稿数: 7
投稿日時: 2005-07-13 14:51
VS.Net2003のVB.Netでwinアプリを開発しています。

Datasetには2つフィールドがあり、
[コード]と[名前]が格納されているとします。

で、ComboboxのDataSourceにDatasetをセットし、
CombobxのValueMemberに[コード]を、DisplayMemberに[名前]を指定します。

その後に
Combobox.SelectedValue = (何らかの値)
として項目を選択しようとしているのですが、うまくいきません。
現象としましては、この(何らかの値)が数値の1の場合のみ、エラーとなり
-------------------------------------------------------------------
指定された引数は、有効な範囲内にありません。
パラメータ名:"-21474863648"は"Index"に有効な値ではありません。
-------------------------------------------------------------------
となってしまいます。
たとえば、この(何らかの値)が100など、他の値の場合はちゃんと
指定した項目が選択されます。

もちろん、(何らかの値) = 1 というデータは含まれていますし、値は一意です。

何かヒントになるような事がありましたら、御指摘いただけますでしょうか。

過去の発言等を参考にはさせていただきましたが、なかなか思うような
ものが見つからなかったので投稿させていただきました。

宜しくお願い致します。
ほぬ
会議室デビュー日: 2004/02/19
投稿数: 7
投稿日時: 2005-07-15 14:04
自己レスです。

SelectedValue指定で項目選択という考え方が間違っているのでしょうか・・・?

しかし、SelectedValueプロパティの解説に、
「ValueMemberプロパティで指定したメンバプロパティの値を取得または設定します。」
とあるので、可能かと思ったのですが・・・。

どなたか、何かヒントでもいただけないでしょうか?

宜しくお願い致します。
こ〜らい
会議室デビュー日: 2005/07/15
投稿数: 1
投稿日時: 2005-07-15 18:45
はじめまして。

自分が作成してる.Netアプリでも、ComboBoxの表示は結構はまり
やすいので、ちょっと気になって書き込んでみました。

SelectedValueで値を選択すること自体は間違っていないはずです。
自分も、DataSourceプロパティにDataViewを、SelectedValue
プロパティに別のDataSetをバインドして、値を表示するような
作りをしてます。

同じエラーを自分のアプリでも見たような記憶があるんですが、
思い出せないので核心的なことは言えませんが・・・
とりあえず、DataSourceChangedイベント時に想定した通りの
DataSetとDisplayMember、ValueMemberが入っているのか
確認してみてはいかがでしょうか。


[ メッセージ編集済み 編集者: こ〜らい 編集日時 2005-07-15 18:49 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-07-16 05:16
 「自己レス」って言葉は、自分に対するレスポンス、返答なので、自分で解決できたのかなぁ、、、なんて思わせます。補足とか、追加とか、ですね。


 それで、-21474863648という値が何なのか、不思議に思いませんでした?これ、int 型の最小値なんですね。つまり、検索した結果見つからなかった、ということが考えられます。
 SelectedValue は、Object 型なのですが、テーブル上に定義されている型と、指定している型が一致しているでしょうか。もちろん、データベースから取り出すときも、型が一致している、または変換可能であることが必要です。
 1 だけ選択できないのか、たまたま 1 だけが正常な動作をしているのか、その辺がアヤシいように思います。


 あと、掲示板なんて所詮、知っているとか、興味を持ってくれた人だけが答えてくれるところです。本当に困っているなら、サポートセンターに連絡しましょう。プロフェッショナルサポートになるので1件2万8千円ですか。高いけど、あなたが仕事として1時間調べ物をすると、4〜5千円かかっているはずです。48時間くらい経っていますから、結局サポートに連絡した方が安かったことになりませんか?
# 趣味による開発なら高いけど
# サポセンも MSDN に書いてあること止まりなんだよなぁ
# これがまた、微妙なところなんだなぁ...
_________________
ほぬ
会議室デビュー日: 2004/02/19
投稿数: 7
投稿日時: 2005-07-19 13:11
こ〜らいさん、Jittaさん、レスありがとうございます!
そして返事がおくれてしまいまして誠に申し訳ございません。

引用:

Jittaさんの書き込み (2005-07-16 05:16) より:
 「自己レス」って言葉は、自分に対するレスポンス、返答なので、自分で解決できたのかなぁ、、、なんて思わせます。補足とか、追加とか、ですね。



まぎらわしい表題で失礼致しました。
今後気をつけます。

引用:

 それで、-21474863648という値が何なのか、不思議に思いませんでした?これ、int 型の最小値なんですね。つまり、検索した結果見つからなかった、ということが考えられます。



この数値は不思議に思いました。そこでこのSelectedValueに代入しようとしている値のデータ型がきちんとあっているかどうかも調べてみました。
DB上の型も数値型(smallint)で、VB上での扱いもInteger型となっており、問題ないと思っていました。
当初、代入した値が 1 の場合のみうまくいっていなかったので、かなり悩みました。
ただ、もしかしたらVBが .Net になり従来(VB6以前)のInteger型と現在のInteger型との違いが影響しているものかとも考えたりし、MSDNで調べてみたりもしましたが、結果、わからずじまいでした。
ですのでどなたか同様の現象で悩んでおられる(おられた)方がいらっしゃれば、意見を拝見してみたいな、と思い投稿しました。

引用:

 ・・・48時間くらい経っていますから、結局サポートに連絡した方が安かったことになりませんか?



もちろん、この件に関して時間をかけ過ぎても前にはなかなか進めないので、回避方法(SlectedValueからSelectedIndexを取得し、SelectedIndexで指定)を試したらとりあえずその方法で回避できたので、他のコーディングに時間を費やしていました。
この投稿に関して何か投稿があれば、参考にしようとは思っていましたが。
回避方法がなければ有償のサポートも検討するのですが・・・実際のところ、有償のサポートを利用する決断はなかなか難しいです。
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2005-07-19 18:31
こんにちわ。

引用:

ほぬさんの書き込み (2005-07-19 13:11) より:

この数値は不思議に思いました。そこでこのSelectedValueに代入しようとしている値のデータ型がきちんとあっているかどうかも調べてみました。
DB上の型も数値型(smallint)で、VB上での扱いもInteger型となっており、問題ないと思っていました。



ちょっと気になったので、似たような簡単なWinアプリを作って試してみたのですが、こちらではSelectedValueにInteger型の1を指定しても普通に動きました。なのでほぬさんの環境でなぜ動かないかはわからないんですが、一つだけ気づいたことを。

DB上の型をsmallintにしてるということですが、DBMSはなんでしょうか?私の試したのはOracleですが、smallintの列をOracleDataAdapterのFillでDataTableに取り込んで、
DataTable1.Columns(0).DataType.ToStringを表示させるとSystem.Decimalになります。DB上で整数型だからといって必ずしもIntegerになるとは限りませんです。
ほぬ
会議室デビュー日: 2004/02/19
投稿数: 7
投稿日時: 2005-07-19 20:36
ぼのぼのさん、ありがとうございます。

SQLServer2000を使用しています。

(1)------------------------------------------------------------
DBでsmallintの列をSqlDataAdapterのFillでDataTableに取り込んで、
DataTable1.Columns(0).DataType.ToStringを表示させるとSystem.Int16になります。
このcolumnをCombobox1にbindすると、SelectedValueはshortになってしまいます。

ここでIntegerの1をCombobox1のSelectedValueに代入すると既述のエラーとなっていまいます。
------------------------------------------------------------(1)

(2)------------------------------------------------------------
DBでintの列をSqlDataAdapterのFillでDataTableに取り込んで、
DataTable1.Columns(0).DataType.ToStringを表示させるとSystem.Int32になります。
このcolumnをCombobox1にbindすると、SelectedValueはIntegerです。

ここでIntegerの1をCombobox1のSelectedValueに代入すると前述のエラーにはならずにちゃんと項目を指定できます。
------------------------------------------------------------(2)

(2)の場合、型がちゃんと一致しているので正常に項目を指定できていると思うので、
(1)でCShortしてSelectedValueに代入しても、「-21474863648はIndexに有効な範囲ではありません」となってしまうのです。


何かもっと根本的なミスを犯してしまっているのでしょうか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-07-19 21:29
SelectedValue.GetType().ToString() は、何になります?
_________________

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