簡體   English   中英

從列表框中刪除數據綁定項會導致刷新問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM