从列表框中删除数据绑定项会导致刷新问题
本文关键字:刷新 新问题 数据绑定 列表 删除 | 更新日期: 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;
}