Как использовать CancelEventArgs для возвращения объекта, удаленного из списка

У меня есть класс, который представляет собой магазин, в нем есть список товаров, а товары в нем можно добавлять и удалять. Удаление товара осуществляется с помощью метода Remove, в который в качестве аргумента передается ID объекта, который подлежит удалению. Перед удалением объекта генерируется событие ProductDeleting.

Я хочу реализовать возможность отмены удаления продукта из магазина и прочитал, что это возможно сделать с помощью CancelEventArgs. Для этого был создан класс CancelEventArgs, в который передаю ссылку на магазин и объект удаления, а в нем реализовал метод CancelDelete, который используя метод Add магазина добавляет обратно в каталог, переданный в конструктор CancelEventArgs объект, но не понимаю как это все заставить работать.

Подскажите, пожалуйста, каким образом нужно реализовать событие и делегат к нему, чтобы у меня была возможность отменить операцию.

public delegate void RemoveProductHandler();
public event RemoveProductHandler ProductDeleting;

Ответы (1 шт):

Автор решения: XelaNimed

Могу ошибаться, но если я правильно понял, что Вас интересует, то вот как это можно сделать.

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;
        }
    }
}
→ Ссылка