3

Form_Load イベントでグローバルに設定された Form クラスに DataTable (DT) DataSource を持つ ListBox (LB) があります。

Private Sub frmEditPresets_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    DT.Columns.Add("DisplayText")
    DT.Columns.Add("PresetID")
    For Each TSI As ToolStripItem In Presets.DropDownItems
        If TSI.Name.IndexOf("preset_") > -1 Then
            DT.Rows.Add(TSI.Text, TSI.Name)
        End If
    Next
    LB.DataSource = DT
    LB.DisplayMember = "DisplayText"
End Sub

名前の変更ボタンを使用したとき。メニュー項目とデータ ソースは更新されますが、リストボックス内の別の項目をクリックするまでリストボックスは更新されません。

コードの名前を変更:

Private Sub btnRename_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRename.Click
    Dim R As DataRowView = LB.SelectedItem
    Dim S As String = InputBox("Preset Name", "Rename", R("DisplayText"))
    If S.Trim.Length = 0 Then Exit Sub
    If Presets.DropDownItems.ContainsKey(R("PresetID").ToString) Then
        Presets.DropDownItems(R("PresetID").ToString).Text = S
    End If
    R("DisplayText") = S
End Sub

これは簡単な答えを持つ簡単な質問だと思いますが、理解できないようです。Refresh() を試してみました。DataSource を再度設定してみました。この StackOverflow question Winforms listbox not updated when bound data changesを読みましたが、このコンテキストでは ResetBindings() が使用可能なメソッドではないようです。

*編集。Steve が BindingContext に言及したとき、私はその答えを称賛しました。BindingContext(DT).EndCurrentEdit()ただし、それにより、LBディスプレイを更新して選択を維持したものを見つけることができました.

4

1 に答える 1

1

これで試してみましたが、うまくいきます.....

Private Sub btnRename_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRename.Click  
    Dim R As DataRowView = LB.SelectedItem  
    Dim S As String = InputBox("Preset Name", "Rename", R("DisplayText"))  
    If S.Trim.Length = 0 Then Exit Sub  
    If Presets.DropDownItems.ContainsKey(R("PresetID").ToString) Then  
        Presets.DropDownItems(R("PresetID").ToString).Text = S  
    End If  
    R("DisplayText") = S  
    BindingContext(DT).EndCurrentEdit()
End Sub  
于 2012-06-29T17:56:55.187 に答える