1

好的,所以我构建了一个处理所见即所得编辑的自定义控件。基本上在 1 个控件上,我有多个所见即所得编辑器的实例。所以一个可能是为了编辑,比方说,一个食谱。另一个可能是该食谱的注释。

我的所见即所得编辑器上有一个按钮,该按钮使用一个界面来对同时包含它们的控件进行回调,所以我知道我的父控件何时单击该按钮。如何找出哪个控件触发了回调?

例子

主表格

public partial class MyCustomControl: RecipeControl.ISavedButton {

    private void SaveButton_Clicked(){
        //Do Work but how do I find out which control fired this event?
        //Was it RecipeControl1 or RecipeControl2
    }

}

我的解决方案

在我的食谱控制上,我这样做了。

private void RecipeSaveButton_Clicked(object sender, EventArgs e){
    if (RecipeSaveButtonListener != null) {
        RecipeSaveButtonListener.RecipeSaveButton_Clicked(this, EventArgs.Empty); //This referring to the control, not the button.
    }
}

在我的主要控制上,我这样做了。

private void RecipeSaveButton_Clicked(object sender, EventArgs e){
    if (sender == RecipeControl1){ 

    } else if (sender == RecipeControl2) { 

    }
}

我已经实现了这两个答案,并且都非常非常好。对不起,我不能接受他们两个。

4

2 回答 2

2

大多数事件处理程序(如按钮单击)都使用标准界面构建,以告诉您谁执行了该操作。RecipeControl's为Button Click 事件获取“事件处理程序”的修改版本:

 private void SaveButton_Clicked(object sender, EventArgs e){
        //Do Work but how do I find out which control fired this event?
        RecipeControl ctl = sender as RecipeControl;
    }

因此,当在您的 中单击一个按钮时RecipeControl,它应该触发一个事件,例如:

this.SaveButtonClick(this, EventArgs.Empty);
于 2012-05-08T17:24:34.470 回答
2

按照设计,所有事件处理程序都接收两个参数:

  • 对象发送者:指引发事件的对象
  • EventArgs e:EventArgs 或派生自 EventArgs 的专用类,具体取决于事件类型

通常,不同的事件处理程序附加到单个控件,因此您不必担心发送者。但是,在您的情况下,您似乎对所有控件使用相同的处理程序。在这种情况下,您必须根据发件人做出不同的事情。

为此,您需要检查发件人是否是您感兴趣的人,像这样(我假设按钮名称是 Button1)

public ButtonClick(object sender, EventArgs e)
{
    if (sender== RecipeControl1.Button1)
    {
    }
    else if (sender == RecipeControl2.Button1)
    {
    }
}
于 2012-05-08T17:35:40.657 回答