1

对于我当前的项目,我正在向usercontrols : ucTask我的flowlayoutpanel : flpTasks

foreach (task t in tasks)
{
   ucTask uct = new ucTask();
   uct.id = t.task_id;
   uct.date= t.date.ToString();
   uct.btnNaam = t.task_id.ToString();

   uct.OnButtonclick += new EventHandler(uct_OnButtonclick);

   flpTasks.Controls.Add(uct);
}

uc任务

现在,我将在 flowlayoutpanel 中有几个这样的用户控件,并且我想在按下该按钮时触发一个事件。有了EventHandler我可以触发一个事件,但我需要为不同的按钮触发一个不同的事件。

    void uco_OnButtonclick(object sender, EventArgs e)
    {
        lblStatus.Text = "TEST";
    }

我不知道如何知道我按下了哪个按钮(或用户控件)。我没有想法,有什么建议吗?

谢谢,托马斯

4

2 回答 2

2

事件的发送者实际上是按钮之一。当您将 sender 转换为 Button 类型时,您可以访问任何 Buttons 属性并确定按下了哪个按钮:

void uco_OnButtonclick(object sender, EventArgs e)
{
   Button button = sender as Button;
   if (button == null)
       return;

   lblStatus.Text = button.Name;
}

更新:再次阅读您的问题后,我知道 ucTask 实际上是 UserControl,当单击其中的按钮时会引发事件。

所以,首先是命名。c# 中类名的良好风格是 PascalCase。例如,对于任务用户控制好名称将是TaskControl. 接下来是事件命名。通常将事件命名为EventName(-ing, -ed). 如果你想引发事件,那么好的风格就是受保护的方法OnEventName(-int, -ed)。还有一句话——当你编写用户控件时,你可以自由地使用商业术语来命名你的事件。例如TaskCreated、TaskChanged。您还可以通过创建自定义 EventArgs 将任何参数传递给您的事件。

因此,对于您的用户控制:

public class TaskChangedEventArgs : EventArgs
{
    public TaskChangedEventArgs(int taskId)
    {
        TaskId = taskId;
    }
    public int TaskId { get; private set; }
}

public class TaskControl : UserControl
{
   public event EventHandler<TaskChangedEventArgs> TaskChanged;

   // raise it inside button click event handler
   protected void OnTaskChanged(int taskId)
   {
       if (TaskChanged != null)
           TaskChanged(this, new TaskChangedEventArgs(taskId));
   }
}

当你使用你的用户控件时,只需订阅它的 TaskChanged 事件:

uct.TaskChanged += new EventHandler<TaskChangedEventArgs>(uct_TaskChanged);

您通过事件参数传递的所有参数都将在该事件处理程序中可用:

void uco_TaskChanged(object sender, TaskChangedEventArgs e)
{
    lblStatus.Text = e.TaskId.ToString();
}
于 2012-04-04T13:51:38.440 回答
2

那么,发送者应该是用户控制权吧?然后您可以通过 投射和确定项目ucTask.id

void uco_OnButtonclick(object sender, EventArgs e)
{
    ucTask uc = sender as ucTask;
    lblStatus.Text = uc.id.ToString();
}

这假定用户控件的OnButtonclick事件发送对用户控件的引用,而不是对按下按钮的引用作为事件的发送者。

于 2012-04-04T13:52:11.010 回答