Правильное событие списка для обработки изменений в списке?(С #) - PullRequest
3 голосов
/ 15 августа 2011

У меня есть список с некоторыми элементами. Есть две кнопки для добавления и удаления элементов списка. При закрытии формы мне нужно окно сообщения с подтверждением, если в список вносятся какие-либо изменения. В общем, форма должна знать, если элементы в списке изменены. Какое будет правильное событие списка для установки измененного флага?

Примечание. Конечно, я могу справиться с этим с помощью кнопки «Добавить» и «Удалить кнопки», но это неправильный способ сделать это. Не так ли? Так что не подвохи, а правильный подход ??

Ответы [ 2 ]

3 голосов
/ 15 августа 2011

Если просто использовать ListBox, нет события, которое сообщит вам, что список изменился.

Лучше, чтобы ListBox использовал DataSource, такой как 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());
}
1 голос
/ 15 августа 2011

Я думаю, вы должны установить флаг «грязный» из вызываемых методов, чтобы фактически выполнить добавление и удаление элемента.Таким образом, если вы решите добавить дополнительные методы для взаимодействия со списком (контекстное меню, сочетание клавиш и т. Д.), Ваша логика будет в одном месте и готова к повторному использованию.

Метод add выглядел бы примерно так:

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

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

Это несколько наивный метод, поскольку добавление элемента и его удаление приводит к появлению приглашения, даже если список фактически не изменился по сравнению с егоисходное состояние.Если размер вашего списка не слишком велик, другой вариант будет сделать копию вспомогательных данных при первой загрузке, а затем сравнить окончательные данные с этой копией.Если нет различий, вам не нужно подсказывать.

...