2011-08-15 43 views
3

我有一個列表框中的一些項目。有兩個按鈕可添加和刪除列表框項目。關閉表單時,如果對列表框進行了任何更改,我需要一個確認消息框。所以基本上,表單需要知道列表框中的項目是否已更改。這將是正確的列表框事件來設置更改的標誌?右列表框事件來處理listbox中的更改? (C#)

注意:當然,我可以通過添加按鈕和刪除按鈕單擊處理此操作,但這不是正確的方法。不是嗎?所以沒有骯髒的技巧,但正確的做法?

回答

3

如果只是直接使用ListBox,否則沒有事件會告訴您列表已更改。

最好讓ListBox使用像BindingList這樣支持ListChanged事件的數據源。

private BindingList<string> myList = new BindingList<string>(); 
private bool isDirty; 

public Form1() 
{ 
    InitializeComponent(); 

    myList.Add("aaa"); 
    myList.Add("bbb"); 
    myList.Add("ccc"); 
    myList.ListChanged += new ListChangedEventHandler(myList_ListChanged); 

    listBox1.DataSource = myList; 
} 

public void myList_ListChanged(object sender, ListChangedEventArgs e) 
{ 
    isDirty = true; 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    MessageBox.Show("IsDirty = " + isDirty.ToString()); 
    myList.Add("ddd"); 
    MessageBox.Show("IsDirty = " + isDirty.ToString()); 
} 
+0

謝謝,這是一個解決方法,但比明顯的選擇更多的工作。 – nawfal

1

我想你應該設置被調用的方法中的「髒」標誌來實際執行項目的添加和刪除。這樣,如果您決定添加用於與列表框(上下文菜單,鍵盤快捷方式等)交互的其他方法,則您的邏輯全部在一個位置,並且可以重新使用。

所以,你的add方法會是這個樣子:

public void Add(MyListboxItem itemToAdd) 
{ 
    // Adding code here 

    // Set the boolean flag to true  
    this.IsDirty = true; 
} 

這是一個有點天真的方法,不過,因爲現在增加一個項目,然後刪除它導致一個提示,即使列表中有不實際上從原來的狀態改變了。如果列表的大小不是太大,另一個選擇是在第一次加載時製作備份數據的副本,然後將最終數據與該副本進行比較。如果沒有差異,則不必提示。

+0

是的我明白了。但是,只有一個列表框的事件處理程序呢?即使這樣也會帶來你所談論的好處。此外,它甚至可以處理有更多方法來改變列表框的情況。是不是有像ItemsChanged類似於SelectedIndexChange的東西?只知道.. – nawfal

+0

你還沒有指定WinForms或WPF,但我不認爲這樣的事件存在。有了WPF,你通常會有一個'ObservableCollection <>'支持列表,在這種情況下,你可以訂閱事件。 – dlev

+0

原始狀態問題可以忽略。沒關係..但是一個簡單的事件呢? – nawfal