如何在不重新插入的情况下刷新ListBox中的项目文本?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在不重新插入的情况下刷新ListBox中的项目文本?相关的知识,希望对你有一定的参考价值。

我有类TestClassToString覆盖(它返回Name字段)。我有TestClass添加到ListBox的实例,在某些时候我需要更改其中一个实例的Name,然后我怎么能刷新它在ListBox的文本?

using System;
using System.Windows.Forms;

namespace TestListBox
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            listBox1.Items.Add(new TestClass("asd"));
            listBox1.Items.Add(new TestClass("dsa"));
            listBox1.Items.Add(new TestClass("wqe"));
            listBox1.Items.Add(new TestClass("ewq"));
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ((TestClass)listBox1.Items[0]).Name = "123";
            listBox1.Refresh(); // doesn't help
            listBox1.Update(); // same of course
        }
    }

    public class TestClass
    {
        public string Name;

        public TestClass(string name)
        {
            this.Name = name;
        }

        public override string ToString()
        {
            return this.Name;
        }
    }
}
答案

尝试

listBox1.Items[0] = listBox1.Items[0];
另一答案

您的Testclass需要实现INotifyPropertyChanged

public class TestClass : INotifyPropertyChanged
{
    string _name;

    public string Name
    {
        get { return _name;}
        set 
        {
              _name = value;
              _notifyPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void _notifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));  
    }

    public TestClass(string name)
    {
        this.Name = name;
    }

    public override string ToString()
    {
        return this.Name;
    }
}

但是,只有在使用不依赖于ToString()但绑定属性Name的列时,这才有效

这可以通过更改代码来完成:

在课堂的某个地方宣布

BindingList<TestClass> _dataSource = new BindingList<TestClass>();

在initializeComponent中写

listBox1.DataSource = _dataSource;

然后在_dataSource而不是Listbox上执行所有操作。

另一答案

你可以使用BindingList:

        items = new BindingList<TestClass>( );
        listBox1.DataSource = items;
        listBox1.DisplayMember = "_Name";

然后刷新列表调用:

        items.ResetBindings( );

编辑:另外不要忘记为Name创建一个get属性

      public string _Name
    {
        get { return Name; }
        set { Name= value; }
    }
另一答案

我遇到了同样的问题,并尝试了各种不同的方法来获取项目的显示文本以实际反映基础项目值。经过所有可用的属性后,我发现这是最简单的。 lbGroupList.DrawMode = DrawMode.OwnerDrawFixed; lbGroupList.DrawMode = DrawMode.Normal; 它触发控件中的相应事件以更新显示的文本。

以上是关于如何在不重新插入的情况下刷新ListBox中的项目文本?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不刷新的情况下执行 jquery ajax 来重新加载我的数据

使用 ajax 在不刷新站点的情况下更改 mongoDB 中的某些项目

如何在不刷新整个页面的情况下重新加载组件?

如何在不实际删除行的情况下明显折叠 Silverlight 4 ListBox 中的单行?

如何在不加载视图的情况下重新加载/刷新部分视图中的级联下拉列表

如何在不重新加载整个页面的情况下刷新 div?