[英]Removing databound item from listbox causes refresh problems
我已經將列表框與一個簡單的自定義對象集合進行了數據綁定。 接下來,我添加了一個按鈕以從對象集合中刪除所選項目。 問題是,當某些項目被刪除並且列表框顯示垂直滾動條時,滾動條似乎重置為新位置,盡管我真正想到的是控件正在重新繪制。
以下代碼示例演示了此問題。 將此代碼添加到窗體,確保出現垂直滾動條。 在集合的中間選擇一個項目,使滾動條居中,然后按移除按鈕。 控件重新繪制時,項目和滾動條位於不同的位置。 我希望列表框的行為與未綁定數據的項目相同。 我最好不要使用數據綁定,還是有一種解決方案可以讓我保持控制約束?
謝謝。
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.