我已将一个列表框数据绑定到一个简单的自定义对象集合。接下来,我添加了一个按钮,用于从对象集合中删除所选项目。问题是,当删除某些项目并且列表框显示垂直滚动条时,滚动条似乎重置为新位置,尽管我真正想到的是控件正在重新绘制。
下面的代码示例演示了该问题。将此代码添加到表单,确保显示垂直滚动条。选择集合中间的项目,使滚动条居中并按下删除按钮。当控件重新绘制时,项目和滚动条处于不同的位置。我希望列表框的行为与非数据绑定项一样。我最好不要使用数据绑定,还是有一个解决方案允许我保持控制绑定?
感谢。
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;
}
}
答案 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;
}