0

ここでいくつかの洞察を探しています...

私のフォームには、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!) と結びついています。

戦略的なポイントでイベントハンドラーを削除および追加すると、コードが希望どおり/期待どおりに機能します。

これが私を正しい道に導いた記事です...

4

2 に答える 2

0

AddHandler と RemoveHandler を使用して、コンボボックスにデータが入力されているときにチェーン発火イベントを防ぐことになりました。

于 2013-02-25T02:53:42.887 に答える
0

2 番目と 3 番目のコンボ ボックスで、.DataTable を設定する前に .Text/.SelectedText プロパティをクリアしてみてください。

コンボ ボックスは、.DataTable を 2 回目に設定するときに、選択した項目を .Text プロパティと一致させる必要があると仮定して、おそらく役に立ちすぎています。

于 2013-02-07T00:58:26.737 に答える