我有一个包含一些项目的列表框。有两个按钮可以添加和删除列表框项目。关闭表单时,如果对列表框进行了任何更改,我需要一个确认消息框。所以基本上,表单需要知道列表框中的项是否已更改。哪个是设置更改标志的正确列表框事件?
注意:我当然可以通过“添加”按钮和“删除”按钮点击来处理此问题,但这不是正确的方法。不是吗?所以没有肮脏的伎俩,但正确的做法??
答案 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;
}
这是一个有点天真的方法,但是,因为现在添加一个项目然后删除它会导致提示,即使该列表实际上没有从其原始状态改变。如果列表的大小不是太大,则另一个选项是在首次加载时制作备份数据的副本,然后将最终数据与该副本进行比较。如果没有差异,则无需提示。