- PR -

コンボボックスSelectedValueのバグでしょうか?

投稿者投稿内容
未記入
大ベテラン
会議室デビュー日: 2006/05/19
投稿数: 125
投稿日時: 2006-07-04 14:36
1、フォームにテキストボックスとコンボボックスを配置します。
2、テキストボックスのValidatingイベントで、
テキストボックスに入力された値に該当するValueMemberをコンボボックスで選択します。
バグ、
テキストボックスに「1」を入力しValidatingイベントでコンボボックスに「○1」が表示される
テキストボックスに「2」を入力しValidatingイベントでコンボボックスに「○2」が表示される
テキストボックスに「4」を入力しValidatingイベントでコンボボックスに「○1」が表示される <--バグ!?

テキストボックスに「1」を入力しValidatingイベントでコンボボックスに「○1」が表示される
テキストボックスに「4」を入力しValidatingイベントでコンボボックスに「」が表示される

回避方法がありましたらご教授お願いいたします。
*現在はコンボボックスデータソースをループして該当する値(テキストボックス入力値)があるか検査しております。

よろしくお願いいたします。

-----以下コードです。-----

コンボボックスのリストアイテムクラスです
Public Class ListItem

Protected _ValueMember As Object
Protected _DisplayMember As String

Public ReadOnly Property ValueMember() As Object
Get
Return Me._ValueMember
End Get
End Property

Public ReadOnly Property DisplayMember() As String
Get
Return Me._DisplayMember
End Get
End Property

Public Sub New(ByVal valueMember As Object, ByVal displayMember As String)
Me._ValueMember = valueMember
Me._DisplayMember = displayMember
End Sub

End Class

フォームのコードです。
Public Class Form1
Inherits System.Windows.Forms.Form

#Region " Windows フォーム デザイナで生成されたコード "

Public Sub New()
MyBase.New()

' この呼び出しは Windows フォーム デザイナで必要です。
InitializeComponent()

' InitializeComponent() 呼び出しの後に初期化を追加します。
Call Initialize()
End Sub

' Form は、コンポーネント一覧に後処理を実行するために dispose をオーバーライドします。
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

' Windows フォーム デザイナで必要です。
Private components As System.ComponentModel.IContainer

' メモ : 以下のプロシージャは、Windows フォーム デザイナで必要です。
'Windows フォーム デザイナを使って変更してください。
' コード エディタを使って変更しないでください。
Friend WithEvents ComboBox1 As System.Windows.Forms.ComboBox
Friend WithEvents TextBox1 As System.Windows.Forms.TextBox
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.ComboBox1 = New System.Windows.Forms.ComboBox
Me.TextBox1 = New System.Windows.Forms.TextBox
Me.SuspendLayout()
'
'ComboBox1
'
Me.ComboBox1.Location = New System.Drawing.Point(48, 32)
Me.ComboBox1.Name = "ComboBox1"
Me.ComboBox1.Size = New System.Drawing.Size(168, 20)
Me.ComboBox1.TabIndex = 0
Me.ComboBox1.Text = "ComboBox1"
'
'TextBox1
'
Me.TextBox1.Location = New System.Drawing.Point(16, 32)
Me.TextBox1.Name = "TextBox1"
Me.TextBox1.Size = New System.Drawing.Size(32, 19)
Me.TextBox1.TabIndex = 1
Me.TextBox1.Text = "TextBox1"
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 12)
Me.ClientSize = New System.Drawing.Size(292, 266)
Me.Controls.Add(Me.TextBox1)
Me.Controls.Add(Me.ComboBox1)
Me.Name = "Form1"
Me.Text = "Form1"
Me.ResumeLayout(False)

End Sub

#End Region

Private Sub Initialize()
Dim ary As ArrayList

コンボ データ設定
ary = New ArrayList
ary.Add(New CommonACK.ListItem("1", "○1"))
ary.Add(New CommonACK.ListItem("2", "○2"))
ary.Add(New CommonACK.ListItem("3", "○3"))
With Me.ComboBox1
.DropDownStyle = ComboBoxStyle.DropDownList
.DataSource = ary.Clone
.DisplayMember = "DisplayMember"
.ValueMember = "ValueMember"
End With
End Sub


