【发布时间】:2012-07-01 05:56:36
【问题描述】:
我在 Form_Load 事件中全局填充的表单类中有一个带有 DataTable (DT) 数据源的 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
我确信这是一个简单的问题,但我似乎无法弄清楚。我试过刷新()。我已经尝试再次设置 DataSource。我阅读了这个 StackOverflow 问题 Winforms listbox not updating when bound data changes,但 ResetBindings() 在这种情况下似乎不是可用的方法。
*编辑。当史蒂夫提到 BindingContext 时,我将答案归功于他。不过,这让我找到了BindingContext(DT).EndCurrentEdit(),它更新了我的 LB 显示并保持了选择。
【问题讨论】:
-
许多控件无法知道对象内部的某些内容何时发生了变化。如果我有一个
Foo的BindingList,它可能知道我是否添加/删除了Foo,但它不知道Foo.Property是否已更改。为了传达这些更改,Foo需要实现 INotifyPropertyChanged。类似的事情可能在这里起作用。
标签: vb.net winforms binding datatable datasource