问题:我有一个包含对象列表的文档类.这些对象引发事件,如SolutionExpired,DisplayExpired等文件需要对此作出回应.
文档有时可以交换对象,但是单个对象永远不应该是多个文档的"一部分".
我的文档类包含许多用作事件处理程序的方法.每当一个对象进入文档时,我就会AddHandler用来设置事件,每当从文档中删除一个对象时,我就会RemoveHandler用来撤消损坏.但是,有些情况下很难确保所有步骤都得到适当的处理,因此我最终可能会遇到流氓事件处理程序.
长话短说; 如何删除指向特定方法的所有处理程序?注意,我没有可能的事件源列表,这些可以存储在任何地方.
就像是:
RemoveHandler *.SolutionExpired, AddressOf DefObj_SolutionExpired
Run Code Online (Sandbox Code Playgroud) 我读过这个答案.它只是告诉我如何从按钮控件中删除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#代码可以更新对象的某些属性.我定义了一个事件处理程序,以帮助我在更新过程完成时做出响应.不幸的是,我已经了解到这个事件多次被解雇.我怀疑这种情况正在发生,因为事件处理程序正在错误的时间设置.目前,它的设置如下:
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)
有没有办法完成我正在尝试的东西?
谢谢!
我正在使用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.
我正在winForm中编写一个应用程序.我在from1中有一个面板,它有许多事件处理程序.当我处理panel1并创建新面板时,之前的事件存在并且它们会触发.为了删除panel1事件,我尝试了下面的代码.
panel1.Click -= clickHandle_1 ;
Run Code Online (Sandbox Code Playgroud)
但它并不适用于程序代码中的每一个地方.例如,在另一种方法中.当我创建新的panel1时,如何删除panel1的所有先前事件?
可能重复:
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将不再被调用.
我需要有人帮我解决这个小问题.这是一段代码片段:
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时,如何用新的事件处理程序覆盖前一个事件处理程序.
提前致谢.