- PR -

InsertAtでコンボボックスが不正な動作をする

1
投稿者投稿内容
虎猫
常連さん
会議室デビュー日: 2004/05/27
投稿数: 25
投稿日時: 2004-09-15 23:06
教えてください。
現在VB.NETで開発しておりますが、以下の現象で困っております。

コンボボックスに空の値を挿入する為に連結するデータセットにInsertAt
を使用して無理やり空行を挿入してます.
詳細は以下のとおりです。

1.データセットデータ内容
/----------------------------------------------------------------------/
0001,明治
0002,大正
0003,昭和
0004,平成
/----------------------------------------------------------------------/

2.InsertAtコーディング内容

/----------------------------------------------------------------------/
If ds Is Nothing Then
Return
End If
'読み込んだデータセットの一行目に空白を挿入する
Dim row As DataRow = ds3.Tables(0).NewRow()
row.Item(0) = ""
row.Item(1) = ""
ds.Tables(0).Rows.InsertAt(row, 0)

Me.Combo.ValueMember = ds.Tables(0).Columns(0).ColumnName
Me.Combo.DisplayMember = ds.Tables(0).Columns(1).ColumnName
Me.Combo.DataSource = ds.Tables(0)
/----------------------------------------------------------------------/

これでデータセットデータは以下の様になっているはずです.
/----------------------------------------------------------------------/
"" ,""
0001,明治
0002,大正
0003,昭和
0004,平成
/----------------------------------------------------------------------/

3.コンボデータの選択

/----------------------------------------------------------------------/
Me.Combo.SelectedValue = "0001"
/----------------------------------------------------------------------/

というコーディングをしているのですが、「3」の所でエラーが発生してしまいます。
「指定された引数は、有効な値の範囲内にありません。
 パラメータ名:'-2147483648'は'index'に有効な値ではありません。」
とエラーが表示されます。
ちなみに"0002"〜"0004"は正常にセットされます。
試しにありえない"9999"や"0005"も試してみましたが、これは一番初めのレコード
が選択される仕様なのか、正しく?空白レコードが選択されます。
ちなみにコード上からセットするのではなく、画面上でコンボを選択した場合は正しく
"0001"が選択できます。

InsertAtの使用方法が悪いのでしょうか?
教えてください。

※ちなみに今は代替策として、データセットを作るSQLでUNIONで無理やり空白レコード
 を先頭につけて対応してます。
 この方法であると問題なく動きます。
えんぞ@?
ぬし
会議室デビュー日: 2004/07/06
投稿数: 271
お住まい・勤務地: はまっこ
投稿日時: 2004-09-16 09:37
引用:

虎猫さんの書き込み (2004-09-15 23:06) より:

'読み込んだデータセットの一行目に空白を挿入する
Dim row As DataRow = ds3.Tables(0).NewRow()


ds3のデータセットが不明ですが
Dim row As DataRow = ds.Tables(0).NewRow()
では?
nanbu
大ベテラン
会議室デビュー日: 2004/08/19
投稿数: 178
投稿日時: 2004-09-16 12:00
引用:

虎猫さんの書き込み (2004-09-15 23:06) より:
※ちなみに今は代替策として、データセットを作るSQLでUNIONで無理やり空白レコード
 を先頭につけて対応してます。
 この方法であると問題なく動きます。




確かに、InsertAt後だとComboBox.SelectedValueからSelectedIndexに
渡されるindexがおかしい(ComboBoxのIndexとしては)ようです。
上記の回避策が有効ですが、

  DataTable.Copy()

で複製したものをデータソースに指定してもOKでした。


 





えんぞ@?
ぬし
会議室デビュー日: 2004/07/06
投稿数: 271
お住まい・勤務地: はまっこ
投稿日時: 2004-09-16 14:32
引用:

虎猫さんの書き込み (2004-09-15 23:06) より:

「指定された引数は、有効な値の範囲内にありません。
 パラメータ名:'-2147483648'は'index'に有効な値ではありません。」


解決方法うんぬんではないですが...
< OK >
 SelectedIndex = 1
 SelectedText = "明治"
< NG >
 SelectedValue = "0001"
< Set方法不明 >
 SelectedItem = 'DataRowView!?
となったので、

オブジェクトブラウザで確認すると
 SelectedIndex ・・・ListControlのSelectedIndexをOverride
 SelectedItem ・・・ComboBox Property
 SelectedText ・・・ComboBox Property
 SelectedValue ・・・ListControl から継承

SelectedValueのみListControl から継承されている。
↑単にこれが気になっただけでした
# 自己満足...(汗
虎猫
常連さん
会議室デビュー日: 2004/05/27
投稿数: 25
投稿日時: 2004-09-17 02:06
えんぞ@見習様
nanbu様

返信ありがとうございます。
この現象ってMSのバグだったりするのでしょうか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-09-17 22:45
 バグかと疑う前に、できることはいろいろ試しましょう。

 たとえば、空文字列ではなく、"0000"を入れてみるとか。AcceptChangesを発行して、RowStateを変更しておくとか。
虎猫
常連さん
会議室デビュー日: 2004/05/27
投稿数: 25
投稿日時: 2004-09-20 14:45
Jitta様

ありがとうございます。
そうですね。バグバグいうのはナンセンスですね。
ありがとうございました。
1

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