用于处理列表框中更改的右侧列表框事件? (C#)

时间:2011-08-15 13:40:35

标签: c# winforms listbox event-handling c#-2.0

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

注意:我当然可以通过“添加”按钮和“删除”按钮点击来处理此问题,但这不是正确的方法。不是吗?所以没有肮脏的伎俩,但正确的做法??

2 个答案:

答案 0 :(得分:3)

如果只是直接使用ListBox,不,没有一个事件会告诉你列表已经改变。

最好让ListBox使用像BindingList这样支持ListChanged事件的DataSource。

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());
}

答案 1 :(得分:1)

我认为您应该从调用的方法设置“脏”标志,以实际执行项目添加和删除。这样,如果你决定添加其他方法来与列表框进行交互(上下文菜单,键盘快捷键等),你的逻辑就在一个地方,可以重新使用。

所以你的add方法看起来像这样:

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

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

这是一个有点天真的方法,但是,因为现在添加一个项目然后删除它会导致提示,即使该列表实际上没有从其原始状态改变。如果列表的大小不是太大,则另一个选项是在首次加载时制作备份数据的副本,然后将最终数据与该副本进行比较。如果没有差异,则无需提示。