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

时间:2008-10-30 01:16:45

标签: c# .net

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

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

感谢。

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;
    }
}

2 个答案:

答案 0 :(得分:3)

删除项目时,需要保留列表框的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;
    }

答案 1 :(得分:0)

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

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