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

时间:2012-06-29 17:22:14

标签: vb.net winforms binding datatable datasource

我有一个ListBox(LB),在Form_Load事件中全局填充Form Class中的DataTable(DT)DataSource。

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问题Winforms listbox not updating when bound data changes但是在这种情况下,ResetBindings()似乎不是一个可用的方法。

*编辑。当他提到BindingContext时,我给了Steve一个答案。虽然,这导致我找到BindingContext(DT).EndCurrentEdit()更新我的LB显示并保持选择。

1 个答案:

答案 0 :(得分: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