【问题标题】:listbox Refresh() in c#C#中的列表框刷新()
【发布时间】:2011-07-05 10:02:20
【问题描述】:
int[] arr = int[100];
listBox1.DataSource = arr;
void ComboBox1SelectedIndexChanged(object sender, EventArgs e)
{
    .....//some processes
    listBox1.DataSource = null;
    listBox1.DataSource = arr;
}

is not working,

还有,

listBox1.Refresh(); is not working,

还有,

listBox1.Update(); is not working,


我知道我可以使用BindingList<T>,但我只能使用数组。

你能帮我如何刷新列表框吗?

【问题讨论】:

    标签: c# listbox refresh


    【解决方案1】:

    我在这里的堆栈交换的第一个答案。

    C# .Net 4.0:

    listBox1.DataSource = null;
    listBox1.DataSource = names;
    

    我注意到第一次设置数据源时,它会刷新。 设置后,您尝试再次将其设置为相同,它不会更新。

    所以我把它设为空,将它设置为相同的,它在这个问题上为我正确显示。

    【讨论】:

      【解决方案2】:

      ListBox 仅在绑定到 dataSource 的对象通知它自己的更改时更新其显示的内容。 BindingSource 对象有一个名为 DataSourceChanged 的​​事件。当源更改为不同的对象时,列表框将自行更新。 绑定列表时也是如此。如果您更改列表,则不会发生任何事情,因为列表不会通知它已更改。这个问题有一个简单的解决方案:使用 BindingList http://msdn.microsoft.com/de-de/library/ms132679%28v=vs.110%29.aspx

      BindingList 具有 ListChanged 事件,每次更改 List 时都会调用(显然)。所以 Windows.Form 对象的 DataBindings 使用 ListChanged 之类的事件来更新自己。简单的 List 不支持此事件。

      所以,如果您想使用大量数据绑定,您应该了解: http://msdn.microsoft.com/de-de/library/system.componentmodel.inotifypropertychanged%28v=vs.110%29.aspx

      【讨论】:

      • 但在很多情况下,您不想更新现有的 BindingList,而是将其替换为另一个。那么它不会自动更新,因为DataSource仍然指向旧的。
      【解决方案3】:

      设法做到了

      FirstListBox.DataContext = null;
      FirstListBox.DataContext = App.ViewModel;
      

      只需丢失链接并将所有数据返回给它。

      【讨论】:

        【解决方案4】:

        我继承了 ListBox 并添加了一个名为 RefreshItems() 的公共方法,它可以满足我们的需求。已经实施和所有。我不知道他们为什么不使用公共方法。

        【讨论】:

          【解决方案5】:

          问题可能来自 ListBox SelectionMode。

          由于我不知道的原因,当 SelectionMode 为 SelectionMode.None 时,数据绑定不起作用。

          解决方法可能是:

          listBox.SelectionMode = SelectionMode.MultiExtended;
          listBox.DataSource = myDatasource;
          listBox.SelectionMode = SelectionMode.None;
          

          希望对你有帮助。

          【讨论】:

          • 谢谢 - 找了好久,..这是我的问题。微软真的很烂!
          • 是的——这有效!就我而言,我使用 listBox.Refresh() 而不是更改 DataSource。
          【解决方案6】:

          好吧,没有绑定我只管理:

          this.Hide();
          this.Show();
          

          它重绘一切......

          【讨论】:

            【解决方案7】:

            试试下面的

            listBox1.DataBind()
            

            【讨论】:

            • 它可能适用于 .NET 3.5 及更高版本,例如有没有办法在 .NET 2.0 上刷新
            • .NET 4.0 中没有 DataBind()
            【解决方案8】:

            使用 BeginUpdate 和 EndUpdate,应该可以解决它。 无需设置两次数据源

            listBox1.BeginUpdate();
            
            listBox1.DataSource = myList;
            
            listBox1.EndUpdate();
            

            【讨论】:

              【解决方案9】:

              这些链接可能会有所帮助。

              如何更新列表框项 (C#)? - http://arstechnica.com/civis/viewtopic.php?f=20&t=554717

              将 ArrayList 绑定到 ListBox - http://www.java2s.com/Tutorial/CSharp/0460__GUI-Windows-Forms/BindArrayListtoListBox.htm

              【讨论】:

                【解决方案10】:

                在加载完成之前查看 Windows 窗体的更改,尤其是 Listbox 和其他控件上的更改是很棘手的。 要将数据视为已加载的数据,请使用 invalidate();然后更新();

                【讨论】:

                  猜你喜欢
                  • 2012-03-29
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-07-16
                  • 2012-03-20
                  • 1970-01-01
                  • 2023-03-23
                  • 1970-01-01
                  • 2011-02-15
                  相关资源
                  最近更新 更多