- - PR -
コンボボックスSelectedValueのバグでしょうか?
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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-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 これは仕様なのでしょうか? | ||||||||
|
投稿日時: 2006-07-04 15:12
1.1 でも 2.0 でも確認しました。 バインドしているがために起きる現象のひとつだと思います。 その他にも、こんな現象 があります。
これも、バインドしているとそうなります。 このあたりは、早期に Microsoft へ Feedback が上がっていそうなんですけどね。 (それこそ、私が .NET 系の開発をやっていなかった頃に上がってそう) 2.0 でもそのままということは仕様かもしれません。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2006-07-05 22:06
「解決済み」とマークされているのに解決されてない提案、かもしれない。 結構ある(ー_ーメ) | ||||||||
|
投稿日時: 2006-07-10 09:45
バグだとは思いますね。かなり不便なので直してほしいです。 ちなみに SelectedIndex=3 の状態で -1 を設定すると SelectedIndex 0 に SelectedIndex=0 の状態で -1 を設定すると SelectedIndex -1 に なったと記憶しています。(.NET 1.1) これを仕様といわれても困る。 | ||||||||
|
投稿日時: 2006-07-10 09:55
とは言っても、ここで書いたところで前には進みませんが...
Feedback Center に 1 度あがってそうですが、 MSDN フォーラムにもフィードバックしてみる価値はありそうですね。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2006-07-10 10:32
MSDN フォーラムへフィードバックしました。
[Win]ComboBox、DataSource バインド時の SelectedValue の挙動について _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2006-07-10 10:55
どう回避したか覚えてなかったのでソースみなおしました。 SelectedIndex をオーバライドして、その中で -1がきたらもう一度-1を設定する。 という方法。 ただし SelectIndexが 3 → 0 0 → -1 と2回変化するから SelectedIndexChanged(SelectedValueChanged) のイベントも2回よばれてしまうので、 SelectedIndexChanged にイベントを記述している場合は注意が必要です。 かわりに、SelectionChangeCommitted に処理を書いて、 必要に応じてプログラム内から SelectionChangeCommittedを 呼び出すことにより対処しているようです。 |