【问题标题】:keeping only 5 items in a listbox在列表框中仅保留 5 个项目
【发布时间】:2014-05-22 11:14:36
【问题描述】:

我想创建一个简单的列表框,它绑定到一个链表。 该列表在任何给定时间只能包含 5 个项目。 添加新项时,应检查项数是否为>= 5,然后删除最后一项并将新项添加到顶部。

为此,我制作了这个测试应用:

public partial class Form1 : Form
{
    LinkedList<string> list01 = new LinkedList<string>();

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        list01.AddFirst("AAA");
        list01.AddFirst("BBB");
        list01.AddFirst("CCC");

        listBox1.DataSource = new BindingSource(list01, "");
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (list01.Count >= 5)
            list01.RemoveLast();

        list01.AddFirst(DateTime.Now.ToString());
        listBox1.DataSource = new BindingSource(list01, "");
    }
}

看来,每当我添加新项目时,我必须不断将数据源设置为新的绑定源,以便添加的项目显示在 UI 上

有没有办法初始化一个绑定源,当其中的项目发生变化时,自动更新列表框,而无需在每次添加新项目时设置数据源?

【问题讨论】:

  • 有什么原因不能使用BindingList&lt;T&gt;ObservableCollection&lt;T&gt; 吗?还是你不知道?
  • 我知道BindingList&lt;T&gt; 并且知道它没有我想要的方法AddTopRemoveLast
  • 如何从BindingList&lt;T&gt; 中删除最后一项并将一项添加到顶部/第一个?
  • 自己实现这些方法并不难。

标签: c# winforms


【解决方案1】:

您需要一个实现集合更改通知的集合。您有两个选项BindingList&lt;T&gt;ObservableCollection&lt;T&gt;

选择任何一个,从您的评论看来,您只是在寻找AddFirstRemoveLast。您可以自己创建一个扩展方法来执行此操作。

public static class BindingListExtension
{
    public static void AddFirst<T>(this BindingList<T> list, T item)
    {
        list.Insert(0, item);
    }

    public static void RemoveLast<T>(this BindingList<T> list)
    {
        list.RemoveAt(list.Count - 1);
    }
}

【讨论】:

    【解决方案2】:

    根据Sriram Sakthivel's 的建议,我已经达到了这样的要求:

    public partial class Form1 : Form
    {
        BindingList<string> list01 = new BindingList<string>();
    
        public Form1()
        {
            InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
            listBox1.DataSource = list01;
    
            list01.Add("AAA");
            list01.Add("BBB");
            list01.Add("CCC");
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            if (list01.Count >= 5)
                list01.RemoveAt(4);
    
            list01.Insert(0, DateTime.Now.ToString());
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-24
      • 2015-06-14
      • 1970-01-01
      • 2020-12-03
      相关资源
      最近更新 更多