Winforms ListBox 控件在源更改后不更新

Posted

技术标签:

【中文标题】Winforms ListBox 控件在源更改后不更新【英文标题】:Winforms ListBox Control Not Updating After Source Changes 【发布时间】: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。我阅读了这个 *** 问题 Winforms listbox not updating when bound data changes,但 ResetBindings() 在这种情况下似乎不是可用的方法。

*编辑。当史蒂夫提到 BindingContext 时,我将答案归功于他。不过,这让我找到了BindingContext(DT).EndCurrentEdit(),它更新了我的 LB 显示并保持了选择。

【问题讨论】:

许多控件无法知道对象内部的某些内容何时发生了变化。如果我有一个Foo 的BindingList,它可能知道我是否添加/删除了Foo,但它不知道Foo.Property 是否已更改。为了传达这些更改,Foo 需要实现 INotifyPropertyChanged。类似的事情可能在这里起作用。 【参考方案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  

【讨论】:

哦.. BindingContext(DT).EndCurrentEdit() 更新了我的显示并没有取消选择项目:D 很好,EndCurrentEdit 更好。为了这个问题的未来读者的利益,我将根据您的建议更新我的答案.... 我不明白。你从哪里得到的 DT? @PsychoData 是一个类级别的DataTable变量。查看第一行问题

以上是关于Winforms ListBox 控件在源更改后不更新的主要内容,如果未能解决你的问题,请参考以下文章

如何检测是不是将项目添加到 ListBox(或 CheckedListBox)控件

在运行时更改 winforms 控件

使用自定义 WinForms 控件,我可以更改嵌套控件停靠在里面的矩形吗?

双缓冲列表框

绑定到 DataRowView 的 Winforms 控件更改行值但不更改 RowState

无法更改 WinForms MonthCalendar 控件中的字体