我有一个列表框中的一些项目。有两个按钮可添加和删除列表框项目。关闭表单时,如果对列表框进行了任何更改,我需要一个确认消息框。所以基本上,表单需要知道列表框中的项目是否已更改。这将是正确的列表框事件来设置更改的标志?右列表框事件来处理listbox中的更改? (C#)
注意:当然,我可以通过添加按钮和删除按钮单击处理此操作,但这不是正确的方法。不是吗?所以没有肮脏的技巧,但正确的做法?
我有一个列表框中的一些项目。有两个按钮可添加和删除列表框项目。关闭表单时,如果对列表框进行了任何更改,我需要一个确认消息框。所以基本上,表单需要知道列表框中的项目是否已更改。这将是正确的列表框事件来设置更改的标志?右列表框事件来处理listbox中的更改? (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());
}
我想你应该设置被调用的方法中的“脏”标志来实际执行项目的添加和删除。这样,如果您决定添加用于与列表框(上下文菜单,键盘快捷方式等)交互的其他方法,则您的逻辑全部在一个位置,并且可以重新使用。
所以,你的add方法会是这个样子:
public void Add(MyListboxItem itemToAdd)
{
// Adding code here
// Set the boolean flag to true
this.IsDirty = true;
}
这是一个有点天真的方法,不过,因为现在增加一个项目,然后删除它导致一个提示,即使列表中有不实际上从原来的状态改变了。如果列表的大小不是太大,另一个选择是在第一次加载时制作备份数据的副本,然后将最终数据与该副本进行比较。如果没有差异,则不必提示。
谢谢,这是一个解决方法,但比明显的选择更多的工作。 – nawfal