ここでいくつかの洞察を探しています...
私のフォームには、3 つの ComboBox コントロールがあります。一番左が選択を受け取ると、ルーチンを呼び出して 2 番目を有効にして入力します。次に、2 番目で選択が行われると、3 番目についても同じことが起こります。
Private Sub cboEquipment_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cboEquipment.SelectedIndexChanged
Me.transData.isMobile = If(Me.cboEquipment.Text = MOBIEQIP, 1, 0)
If cboMembership.Enabled = False Then
Me.cboMembership.Enabled = True
End If
Call loadGroups()
End Sub
メソッド「loadGroups」
Private Sub loadGroups()
Dim cn As New SqlConnection(My.Settings.MyConnectionString)
Dim cm As New SqlCommand("SELECT ... ORDER BY codeHumanName ASC", cn)
Dim ta As New SqlDataAdapter(cm)
Dim dt As New DataTable
Me.cboMembership.DataSource = Nothing
Me.cboMembership.Items.Clear()
Me.transData.membership = Nothing
cn.Open()
ta.Fill(dt)
With Me.cboMembership
.DataSource = dt
.DisplayMember = "codeHumanName"
.ValueMember = "codeID"
End With
cn.Close()
End Sub
これはうまく機能し、すべてが正常にロードされ、適切な .ValueMember の結果が提供されます。
フォームが最初に読み込まれるとき、ボックス 2 と 3 は空で無効になっていることに注意してください。初期ロードの後、リストから項目を選択して値を取得する必要があります (予想どおり)。
奇妙な点は、2 番目または 3 番目のコンボボックスが「初期化」されると、最後の設定を思い出すように見えることです。たとえば、.DataSource プロパティを Nothing に設定する Reset メソッドを呼び出すと、リストがクリアされ、Text が Nothing に設定されます。次に cboEquipment の SelectedIndex を変更すると、他のボックスが SelectedItems と SelectedValues で復活します。
新しい DataTable によると、これらの値は間違っていませんが、まったく覚えているのは奇妙です (参照を持たず、新しい読み込みとして動作する必要があります)。
その他の興味深い点; populate メソッドは、SelectedIndexChanged イベント中に呼び出されます。
どんな考えでも素晴らしいでしょう!
アップデート -
この動作は、SelectedIndexChange イベントの跳ね返り (raise! raise! raise!) と結びついています。
戦略的なポイントでイベントハンドラーを削除および追加すると、コードが希望どおり/期待どおりに機能します。
これが私を正しい道に導いた記事です...