相关疑难解决方法(0)

一次性删除所有事件处理程序

问题:我有一个包含对象列表的文档类.这些对象引发事件,如SolutionExpired,DisplayExpired等文件需要对此作出回应.

文档有时可以交换对象,但是单个对象永远不应该是多个文档的"一部分".

我的文档类包含许多用作事件处理程序的方法.每当一个对象进入文档时,我就会AddHandler用来设置事件,每当从文档中删除一个对象时,我就会RemoveHandler用来撤消损坏.但是,有些情况下很难确保所有步骤都得到适当的处理,因此我最终可能会遇到流氓事件处理程序.

长话短说; 如何删除指向特定方法的所有处理程序?注意,我没有可能的事件源列表,这些可以存储在任何地方.

就像是:

RemoveHandler *.SolutionExpired, AddressOf DefObj_SolutionExpired
Run Code Online (Sandbox Code Playgroud)

vb.net events

5
推荐指数
1
解决办法
2万
查看次数

如何在C#中删除并重新连接EventHandler到控件?

我读过这个答案.它只是告诉我如何从按钮控件中删除click事件.我想知道如何更改代码(特别是GetField("EventClick"...部分!)所以我可以用其他控件做同样的事情.例如,我想删除a的TextChanged事件TextBox.我还想知道如何重新附加事件处理程序.

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        if (textBox1.Text.Length < 10) return;

        MessageBox.Show("do something");
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        Tools.mkTextBoxWithPlaceholder(textBox1, "hi, input here...");
    }
}
class Tools
{
    public static void mkTextBoxWithPlaceholder(TextBox tb, string placeholder)
    {
        tb.Tag = placeholder;
        tb.GotFocus += new EventHandler(tb_GotFocus);
        tb.LostFocus += new EventHandler(tb_LostFocus);
    }

    private static void tb_GotFocus(object sender, EventArgs e)
    { …
Run Code Online (Sandbox Code Playgroud)

c# event-handling winforms

5
推荐指数
2
解决办法
5280
查看次数

在C#中清除或检查事件处理程序

我有一些C#代码可以更新对象的某些属性.我定义了一个事件处理程序,以帮助我在更新过程完成时做出响应.不幸的是,我已经了解到这个事件多次被解雇.我怀疑这种情况正在发生,因为事件处理程序正在错误的时间设置.目前,它的设置如下:

myObject.Update_Succeeded += new EventHandler(myObject_Update_Succeeded);
Run Code Online (Sandbox Code Playgroud)

由于代码的复杂性,我很难跟踪它应该设置的位置.我想只设置它之前没有设置的事件处理程序.因此,我想做这样的事情:

ClearEventHandlers(myObject);
Run Code Online (Sandbox Code Playgroud)

要么

myObject.Update_Succeeded = null;
myObject.Update_Succeeded += new EventHandler(myObject_Update_Succeeded);
Run Code Online (Sandbox Code Playgroud)

有没有办法完成我正在尝试的东西?

谢谢!

c#

3
推荐指数
1
解决办法
6558
查看次数

关闭WinForm时会激活Combox SelectedIndexChanged

我正在使用Combobox SelectedIndexChanged事件来执行一些任务.它工作得很好.但是当我关闭表单时,SelectedIndexChanged被触发,我得到"对象引用未设置为对象的实例".例外.我的代码如下 -

    private void cmbProductName_SelectedIndexChanged(object sender, EventArgs e)
    {
        try
        {
            Product p =(Product) cmbProductName.SelectedItem;

            RawItems = RawItem.GetEntityList(p.Id, ConnectionString);

        }
        catch (Exception ex)
        {
            CustomMessageBox.ShowSystemException(ex);
        }
    }
Run Code Online (Sandbox Code Playgroud)

如何避免在窗体关闭时触发SelectedIndexChanged事件?

谢谢SKPaul.

c#

3
推荐指数
2
解决办法
2267
查看次数

删除特定Control的所有EventHandler

我正在winForm中编写一个应用程序.我在from1中有一个面板,它有许多事件处理程序.当我处理panel1并创建新面板时,之前的事件存在并且它们会触发.为了删除panel1事件,我尝试了下面的代码.

panel1.Click -=  clickHandle_1 ; 
Run Code Online (Sandbox Code Playgroud)

但它并不适用于程序代码中的每一个地方.例如,在另一种方法中.当我创建新的panel1时,如何删除panel1的所有先前事件?

c# winforms

3
推荐指数
1
解决办法
6200
查看次数

如何从C#中的Action委托中删除方法

可能重复:
C#添加和删除匿名事件处理程序

假设我有一个以这种方式声明的Action委托:

public event Action<MenuTraverser.Actions> menuAction;
Run Code Online (Sandbox Code Playgroud)

我正在以这种方式关联一个方法:

menuInputController.menuAction += (MenuTraverser.Actions action) => this.traverser.OnMenuAction(action);
Run Code Online (Sandbox Code Playgroud)

现在,一切正常,但在某些情况下我需要删除委托方法,我不知道如何.我试过这种方式,但不起作用:

menuInputController.menuAction -= (MenuTraverser.Actions action) => this.traverser.OnMenuAction(action);
Run Code Online (Sandbox Code Playgroud)

我该怎么办?我需要我的方法OnMenuAction将不再被调用.

c# delegates action

2
推荐指数
1
解决办法
7822
查看次数

lambda表达式的事件

我需要有人帮我解决这个小问题.这是一段代码片段:

void shuffle() 
{
    for (int i = 0; i < 4; i++) {

        // here should be the computations of x and y

        buttons[i].Click += (s, e) => { show_coordinates(x, y); };

        // shuffling going on
    }
}

void show_coordinates(int x, int y)
{
    MessageBox.Show(x + " " + y);
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,每次运行循环时,我都会为每个按钮创建一个具有不同x和y的新事件处理程序.在我的表单中有另一个按钮,随机地按下按钮.

所以这就是问题所在:如果我按下随机按钮说10次,然后按任意洗牌按钮,事件处理程序就会叠加,我会得到10个显示x和y值的消息框.

那么每次按shuffle时,如何用新的事件处理程序覆盖前一个事件处理程序.

提前致谢.

c# lambda winforms

2
推荐指数
1
解决办法
145
查看次数

标签 统计

c# ×6

winforms ×3

action ×1

delegates ×1

event-handling ×1

events ×1

lambda ×1

vb.net ×1