2011-08-15 21 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