ListBox 已设置数据源,但 Refresh 啥也不做

Posted

技术标签:

【中文标题】ListBox 已设置数据源,但 Refresh 啥也不做【英文标题】:ListBox has set datasource but Refresh does nothingListBox 已设置数据源,但 Refresh 什么也不做 【发布时间】:2013-02-04 20:27:03 【问题描述】:

我似乎误解了 ListBox.Refresh() 方法,我希望有人能帮助我。

我想做什么: 我想在 Windows 窗体初始化时加载列表框的数据(源 = sql 数据库的表)。此外,当用户将数据添加到数据库时,我希望更新列表框。

逻辑: 我有一个 sql 数据库作为我的源,它设置为:

listBoxDays.DataSource = DBQuery.informationRetreval().DefaultView;

DBquery.informationRetreval() 是我的 DBQuery 静态类中的静态方法。它所做的只是从数据库中建立一个表,然后返回该表。

我在与 initializeComponent 相同的方法中设置数据源(因此我的列表框将加载现有数据):

public Settings()
    
        InitializeComponent();
        listBoxDays.DataSource = DBQuery.informationRetreval().DefaultView;
    

当用户添加更多数据时:我调用一个将数据添加到数据库的方法,然后我调用:

    listBoxDays.Refresh(); //update listbox

问题: 这不会更新列表框。初始化我的列表框后,数据将填充,但之后不会更改(因此刷新不起作用)。这是为什么?我可以再次设置 DataSource,但这感觉很草率。在查看了一些文档后,我注意到事件处理程序 DataSourceChanged 可能更适合我正在寻找的内容。然而为什么不刷新工作?

感谢您的耐心等待。如果我需要更清楚,请告诉我。

【问题讨论】:

【参考方案1】:

Refresh():强制控件使其客户区无效并立即 重绘自身和任何子控件。

刷新不会重新绑定你的控件,它只会导致控件被重绘。您必须使用

再次设置DataSource
listBoxDays.DataSource = DBQuery.informationRetreval().DefaultView;

然后重新绑定。

来源:Microsoft MSDN

【讨论】:

使用事件处理程序是否更有意义:ListControl.DataSourceChanged...在数据源更改时发生? 我会说创建一个方法来清理和绑定控件,并从 InitializeComponent() 和使用 .Refresh() 函数的其他任何地方调用它。 另外,至少在我正在使用的 VB 版本中,我收到一条错误消息,指出当数据绑定到数据源时无法清除项目。我只需要添加一行Listbox.DataSource = Nothing,然后清除我的项目并重新绑定我的数据 ListBox.Items.Clear() 在设置 DataSource 时抛出异常。工作代码是@RandomUs1r 的答案。 扩展@guneysus 的帖子:如果项目是使用 ListBox.DataSource 引入的,则无法清除它们。如果你想使用 ListBox.Items.Clear(),你必须使用 ListBox.Items.Add(object item) 来引入它们。【参考方案2】:

它只会在对象发生变化时刷新(例如,不同的查询),而不是数据。你可以这样做:

listBoxDays.DataSource = null;
listBoxDays.DataSource = DBQuery.informationRetreval().DefaultView;

刷新它...每次你需要。

【讨论】:

太棒了!我不知道为什么我们必须这样做 这:“它只会在对象发生变化时刷新(例如,不同的查询),而不是数据”在有关此问题/问题的许多其他答案中都缺少

以上是关于ListBox 已设置数据源,但 Refresh 啥也不做的主要内容,如果未能解决你的问题,请参考以下文章

您如何以编程方式将焦点设置到已具有焦点的 WPF ListBox 中的 SelectedItem?

如果 ListBox 使用数据绑定,如何在加载时正确设置焦点?

WPF ListBox 未使用 ItemsSource 更新

Spring Cloud Refresh 事件无法识别已删除的属性?

oauth2Client.getToken 缺少 refresh_token

bootstraptable refresh改变参数式怎么让offset变为零