【问题标题】:Removing databound item from listbox causes refresh problems从列表框中删除数据绑定项会导致刷新问题
【发布时间】:2008-10-31 18:38:57
【问题描述】:

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

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

谢谢。

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

【问题讨论】:

    标签: c# .net


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我可以想出一种方法来抑制错误(注意这可能不是最准确的解决方案)。我只是在按钮单击事件中添加了一些东西。我不确定他们是否完全解决了您的要求,因为您将是最好的判断者,但仍然可以。

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

      【讨论】:

      • 请注意,删除项目后,旧索引的项目仍然存在。例如,如果你删除最后一项,你会得到一个 IndexOutOfRangeException。
      • 当然。感谢您指出了这一点。我只是想提供一种可能被称为快速修复的方法,看看是否能解决问题。
      • 我将最后一行更改为: listBox1.SelectedIndex = (s >= listBox1.Items.Count) ? listBox1.Items.Count - 1 : s
      猜你喜欢
      • 2016-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多