正确的列表框事件来处理列表框中的更改?(c#)

本文关键字:列表 处理 事件 | 更新日期: 2023-09-27 18:05:31

我有一个列表框,里面有一些项目。有两个按钮用于添加和删除列表框项。当关闭表单时,如果对列表框进行了任何更改,我需要一个确认消息框。基本上,表单需要知道列表框中的项是否被改变了。哪个是正确的列表框事件来设置已更改的标志?

注意:当然,我可以处理这个从添加按钮和删除按钮点击,但这不是正确的方式来做它。这样不是吗?所以没有肮脏的把戏,但正确的方法??

正确的列表框事件来处理列表框中的更改?(c#)

如果只是直接使用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());
}

我认为您应该从调用的方法中设置"dirty"标志,以实际执行项目添加和删除。这样,如果您决定添加用于与列表框交互的其他方法(上下文菜单、键盘快捷键等),您的逻辑都在一个地方,并且可以随时重用。

那么你的add方法应该是这样的:

public void Add(MyListboxItem itemToAdd)
{
    // Adding code here
    // Set the boolean flag to true    
    this.IsDirty = true;
}

这是一个有点幼稚的方法,因为现在添加一个项目,然后删除它的结果是一个提示,即使列表实际上并没有改变它的原始状态。如果列表的大小不是太大,另一种选择是在第一次加载备份数据时创建一个副本,然后将最终数据与该副本进行比较。如果没有差异,则不必提示。