Private Sub TextBox1_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating
ComboBox1.SelectedValue = TextBox1.Text
End Sub
End Class
未記入
大ベテラン
会議室デビュー日: 2006/05/19
投稿数: 125
投稿日時: 2006-07-04 14:55
自己レスです。

-----------------------------------------------------------------------------
*現在はコンボボックスデータソースをループして該当する値(テキストボックス入力値)があるか検査しております。
-----------------------------------------------------------------------------
と書きましたが、データソースを検査した結果見つからなかった場合、SelectedIndexに-1を設定しましたが、なぜかSelectedIndex=0になりました。

下記の★を追加すると正常に動きました。
Private Sub TextBox1_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating
  ComboBox1.SelectedItem = Nothing <--★
  ComboBox1.SelectedValue = TextBox1.Text
End Sub

これは仕様なのでしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-07-04 15:12
引用:

未記入さんの書き込み (2006-07-04 14:36) より:

1、フォームにテキストボックスとコンボボックスを配置します。
2、テキストボックスのValidatingイベントで、
テキストボックスに入力された値に該当するValueMemberをコンボボックスで選択します。
バグ、
テキストボックスに「1」を入力しValidatingイベントでコンボボックスに「○1」が表示される
テキストボックスに「2」を入力しValidatingイベントでコンボボックスに「○2」が表示される
テキストボックスに「4」を入力しValidatingイベントでコンボボックスに「○1」が表示される <--バグ!?

テキストボックスに「1」を入力しValidatingイベントでコンボボックスに「○1」が表示される
テキストボックスに「4」を入力しValidatingイベントでコンボボックスに「」が表示される


1.1 でも 2.0 でも確認しました。
バインドしているがために起きる現象のひとつだと思います。

その他にも、こんな現象 があります。

引用:

未記入さんの書き込み (2006-07-04 14:55) より:

データソースを検査した結果見つからなかった場合、SelectedIndexに-1を設定しましたが、なぜかSelectedIndex=0になりました。

下記の★を追加すると正常に動きました。
Private Sub TextBox1_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating
  ComboBox1.SelectedItem = Nothing <--★
  ComboBox1.SelectedValue = TextBox1.Text
End Sub

これは仕様なのでしょうか?


これも、バインドしているとそうなります。

このあたりは、早期に Microsoft へ Feedback が上がっていそうなんですけどね。
(それこそ、私が .NET 系の開発をやっていなかった頃に上がってそう)

2.0 でもそのままということは仕様かもしれません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-07-05 22:06
引用:

じゃんぬねっとさんの書き込み (2006-07-04 15:12) より:

このあたりは、早期に Microsoft へ Feedback が上がっていそうなんですけどね。
(それこそ、私が .NET 系の開発をやっていなかった頃に上がってそう)

2.0 でもそのままということは仕様かもしれません。


「解決済み」とマークされているのに解決されてない提案、かもしれない。
結構ある(ー_ーメ)
isayan
会議室デビュー日: 2005/06/08
投稿数: 9
投稿日時: 2006-07-10 09:45

バグだとは思いますね。かなり不便なので直してほしいです。

ちなみに

SelectedIndex=3 の状態で -1 を設定すると SelectedIndex 0 に

SelectedIndex=0 の状態で -1 を設定すると SelectedIndex -1 に

なったと記憶しています。(.NET 1.1)

これを仕様といわれても困る。

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-07-10 09:55
とは言っても、ここで書いたところで前には進みませんが...

Feedback Center に 1 度あがってそうですが、
MSDN フォーラムにもフィードバックしてみる価値はありそうですね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-07-10 10:32
MSDN フォーラムへフィードバックしました。

  [Win]ComboBox、DataSource バインド時の SelectedValue の挙動について

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
isayan
会議室デビュー日: 2005/06/08
投稿数: 9
投稿日時: 2006-07-10 10:55

どう回避したか覚えてなかったのでソースみなおしました。

SelectedIndex をオーバライドして、その中で
-1がきたらもう一度-1を設定する。
という方法。

ただし

SelectIndexが
3 → 0
0 → -1

と2回変化するから

SelectedIndexChanged(SelectedValueChanged) のイベントも2回よばれてしまうので、
SelectedIndexChanged にイベントを記述している場合は注意が必要です。

かわりに、SelectionChangeCommitted に処理を書いて、
必要に応じてプログラム内から SelectionChangeCommittedを
呼び出すことにより対処しているようです。

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