对于我当前的项目,我向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);
}
现在我将在flowlayoutpanel中有几个这样的用户控件,我想在按下该按钮时触发一个事件。使用EventHandler
我可以触发一个事件,但我需要为另一个按钮触发不同的事件。
void uco_OnButtonclick(object sender, EventArgs e)
{
lblStatus.Text = "TEST";
}
我不知道如何知道我按下了哪个按钮(或用户控件)。而且我的想法,任何建议都没有?
谢谢, 托马斯
答案 0 :(得分:2)
事件的发件人实际上是按钮之一。将发送者强制转换为按钮类型时,可以访问任何按钮属性并确定按下了哪个按钮:
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();
}
答案 1 :(得分:2)
那么,发件人应该是用户控制权吗?然后,您可以通过ucTask.id
投射和确定项目。
void uco_OnButtonclick(object sender, EventArgs e)
{
ucTask uc = sender as ucTask;
lblStatus.Text = uc.id.ToString();
}
这假设用户控件的OnButtonclick
事件发送对用户控件的引用,而不是对作为事件发送者的按下按钮的引用。