Как использовать CancelEventArgs для возвращения объекта, удаленного из списка
У меня есть класс, который представляет собой магазин, в нем есть список товаров, а товары в нем можно добавлять и удалять. Удаление товара осуществляется с помощью метода Remove, в который в качестве аргумента передается ID объекта, который подлежит удалению. Перед удалением объекта генерируется событие ProductDeleting.
Я хочу реализовать возможность отмены удаления продукта из магазина и прочитал, что это возможно сделать с помощью CancelEventArgs. Для этого был создан класс CancelEventArgs, в который передаю ссылку на магазин и объект удаления, а в нем реализовал метод CancelDelete, который используя метод Add магазина добавляет обратно в каталог, переданный в конструктор CancelEventArgs объект, но не понимаю как это все заставить работать.
Подскажите, пожалуйста, каким образом нужно реализовать событие и делегат к нему, чтобы у меня была возможность отменить операцию.
public delegate void RemoveProductHandler();
public event RemoveProductHandler ProductDeleting;
Ответы (1 шт):
Могу ошибаться, но если я правильно понял, что Вас интересует, то вот как это можно сделать.
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
}
public class RemoveProductEventArgs : CancelEventArgs
{
public Product ProductToRemove { get; }
public RemoveProductEventArgs(Product productToRemove)
{
ProductToRemove = productToRemove;
}
}
// пример, как можно использовать
public partial class CancelEventArgsDemo : Form
{
public event EventHandler<RemoveProductEventArgs> BeforeRemoveProduct;
public List<Product> Products = new()
{
new () { Id = 1, Name = "Abc" },
new () { Id = 2, Name = "Def" },
new() { Id = 3, Name = "Ghi" },
};
public CancelEventArgsDemo()
{
InitializeComponent();
BeforeRemoveProduct += onBeforeRemoveProduct;
Load += onLoad;
}
public bool RemoveProduct(int itemId)
{
var product = Products.Find(p => p.Id == itemId);
var eventArgs = new RemoveProductEventArgs(product);
BeforeRemoveProduct?.Invoke(this, eventArgs);
return eventArgs.Cancel
? false
: Products.Remove(product);
}
private void onLoad(object? sender, EventArgs e)
{
string msg;
for (int i = 1; i < 4; i++)
{
msg = RemoveProduct(i)
? $"Product with Id '{i}' deleted successfully"
: "Deleting an product with id '{i}' failed";
_ = MessageBox.Show(msg);
}
}
private void onBeforeRemoveProduct(object? sender, RemoveProductEventArgs e)
{
if (e.ProductToRemove.Name.StartsWith("D"))
{
e.Cancel = true;
}
}
}