gpt4 book ai didi

c# - 在一种方法中添加和删除事件,c#

转载 作者:太空宇宙 更新时间:2023-11-03 21:12:54 24 4
gpt4 key购买 nike

有时我需要在一堆控件中添加和删除事件。我总是使用一种添加事件的方法来做到这一点:

private void AddEvents(){
textBox.TextChanged += TextChanged;
integerUpDown.ValueChanged += ValueChanged;
colorPicker.SelectedColorChanged += ColorChanged;
//... and so on
}

同样的一个用于删除事件:

private void RemoveEvents(){
textBox.TextChanged -= TextChanged;
integerUpDown.ValueChanged -= ValueChanged;
colorPicker.SelectedColorChanged -= ColorChanged;
//... and so on
}

我正在使用不同类型的控件和不同类型的 EventArgs。我想将其压缩为一种方法,例如:

private void RemoveEvents(bool add){
textBox.TextChanged add ? += : -= TextChanged;
integerUpDown.ValueChanged add ? += : -= ValueChanged;
//or method approach
ManageEvent(colorPicker.SelectedColorChanged, ColorChanged, add);
//... and so on
}

但这不可能吗?运算符(operator)。有办法吗?

最佳答案

我认为这很好。

首先,定义如下接口(interface)和类:

public interface IEventHolder
{
void Attach();
void Detach();
}

public class EventHolder<H> : IEventHolder
{
private Action<H> _add;
private Action<H> _remove;
private H _handler;

public EventHolder(Action<H> add, Action<H> remove, H handler)
{
_add = add;
_remove = remove;
_handler = handler;
}

public void Attach() { _add(_handler); }

public void Detach() { _remove(_handler); }
}

现在您可以定义这个私有(private)字段:

    private List<IEventHolder> _eventHolders = new List<IEventHolder>();

Form_Load 事件中我写了这段代码:

    private void Form1_Load(object sender, EventArgs e)
{
_eventHolders.Add(new EventHolder<EventHandler>(h => textBox1.TextChanged += h, h => textBox1.TextChanged -= h, textBox1_TextChanged));
_eventHolders.Add(new EventHolder<EventHandler>(h => numericUpDown1.ValueChanged += h, h => numericUpDown1.ValueChanged -= h, numericUpDown1_ValueChanged));
_eventHolders.Add(new EventHolder<MouseEventHandler>(h => textBox2.MouseMove += h, h => textBox2.MouseMove -= h, textBox2_MouseMove));

_eventHolders.ForEach(eh => eh.Attach());
}

请注意 _eventHolders.ForEach(eh => eh.Attach()); 行附加了所有事件。

我的处理程序看起来像这样:

    private void textBox1_TextChanged(object sender, EventArgs e)
{ }

private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
this.textBox1.Text = numericUpDown1.Value.ToString();
}

private void textBox2_MouseMove(object sender, MouseEventArgs e)
{
_eventHolders.ForEach(eh => eh.Detach());
}

textBox2_MouseMove 处理程序一次性分离所有事件。

我已经测试过了,效果很好。

关于c# - 在一种方法中添加和删除事件,c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36510368/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com