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ディスプレイを更新して選択を維持したものを見つけることができました.