从列表框中删除数据绑定项会导致刷新问题

本文关键字:刷新 新问题 数据绑定 列表 删除 | 更新日期: 2023-09-27 17:47:46

我已经将一个列表框数据绑定到一个简单的自定义对象集合。接下来,我添加了一个按钮,用于从对象集合中删除所选项目。问题是,当某些项目被删除,列表框显示垂直滚动条时,滚动条似乎重置到了一个新的位置,尽管我真正认为发生的是控件正在重新绘制。

下面的代码示例演示了这个问题。将此代码添加到表单中,确保出现垂直滚动条。选择集合中间的项目,使滚动条居中,然后按下移除按钮。当控件重新绘制时,项目和滚动条位于不同的位置。我希望列表框的行为与处理非数据绑定项的行为相同。我最好不使用数据绑定,还是有一个解决方案可以让我保持控制绑定?

谢谢。

public partial class Form1 : Form
{
    private BindingList<ItemData> m_bList = new BindingList<ItemData>();
    public Form1()
    {
        InitializeComponent();
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        for (int i = 0; i < 50; i++)
        {
            m_bList.Add(new ItemData("Name " + i.ToString(), i)); 
        }
        this.listBox1.DisplayMember = "Name";
        this.listBox1.DataSource = m_bList;
    }
    private void btnRemove_Click(object sender, EventArgs e)
    {
        m_bList.Remove(listBox1.SelectedItem as ItemData);
    }
}
public class ItemData
{
    public string Name { get; set; }
    public int Position { get; set; }
    public ItemData(string name, int position)
    {
        Name = name;
        Position = position;
    }
}

从列表框中删除数据绑定项会导致刷新问题

删除项目时,需要保留列表框的TopIndex属性。保留SelectedIndex不会阻止滚动条跳转。下面的代码符合我的要求。

    private void btnRemove_Click(object sender,EventArgs e)
    {
        int topIndex = listBox1.TopIndex;
        m_bList.Remove(listBox1.SelectedItem as ItemData);
        if(listBox1.Items.Count>topIndex)
            listBox1.TopIndex = topIndex;
    }

我可以想出一种方法来抑制错误(注意,这可能不是最准确的解决方案)。我只是在按钮点击事件中添加了一些内容。我不确定他们是否完全解决了你的要求,因为你会是最好的判断者,但不管怎样,你还是来吧。

 private void btnRemove_Click(object sender, EventArgs e)
    {
        int s = listBox1.SelectedIndex;
        m_bList.Remove(listBox1.SelectedItem as ItemData);
        listBox1.Refresh();
        listBox1.SelectedIndex = s;
     }